Есть ли способ выбрать таблицу без прямой ссылки на ее имя? - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь настроить макрос, который проходит по всем листам в рабочей книге и обновляет таблицы на них. Все листы являются копиями одного и того же шаблона, поэтому при создании новых листов имя таблицы просто увеличивается на единицу (Table3, Table4, Table5 ...). Я не уверен, как настроить его в цикле For, чтобыпройти каждую строку таблицы без прямой ссылки

For Each Sheet in Workbook
    Set tbl = ActiveSheets.ListObjects
    For i = 13 To tbl.ListRows.Count
        ' Code to refresh

Не уверен, что ставить после ListObjects, чтобы он попадал в таблицу. Это в настоящее время дает ошибку, заявляющую Ошибка времени выполнения '424' Требуется объект

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Попробуйте с этим:

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
0 голосов
/ 24 октября 2019

Вам не хватает Option Explicit (см. Инструменты / опции и установите флажок «требовать объявления переменной») и используйте необъявленные переменные. Вы бы спросили об ошибке несоответствия типов в этой строке, если бы tbl было объявлено ListObject:

Set tbl = ActiveSheets.ListObjects

.. и вы бы нене было ошибки «требуется объект», потому что компилятор сказал бы, что ActiveSheets не существует. Эта ошибка возникает из-за того, что ActiveSheets является Variant/Empty, который не содержит и не ссылается на что-либо: это просто пустая необъявленная переменная, но для вызова .ListObjects члена потребуется , чтобы он былобъект с действительной ссылкой - следовательно, «объект требуется».

Вы хотите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...