Создайте ListObject, передав имя таблицы, расположенной в любом месте рабочей книги, с переменной - PullRequest
0 голосов
/ 03 ноября 2018

Вот мой сценарий использования VBA в Excel. У меня есть одна таблица (table01), которая содержит имена всех таблиц в книге. Я пытаюсь обратиться к одной из таблиц в Table01, используя ListObjects (), чтобы я мог выполнять операции с этой таблицей. Я получаю ошибку отладки № 9 в строке, указанной ниже. Что я делаю не так в строке ошибки?

Вот мой упрощенный код:


Dim Table01 as ListObject 'list of all tables in workbook 
Dim Table02 as ListObject 'table selected from Table01 
Dim TableName as String 'name of table02 as listed in Table01 
Set Table01 = ActiveSheet.ListObjects("tTablesDetails")
TableName = Table01.TableList.DataBodyRange(SomRowNumber, SomeColumnNumber).Text

MsgBox (TableName) 'Shows table name I expected       
Set Table02 = ActiveSheet.ListObjects(TableName) 
'DEBUG ERROR 9 IS HERE

...rest of code

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Мне удалось создать диапазоны, заставить его работать и очистить мой код, например:

Dim Table02 As Range

Установить Table02 = Range (TableName) .ListObject.DataBodyRanege

Диапазону все равно, на каком листе находится стол.

0 голосов
/ 03 ноября 2018

Я не знаю, что такое .TableList. Это не метод / свойство ListObject AFAIK. Вам определенно нужно объявить значения для someRowNumber, someColumnNumber, поскольку в диапазоне нет 0,0. В приведенном ниже примере предполагается, что выбранная таблица находится на том же листе, что и Таблица01. Вам может понадобиться другой столбец для хранения родительского листа, если вы хотите сослаться на таблицы на других листах и ​​перенести их в (или зациклить все объекты ListObject в книге и проверить по имени; при условии, что имена не повторяются), поэтому у вас есть

Set Table02 = Worksheets("someSheetNamePulledFromTable01").ListObjects(TableName)

VBA:

Option Explicit

Public Sub test()

    Dim Table01 As ListObject                    'list of all tables in workbook
    Dim Table02 As ListObject                    'table selected from Table01
    Dim TableName As String                      'name of table02 as listed in Table01
    Dim someRowNumber As Long, someColumnNumber As Long
    someRowNumber = 1: someColumnNumber = 1
    Set Table01 = ActiveSheet.ListObjects("tTablesDetails")
    TableName = Table01.DataBodyRange(someRowNumber, someColumnNumber).Text

    MsgBox (TableName)                           'shows table name i expected

    Set Table02 = ActiveSheet.ListObjects(TableName) 'DEBUG ERROR 9 IS HERE

End Sub

Избегайте использования Activesheet вообще и везде используйте явные имена рабочих листов. Возможно, укажите имя родительского листа ListObject в следующем столбце справа:

Option Explicit

Public Sub test()

    Dim Table01 As ListObject
    Dim Table02 As ListObject
    Dim TableName As String, SheetName As String
    Dim someRowNumber As Long, someColumnNumber As Long
    someRowNumber = 1: someColumnNumber = 1
    Set Table01 = ThisWorkbook.Worksheets("Sheet1").ListObjects("tTablesDetails") '<=avoid Activesheet reference and use explicit sheet name
    TableName = Table01.DataBodyRange(someRowNumber, someColumnNumber).Text
    SheetName = Table01.DataBodyRange(someRowNumber, someColumnNumber + 1).Text

    MsgBox (TableName)                           'shows table name i expected

    Set Table02 = ThisWorkbook.Worksheets(SheetName).ListObjects(TableName)

End Sub
...