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

时间:2016-12-20 19:54:31

标签: vba excel-vba range excel

我对变量进行了调暗:

Dim mainTableRange As Range

然后给它一个值:

Set mainTableRange = Range("tLedgerData") ' tLedgerData is an Excel table.

现在我试图从表中的变量到引用列获取表的名称(即#34; tLedgerData"),即使表名更改也是如此。

我试过

mainTableRange.Name

mainTableRange.Name.Name

(参见how do you get a range to return its name。)两者都抛出了运行时错误' 1004'应用程序定义或对象定义错误。

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

2 个答案:

答案 0 :(得分:4)

我认为你在这里遇到了X-Y问题:当解决方案是问题Y时解决问题X.

  

[...]引用该表中的列,即使表名更改

将表格ListObject单独放在自己的专用工作表上,并为表格提供CodeName。这样你就可以做到这一点:

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

换句话说,您需要关心表的名称。你想要的是使用它的ListObject。由于您永远不需要通过名称来引用它,因此表格的名称完全无关紧要,用户可以随心所欲地更改它,您的代码甚至不会注意到。

答案 1 :(得分:0)

我认为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