Vba 如何从范围变量中获取表名?

Vba 如何从范围变量中获取表名?,vba,excel,range,Vba,Excel,Range,我调暗了变量: Dim mainTableRange As Range 然后给它一个值: Set mainTableRange = Range("tLedgerData") ' tLedgerData is an Excel table. 现在,我试图从变量中获取表名(即“tLedgerData”),以引用该表中的列,即使表名发生更改 我试过了 mainTableRange.Name 及 (请参阅。)两者都引发了运行时错误“1004”:应用程序定义的错误或对象定义的错误 mainTable

我调暗了变量:

Dim mainTableRange As Range
然后给它一个值:

Set mainTableRange = Range("tLedgerData") ' tLedgerData is an Excel table.
现在,我试图从变量中获取表名(即“tLedgerData”),以引用该表中的列,即使表名发生更改

我试过了

mainTableRange.Name

(请参阅。)两者都引发了运行时错误“1004”:应用程序定义的错误或对象定义的错误


mainTableRange。选择
选择除标题和总行之外的所有表格数据。

我认为您在这里遇到了一个X-Y问题:解决问题Y时解决问题X

[…]引用该表中的列,即使表名发生更改

将表/
ListObject
单独放在自己的专用工作表上,并为工作表指定一个
代码名
。这样您就可以做到:

Dim tbl As ListObject
Set tbl = LedgerDataSheet.ListObjects(1)
现在您拥有了
ListObject
API的强大功能,可以做任何您想做的事情。例如,检索列名:

Dim i As Long
For i = 1 To tbl.ListColumns.Count
    Debug.Print tbl.ListColumns(i).Name
Next

换句话说,您不需要关心表的名称。您需要的是使用它的
列表对象
。而且,由于您不需要按名称引用它,因此表的名称完全不相关,用户可以一时兴起对其进行更改,您的代码甚至不会注意到。

我认为您在这里遇到了一个X-Y问题:当解决问题Y时解决问题X

[…]引用该表中的列,即使表名发生更改

将表/
ListObject
单独放在自己的专用工作表上,并为工作表指定一个
代码名
。这样您就可以做到:

Dim tbl As ListObject
Set tbl = LedgerDataSheet.ListObjects(1)
现在您拥有了
ListObject
API的强大功能,可以做任何您想做的事情。例如,检索列名:

Dim i As Long
For i = 1 To tbl.ListColumns.Count
    Debug.Print tbl.ListColumns(i).Name
Next

换句话说,您不需要关心表的名称。您需要的是使用它的
列表对象
。而且,由于您不需要按名称引用它,因此表的名称完全不相关,用户可以一时兴起对其进行更改,您的代码甚至不会注意到。

我认为Excel表和命名范围是两件不同的事情,这就是.name.name不起作用的原因。表是一个ListObject,一旦您将一个范围设置为一个表,您应该能够继续调用该范围而不会出错

好奇的是,您的表可能会意外更改的原因是什么

我写了几行代码来展示一些东西。在表名更改后,可以创建表并重用范围变量。您还可以使用一些标识字符串为表设置AlternativeText,并在怀疑表名可能更改时使用该字符串定位特定表

Option Explicit
Public TestTable As Range
Sub CreateTable()
    ActiveSheet.ListObjects.Add(xlSrcRange, [$A$1:$C$4], , xlYes).name = "Table1"
    ActiveSheet.ListObjects("Table1").AlternativeText = "Table1"
End Sub
Sub SetTableRange()
    Set TestTable = Range("Table1")
End Sub
Sub SelectTable()
    TestTable.Select
End Sub
Sub RenameTable()
    ActiveSheet.ListObjects("Table1").name = "Table2"
    [A1].Select
End Sub
Sub SelectRenamedTable()
    TestTable.Select
End Sub
Sub ClearSelection()
    [A1].Select
End Sub
Sub FindTable1()
    Dim obje As ListObject
    For Each obje In ActiveSheet.ListObjects
        If obje.AlternativeText = "Table1" Then
        MsgBox "Found " & obje.AlternativeText & ". Its current name is: " & obje.name
        End If
    Next obje
End Sub
Sub ConvertTablesToRanges()
    ' I found this snippet in a forum post on mrexcel.com by pgc01 and modified
    Dim rList As Range
    On Error Resume Next
    With ActiveSheet.ListObjects("Table1")
        Set rList = .Range
        .Unlist                           ' convert the table back to a range
    End With
    With ActiveSheet.ListObjects("Table2")
        Set rList = .Range
        .Unlist                           ' convert the table back to a range
    End With
    On Error GoTo 0
    With rList
        .Interior.ColorIndex = xlColorIndexNone
        .Font.ColorIndex = xlColorIndexAutomatic
        .Borders.LineStyle = xlLineStyleNone
    End With
End Sub

我相信Excel表和命名范围是两个不同的东西,这就是.name.name不起作用的原因。表是一个ListObject,一旦您将一个范围设置为一个表,您应该能够继续调用该范围而不会出错

好奇的是,您的表可能会意外更改的原因是什么

我写了几行代码来展示一些东西。在表名更改后,可以创建表并重用范围变量。您还可以使用一些标识字符串为表设置AlternativeText,并在怀疑表名可能更改时使用该字符串定位特定表

Option Explicit
Public TestTable As Range
Sub CreateTable()
    ActiveSheet.ListObjects.Add(xlSrcRange, [$A$1:$C$4], , xlYes).name = "Table1"
    ActiveSheet.ListObjects("Table1").AlternativeText = "Table1"
End Sub
Sub SetTableRange()
    Set TestTable = Range("Table1")
End Sub
Sub SelectTable()
    TestTable.Select
End Sub
Sub RenameTable()
    ActiveSheet.ListObjects("Table1").name = "Table2"
    [A1].Select
End Sub
Sub SelectRenamedTable()
    TestTable.Select
End Sub
Sub ClearSelection()
    [A1].Select
End Sub
Sub FindTable1()
    Dim obje As ListObject
    For Each obje In ActiveSheet.ListObjects
        If obje.AlternativeText = "Table1" Then
        MsgBox "Found " & obje.AlternativeText & ". Its current name is: " & obje.name
        End If
    Next obje
End Sub
Sub ConvertTablesToRanges()
    ' I found this snippet in a forum post on mrexcel.com by pgc01 and modified
    Dim rList As Range
    On Error Resume Next
    With ActiveSheet.ListObjects("Table1")
        Set rList = .Range
        .Unlist                           ' convert the table back to a range
    End With
    With ActiveSheet.ListObjects("Table2")
        Set rList = .Range
        .Unlist                           ' convert the table back to a range
    End With
    On Error GoTo 0
    With rList
        .Interior.ColorIndex = xlColorIndexNone
        .Font.ColorIndex = xlColorIndexAutomatic
        .Borders.LineStyle = xlLineStyleNone
    End With
End Sub

[…]即使表名更改,也要引用该表中的列-等等,如果表名更改,
Range(“tLedgerData”)
不会引用任何内容吗?能否添加一个示例,确切说明您实际尝试实现的目标,即“该表中的引用列”的确切含义?运行时错误“1004”,可能您写的区域名称不正确,或者activesheet不包含指定的区域。请尝试更正范围的名称,或尝试在范围之前添加工作表名称(“tLedgerData”),或确保激活工作表的愿望包含命名的范围。为了澄清,我正在寻找一种引用表列的方法,例如,添加计算或更改自动筛选设置,不必不断地按名称引用表和列,如果表列名发生更改,则可能需要更改每个引用@Mat's Mug您使用
ListObject
的建议已经确定![…]即使表名更改,也要引用该表中的列-等等,如果表名更改,
Range(“tLedgerData”)
不会引用任何内容吗?能否添加一个示例,确切说明您实际尝试实现的目标,即“该表中的引用列”的确切含义?运行时错误“1004”,可能您写的区域名称不正确,或者activesheet不包含指定的区域。请尝试更正范围的名称,或尝试在范围之前添加工作表名称(“tLedgerData”),或确保激活工作表的愿望包含命名的范围。为了澄清,我正在寻找一种引用表列的方法,例如,添加计算或更改自动筛选设置,不必不断地按名称引用表和列,如果表列名发生更改,则可能需要更改每个引用@Mat's Mug您使用
ListObject
的建议已经确定!我同意。但是,如果确实要通过调用表名继续,请执行以下操作:
Dim mainTableRange As ListObject
,然后
Set mainTableRange=Worksheets(“Sheet1”)。ListObjects(“tLedgerData”)
就是这样做的!谢谢你,马特!我同意。但是,如果确实要通过调用表名继续,请执行以下操作:
Dim mainTableRange As ListObject
,然后
Set mainTableRange=Worksheets(“Sheet1”)。ListObjects(“tLedgerData”)
就是这样做的!谢谢你,马特!