VBA中对特定行和列范围的结构化引用

时间:2018-09-08 07:41:39

标签: excel excel-vba

我试图遍历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 :(得分:2)

只有在相关的@内的单元格中输入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

请注意,您don't have to select anything

答案 1 :(得分:1)

这可能不是最优雅的方法,但是很少处理结构化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