我正在尝试将工作表放在一起,如果我单击顶部的按钮,它会传递我的条件格式,并插入新行。但是,我通过代码中的表名称输入,因此如果我尝试复制工作表或尝试在另一张工作表上运行宏,它会中断。
我将代码放在我正在考虑的更改周围的**中,但是我无法在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
的一些属性值 对象在可视化基本编辑器Alt+F11(VBE( 的即时窗口CTRL+G中。
特征
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