我想创建一个循环,只在不同的工作表中格式化列表中的表,而不是编写每个特定的工作表来格式化特定的表。
当前代码:(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“:下标超出范围”。我知道它与第二个循环有关,我以前从未这样做过,所以不确定如何修复它。
这是修复代码的一种方法:
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)。
如果您有其他表,请使用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