Получить диапазон (или значения) столбца таблицы Excel VBA - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь получить диапазон ячеек второго столбца таблицы в Excel, используя код VBA, и автоматически обновлять этот диапазон, если в таблице появляются новые записи каждый раз, когда пользовательская форма инициализируется. Сначала я думал, что это будет легко, но сейчас я полностью потерян и не могу понять, как заставить мой код работать. Возможно, я чего-то упускаю.

Я искал на этом форуме и нашел два возможных решения, первое из них:

Sub test()
    Dim table As ListObject
    Set table = ActiveSheet.ListObjects("Table1")
    Debug.Print table.ListColumns(2).Range.Rows.Count
End Sub

Этот код вроде работает. Он успешно распознает Table1 со всеми новыми строками каждый раз, когда я запускаю его. Проблема в том, что он идентифицирует всю таблицу, я просто хочу получить диапазон одного столбца. Независимо от того, что я делаю, переменная table всегда получает диапазон всей таблицы.

Я нашел второй подход следующим образом:

Sub test()
    Dim tbl as ListObject
    Dim rng as Range
    Set tbl = ActiveSheet.ListObjects("Table1")
    Set rng = tbl.ListColumns(2).DataBodyRange
End Sub

Этот код тоже вроде работает, но только если таблица содержит одну строку данных. Если в моей таблице только одна строка данных, переменная rng идентифицирует таблицу и строку без проблем. Однако значением переменной является значение ячейки, например «Образец текста», а не диапазон ячеек. И если я попытаюсь добавить еще строки, переменная rng останется пустой.

Я был бы очень признателен за любые указания с этим. Следует также отметить, что я хочу получить диапазон столбца, который принадлежит указанной таблице, даже при активном использовании другого листа, например C3:C5. И когда вводятся дополнительные данные для получения обновленного диапазона, например C3:C80. Я не хочу выбирать диапазон, просто получить эту информацию и использовать ее для других целей.

1 Ответ

0 голосов
/ 02 февраля 2020

Ваш код уже возвращает все данные для указанного столбца. Вы можете увидеть это, добавив в свой Sub (после Set rng = ...), и посмотреть на вывод в Immediate Window

Sub test()
    Dim tbl as ListObject
    Dim rng as Range
    Set tbl = ActiveSheet.ListObjects("Table1")
    Set rng = tbl.ListColumns(2).DataBodyRange

    Debug.Print rng.Address
    Dim cl As Range
    For Each cl In rng
        Debug.Print cl.Address, cl.Value
    Next
End Sub

Что касается вашего второго вопроса, измените

Set tbl = ActiveSheet.ListObjects("Table1")

на

Set tbl = ActiveWorkbook.Worksheets("NameOfTableSheet").ListObjects("Table1")

Возможно, вы также захотите указать заданную c книгу.

Set tbl = Workbooks("NameOfWorkbook").Worksheets("NameOfTableSheet").ListObjects("Table1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...