我正在尝试整理一个工作表,如果我单击顶部的按钮,它就会传递我的条件格式,并插入新行。但是,我在代码中输入表名称,因此如果我尝试复制工作表或尝试在另一张工作表上运行宏,它就会中断。
我将代码放在 ** 中,围绕我正在考虑的更改,但是我不知道如何在 Set 行上传递它。
请帮忙!!
示例:
Dim ws As Worksheet
**Dim tbl As ListObject**
Set ws = ActiveSheet
**Set tbl = ws.ListObjects(1)** <-- This lets me get the table name if this worksheet is copied.
Dim rng As Range
Set rng = ws.[TableName[ColumnName]]
**Set rng = ws.[tbl[ColumnName]]** <- If I do this it Breaks.
我认为您实际上不能在 VBA 中使用结构化引用。至少,我的努力一直失败。因此我使用如下所示的代码。
Private Sub Test1()
Dim Ws As Worksheet
Dim Rng As Range
Dim Tbl As ListObject
Set Ws = ActiveSheet
Set Tbl = Ws.ListObjects(1)
Set Rng = Tbl.ListColumns("Pair").Range
Debug.Print Rng.Address
End Sub
Private Sub Test2()
Dim Ws As Worksheet
Dim Rng As Range
Dim Tbl As ListObject
Set Ws = ActiveSheet
Set Tbl = Ws.ListObjects(1)
Set Rng = Tbl.DataBodyRange.Columns(2)
Debug.Print Rng.Address
End Sub
在第一个示例中,您可以使用列名称 - 如果您愿意,可以将实际名称替换为字符串数据类型的变量 - 但您可以获得 ListColumn 的范围。第二个示例使用索引号来标识列,但您获得的 DataBodyRange 的列不包括标题和总行数。
Module1
)。const
蚂蚁以满足您的需求。它有什么作用?
Name
”列中,它为
字体为红色 (3
)。ListColumn
和 ListRow
的一些属性值
Visual Basic 编辑器的立即窗口 CTRL+G Alt+F11 (VBE) 中的对象。特点
ListRow
和 ListColumn
对象,您想将它们“转移”到“正常”范围对象并且
然后应用一些更改。ListColumns
DataBodyRange 的使用方式与 Range 不同
ListRows
。j
而不是通常的i
用于突出显示我们正在循环遍历行的列。代码
Option Explicit
Sub modifyTable()
Const TableNameOrIndex As Variant = 1
Const ColumnID As Variant = "Name" ' or use e.g. 3 for the third column.
Dim ws As Worksheet: Set ws = ActiveSheet
Dim tbl As ListObject: Set tbl = ws.ListObjects(1)
' Columns
Debug.Print String(20, "'")
Dim lCol As ListColumn: Set lCol = tbl.ListColumns(ColumnID)
With lCol
Debug.Print .Name ' Header Title
Debug.Print .DataBodyRange.Address ' Range Address
Debug.Print .Index ' Index
Debug.Print .Parent.Name ' TableName
End With
' !!! The following block will modify your table !!!
Debug.Print String(20, "'")
Dim rngCol As Range: Set rngCol = lCol.DataBodyRange
With rngCol
' e.g.
.Font.ColorIndex = 3
End With
' Rows
Debug.Print String(20, "'")
Dim lRow As ListRow: Set lRow = tbl.ListRows(3)
With lRow
Debug.Print .Range.Address ' Range Address
Debug.Print .Index ' Index
Debug.Print .Parent.Name ' TableName
End With
' !!! The following block will modify your table !!!
' To add a new row:
Set lRow = tbl.ListRows.Add
Dim rngRow As Range: Set rngRow = lRow.Range
With rngRow
' e.g.
Dim j As Long
For j = 1 To .Columns.Count
.Cells(j).Value = j
Next j
End With
End Sub