我不想在每个工作表上都进行编码以格式化特定表,而是希望创建一个循环,仅在不同工作表上对列表中的表进行格式化。
当前代码:(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”:下标超出范围“。 我知道它与第二个循环有关,我之前从未做过,所以不确定如何解决。
答案 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