有没有一种方法可以选择不直接引用其名称的表?

时间:2019-10-24 17:02:26

标签: excel vba

我试图建立一个宏,该宏循环遍历工作簿中的所有工作表并更新它们上的表。所有工作表都是同一模板的副本,因此在创建新工作表时,表名仅增加了一个(表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'对象

2 个答案:

答案 0 :(得分:0)

您缺少Option Explicit(请参阅工具/选项,并选中“需要变量声明”框)并使用未声明的变量。如果tbl被声明为ListObject,您会在这行上询问类型不匹配错误:

Set tbl = ActiveSheets.ListObjects

..并且您不会遇到“需要对象”错误,因为编译器会告诉您ActiveSheets不存在。由于ActiveSheets是一个Variant/Empty,其中不包含或未引用任何内容,因此引发了该错误:它只是一个空的,未声明的变量,但是一个.ListObjects成员调用会 require < / em>它是具有有效引用的对象-因此,是“必需的对象”。

您可能想要ActiveSheet,但是您更可能想要一张特定的纸。无论如何,您都不想针对它进行成员调用,因为ActiveSheetVariant/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