我如何输入通过 Table 的名称以便宏不受限于一个工作表?
How do I Put in a pass through Table name so the Macro isn't bounded to the one worksheet?
我正在尝试整理一个作品sheet,如果我点击顶部的按钮,它会传递我的条件格式,并插入一个新行。但是我在代码中输入了 Table 名称,所以如果我尝试复制作品 sheet 或尝试 运行 另一个 sheet 上的宏,它会中断。
我将代码放在 ** 中,围绕着我正在考虑的更改,但是我不知道如何在 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 列不包括 header 和总行数。
修改Table
- 将代码复制到标准模块(例如
Module1
)。
- 调整两个
const
蚂蚁以满足您的需要。
- 最好与每个 sheet 上的按钮一起使用,第一个 相同 table。
它有什么作用?
- 在第一个 table 作品sheet 的“
Name
”列中,它为
字体为红色 (3
).
- 然后它向 table 添加一个新行并向每个单元格写入一个数字。
- 此外,它还显示了
ListColumn
和 ListRow
的一些 属性 值
Visual Basic 编辑器 Alt+[ 的即时 window CTRL+G 中的对象=47=]F11 (VBE).
特征
ListRow
和 ListColumn
的选项集有限
对象,你想 'transfer' 它们到 'normal' 范围对象和
然后应用一些更改。
- For
ListColumns
DataBodyRange 不同于 Range for
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
我正在尝试整理一个作品sheet,如果我点击顶部的按钮,它会传递我的条件格式,并插入一个新行。但是我在代码中输入了 Table 名称,所以如果我尝试复制作品 sheet 或尝试 运行 另一个 sheet 上的宏,它会中断。
我将代码放在 ** 中,围绕着我正在考虑的更改,但是我不知道如何在 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 列不包括 header 和总行数。
修改Table
- 将代码复制到标准模块(例如
Module1
)。 - 调整两个
const
蚂蚁以满足您的需要。 - 最好与每个 sheet 上的按钮一起使用,第一个 相同 table。
它有什么作用?
- 在第一个 table 作品sheet 的“
Name
”列中,它为 字体为红色 (3
). - 然后它向 table 添加一个新行并向每个单元格写入一个数字。
- 此外,它还显示了
ListColumn
和ListRow
的一些 属性 值 Visual Basic 编辑器 Alt+[ 的即时 window CTRL+G 中的对象=47=]F11 (VBE).
特征
ListRow
和ListColumn
的选项集有限 对象,你想 'transfer' 它们到 'normal' 范围对象和 然后应用一些更改。- For
ListColumns
DataBodyRange 不同于 Range forListRows
. 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