Вам не хватает 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