尝试遍历工作表并在其中格式化特定表

问题描述 投票:0回答:2

我想创建一个循环,只在不同的工作表中格式化列表中的表,而不是编写每个特定的工作表来格式化特定的表。

当前代码:(sh和wbTemplate在代码中定义并设置)

Dim AllTableNames As String
Dim TableNames As Variant
Dim i As Long

    AllTableNames = "Table_Dormant_Stock,Table_Overstock,Table_Negative_Stock,Table_Outdated_Stock_Counts,Table_Waste_Returns"
    TableNames = Split(AllTableNames, ",")

    For Each sh In wbTemplate.Worksheets
        For i = LBound(TableNames) To UBound(TableNames)
           sh.ListObjects(TableNames(i)).DataBodyRange.Font.Size = 10
        Next i
    Next sh

我得到“运行时错误”9“:下标超出范围”。我知道它与第二个循环有关,我以前从未这样做过,所以不确定如何修复它。

excel vba loops worksheet
2个回答
2
投票

这是修复代码的一种方法:

For Each sh In wbTemplate.Worksheets
    For i = LBound(TableNames) To UBound(TableNames)

        For Each tbl In sh.ListObjects
            If tbl.Name = TableNames(i) Then
                tbl.DataBodyRange.Font.Size = 10
            End If
        Next tbl

    Next i
Next sh

所以我使用你的代码循环遍历每个工作表和数组中的每个表名 - 但是然后我们检查表tbl上的每个表(sh),如果名称与你正在查找的名称匹配,而不是运行代码for,然后代码运行。


如果要刷新每个工作表上的任何和所有表,那么这很简单:

For Each sh In wbTemplate.Worksheets
    For Each tbl In sh.ListObjects
        tbl.DataBodyRange.Font.Size = 10
    Next
Next sh

1
投票

如果每张表上只有一个表,则可以完全省去第二个循环和名称数组,只使用集合的索引(1)。

如果您有其他表,请使用CLR的方法。

Sub x()

Dim wbTemplate As Workbook
Dim sh As Worksheet

For Each sh In wbTemplate.Worksheets
    sh.ListObjects(1).DataBodyRange.Font.Size = 10
Next sh

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.