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”)
就是这样做的!谢谢你,马特!