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

时间:2019-05-01 14:50:07

标签: excel vba loops worksheet

我不想在每个工作表上都进行编码以格式化特定表,而是希望创建一个循环,仅在不同工作表上对列表中的表进行格式化。

当前代码:(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”:下标超出范围“。 我知道它与第二个循环有关,我之前从未做过,所以不确定如何解决。

2 个答案:

答案 0 :(得分: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 Each sh In wbTemplate.Worksheets
    For Each tbl In sh.ListObjects
        tbl.DataBodyRange.Font.Size = 10
    Next
Next sh

答案 1 :(得分: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