首页 > 解决方案 > 如何输入通过表名的传递,以便宏不受一个工作表的限制?

问题描述

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

我将代码放在 ** 中围绕我正在考虑的更改,但是我不知道如何在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.

标签: excelvbaexcel-2016

解决方案


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


推荐阅读