我对变量进行了调暗:
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
选择了除标题和总行数之外的所有表格数据。
答案 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