Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在VBA中引用结构化表而不引用其工作表_Excel_Vba_Excel Tables - Fatal编程技术网

Excel 如何在VBA中引用结构化表而不引用其工作表

Excel 如何在VBA中引用结构化表而不引用其工作表,excel,vba,excel-tables,Excel,Vba,Excel Tables,在VBA中,我知道我可以通过以下方式引用结构化表: Set Tbl = Sheets("MySheetName").ListObjects("MyTblName") 然后执行Tbl.XXX,其中.XXX可以是.Name、.Range等 但是,我希望在不引用图纸名称的情况下引用此表,以便在图纸名称更改时宏不会中断 这是可能的吗?如果您的表在ActiveSheet上,您可以像这样使用它: Set Tbl = ActiveSheet.ListObjects("MyTblName") 经过一些研

在VBA中,我知道我可以通过以下方式引用结构化表:

  Set Tbl = Sheets("MySheetName").ListObjects("MyTblName")
然后执行Tbl.XXX,其中.XXX可以是.Name、.Range等

但是,我希望在不引用图纸名称的情况下引用此表,以便在图纸名称更改时宏不会中断


这是可能的吗?

如果您的表在ActiveSheet上,您可以像这样使用它:

Set Tbl = ActiveSheet.ListObjects("MyTblName")

经过一些研究,我发现了一些并非完美的解决方案。 您可以使用VBA中的范围函数,如下所示:

Set tbl = Range("TableName[#All]")
但是,这不是一个ListObject,而是一个范围。您还可以进行其他参考,如:

结构化表的主体(不包括标题)

身体的“MyColumn”列

Range("TableName[MyColumn]")
等等

然后你称之为: tbl.ListObject引用找到范围的结构化表

最酷的是Range()将始终在ActiveWorkbook上工作,因此您可以在工作簿B中打开工作簿a中的宏,并且它仍将在工作簿B上运行


来源:

为什么不引用工作表的“内部”名称而不是其可见名称


您可以使用工作表代码名,该名称只能通过VBE更改。@这更糟。这不仅会在图纸名称更改时发生变化,而且在图纸位置更改时也会发生变化。在图纸中循环查找正确的图纸是一个选项,这就是我在图纸名称和位置可变时使用的方法。@Wizhi No。只需使用
代码名
。例如,
Sheet1.ListObjects(“myTblName”)
@Wizhi我建议您阅读
工作表.CodeName
属性的VBA帮助主题,以获得更好的理解。如果它不在活动工作表上怎么办?我不知道是否可以称之为“好的实践”,但当我处理繁重的VBA项目时。我在一个单独的模块中将我的所有工作表名称作为公共变量分配给其他常量。之后,如果工作表名称发生更改,我不必重新编码所有项目,如果在声明模块中正确更新,良好的工作表将保持激活状态。(我不知道如何避免激活。一些基本功能在这方面非常反复无常,比如简单的“范围”)
Range("TableName[MyColumn]")