如何放入传递表名称,以便宏不局限于一个工作表?

问题描述 投票:0回答:2

我正在尝试整理一个工作表,如果我单击顶部的按钮,它就会传递我的条件格式,并插入新行。但是,我在代码中输入表名称,因此如果我尝试复制工作表或尝试在另一张工作表上运行宏,它就会中断。

我将代码放在 ** 中,围绕我正在考虑的更改,但是我不知道如何在 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.
excel vba excel-2016 excel-tables listobject
2个回答
0
投票

我认为您实际上不能在 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 的列不包括标题和总行数。


0
投票

修改表格

  • 将代码复制到standard模块中(例如
    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
© www.soinside.com 2019 - 2024. All rights reserved.