Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Vba 如何获取数据透视表的ListObject对象?_Vba_Excel_Pivot Table_Excel Pivot - Fatal编程技术网

Vba 如何获取数据透视表的ListObject对象?

Vba 如何获取数据透视表的ListObject对象?,vba,excel,pivot-table,excel-pivot,Vba,Excel,Pivot Table,Excel Pivot,这个问题最初是作为休·希格雷夫斯(Hugh Seagraves)关于一个相关问题的报告的一部分发布的。他“想引用一个工作表上的列表对象(一个表),而另一个工作表上的透视表则引用了该列表对象(一个表)”,并给出了一个相当好的答案,但询问是否有更直接的方法。我试图抓住他的答案,但其他人认为这改变了他的答案的目的 他的推理是,“由于列表对象是工作表集合的一部分,因此必须知道列表对象所在工作表的名称才能引用它。”他提供了一些代码,如果尚未创建透视表,则可以输出表(ListObject)的名称。但我认为,

这个问题最初是作为休·希格雷夫斯(Hugh Seagraves)关于一个相关问题的报告的一部分发布的。他“想引用一个工作表上的列表对象(一个表),而另一个工作表上的透视表则引用了该列表对象(一个表)”,并给出了一个相当好的答案,但询问是否有更直接的方法。我试图抓住他的答案,但其他人认为这改变了他的答案的目的


他的推理是,“由于列表对象是工作表集合的一部分,因此必须知道列表对象所在工作表的名称才能引用它。”他提供了一些代码,如果尚未创建透视表,则可以输出表(ListObject)的名称。但我认为,如果给定数据透视表的名称,使用一些通用代码来获取任何已创建数据透视表的ListObject对象可能会有所帮助。

数据透视表从其数据透视缓存中获取数据。因此,您只需要使用PivotCache.SourceData属性来查询ListObject名称

例如,如果我基于ListObject创建数据透视表,那么如果我在数据透视表中选择了一个单元格,那么我可以使用:

? activecell.PivotTable.PivotCache.SourceData
Table1
假设表名在工作簿中是唯一的,并且也是命名范围,那么要设置对实际ListObject的引用,只需使用如下内容:

Set lo = Range(ActiveSheet.PivotTables("SomePivotTable").PivotCache.S‌​ourceData).ListObjec‌​t
Sub Macro1()
Dim pt As PivotTable
Dim lo As ListObject

Set pt = Worksheets("SomeWorksheetName").PivotTables("SomePivotTableName")
Set lo = GetListObjectForPT(pt)

End Sub
知道了这一点,我们可以编写一个函数,接受数据透视表对象并返回包含数据透视表数据源的ListObject,如下所示:

Public Function GetListObjectForPT(pt As PivotTable) As ListObject
On Error Resume Next ' In case the Pivot isn't created from a ListObject
Set GetListObjectForPT = Range(pt.PivotCache.SourceData).ListObject
End Function
…您可以这样使用它:

Set lo = Range(ActiveSheet.PivotTables("SomePivotTable").PivotCache.S‌​ourceData).ListObjec‌​t
Sub Macro1()
Dim pt As PivotTable
Dim lo As ListObject

Set pt = Worksheets("SomeWorksheetName").PivotTables("SomePivotTableName")
Set lo = GetListObjectForPT(pt)

End Sub

接受下面的答案如何?实际上,这会给出列表对象/表的名称,但不会公开父工作表的名称,也不会提供引用列表对象的任何方式。要引用列表对象,仍然需要工作表名称。我们的目标是,当列表对象位于除ActiveSheet以外的工作表上时,替换
Set LO=ActiveSheet.ListObjects(“YourListObjectName”)
。是的,确实是这样,尽管我的答案没有显示方法。给定Table1是一个唯一的命名范围,那么您可以简单地使用它:
Set lo=range(ActiveSheet.PivotTables(“SomePivotTable”).PivotCache.SourceData)。ListObject
Yup,就是这样!谢谢你编辑你的答案。假设轴是从ListObject创建的,那么可以使用以下一行代码获取工作表名称:
?范围(工作表(“SomeWorksheetName”).PivotTables(“SomePivotTableName”).PivotCache.SourceData).ListObject.Parent.Name