我试图遍历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)。我在做什么错了?
任何建议都值得赞赏。
答案 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
答案 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
。