Структурированная ссылка в VBA на конкретную строку и диапазон столбцов - PullRequest
0 голосов
/ 08 сентября 2018

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

Set tbl = ActiveSheet.ListObjects("MasterBudget")
For r = 1 To tbl.ListRows.Count
    If tbl.ListRows(r).Range.RowHeight <> 0 Then 'not hidden/filtered
        tbl.ListColumns("Item description").DataBodyRange(r).Select                   
        Range("[@[Item description]:[Unit 3]]").Select '<-- problem line                   
    End If
Next r

Это подходит к нужному элементу, но я по какой-то причине не могу понять, как выбрать этот конкретный набор столбцов (от описания элемента до блока 3). Что я делаю не так?

Любые предложения высоко ценятся.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Запись @ имеет смысл только при вводе в ячейку, которая находится внутри рассматриваемого ListObject.

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

Dim tbl As ListObject
Dim ColumnsOfInterest As Range
Dim r As Long

Set tbl = ActiveSheet.ListObjects("MasterBudget")
Set ColumnsOfInterest = tbl.DataBodyRange.Worksheet.Range(tbl.ListColumns("Item description").Range, tbl.ListColumns("Unit 3").Range)

For r = 1 To tbl.ListRows.Count
    If tbl.ListRows(r).Range.RowHeight <> 0 Then 'not hidden/filtered
        Dim RangeToCopy As Range
        Set RangeToCopy = Application.Intersect(tbl.ListRows(r).Range, ColumnsOfInterest)

        RangeToCopy.Copy ...
    End If
Next r

Обратите внимание, что вам не нужно select ничего .

0 голосов
/ 08 сентября 2018

Это, вероятно, не самый элегантный, но редко имеют дело со структурированными ссылками на таблицы ListObject.

Dim tbl As Object, r As Long

Set tbl = ActiveSheet.ListObjects("MasterBudget")

For r = 1 To tbl.ListRows.Count
    If tbl.ListRows(r).Range.RowHeight <> 0 Then 'not hidden/filtered
        tbl.ListColumns("Item description").DataBodyRange(r).Select
        ActiveSheet.Range(tbl.ListColumns("Item description").DataBodyRange(r), _
                          tbl.ListColumns("Unit 3").DataBodyRange(r)).Select
    End If
Next r

Вы также можете использовать tbl.parent вместо ActiveSheet.

...