我试图建立一个宏,该宏循环遍历工作簿中的所有工作表并更新它们上的表。所有工作表都是同一模板的副本,因此在创建新工作表时,表名仅增加了一个(表3,表4,表5 ...)。我不确定如何在For
中进行设置循环以遍历表的每一行而无需直接引用
For Each Sheet in Workbook
Set tbl = ActiveSheets.ListObjects
For i = 13 To tbl.ListRows.Count
' Code to refresh
不确定要放在ListObjects
之后的内容,以便它进入表格。当前,这会给出错误,指出需要运行时错误'424'对象
答案 0 :(得分:0)
您缺少Option Explicit
(请参阅工具/选项,并选中“需要变量声明”框)并使用未声明的变量。如果tbl
被声明为ListObject
,您会在这行上询问类型不匹配错误:
Set tbl = ActiveSheets.ListObjects
..并且您不会遇到“需要对象”错误,因为编译器会告诉您ActiveSheets
不存在。由于ActiveSheets
是一个Variant/Empty
,其中不包含或未引用任何内容,因此引发了该错误:它只是一个空的,未声明的变量,但是一个.ListObjects
成员调用会 require < / em>它是具有有效引用的对象-因此,是“必需的对象”。
您可能想要ActiveSheet
,但是您更可能想要一张特定的纸。无论如何,您都不想针对它进行成员调用,因为ActiveSheet
是Variant/Object
,这意味着针对它进行的任何成员调用都是后期绑定的,只能在运行时解决:您想让编译器在这里完成工作,并在出现问题之前,在代码运行之前告诉您。
ListRows
是一个属性,它产生一个对象集合(就像ListObjects
一样),其中包含ListRow
个对象:您不想使用For
循环进行迭代那些。最好使用For Each
循环来迭代对象集合:
Dim sheet As Worksheet
Set sheet = ActiveSheet '<~ todo: change to the specific sheet you want to work with
Dim table As ListObject
For Each table In sheet.ListObjects
Dim currentRow As ListRow
For Each currentRow In table.ListRows
'...
Next
Next
答案 1 :(得分:-1)
尝试一下:
Dim sheet, tbl, obj
For Each sheet In ActiveWorkbook.Sheets ' or ThisWorkbook.Sheets
Set tbl = sheet.ListObjects
For i = 13 To tbl.Count
'or
For Each obj In tbl