我如何输入通过 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 添加一个新行并向每个单元格写入一个数字。
  • 此外,它还显示了 ListColumnListRow 的一些 属性 值 Visual Basic 编辑器 Alt+[ 的即时 window CTRL+G 中的对象=47=]F11 (VBE).

特征

  • ListRowListColumn 的选项集有限 对象,你想 '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