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

时间:2017-09-07 23:21:45

标签: excel vba excel-vba pivot-table excel-pivot

此问题最初是由Hugh Seagraves在相关问题上发布的answer的一部分。他希望在一个工作表上引用一个列表对象(一个表),该工作表上的工作表上的数据透视表引用,"确实有一个相当不错的答案,但问是否有更直接的方式。我试图回答他的答案,但其他人认为这改变了他的答案的目的。

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

1 个答案:

答案 0 :(得分:1)

数据透视表从它的PivotCache中获取数据。所以你只需要使用PivotCache.SourceData属性来查询ListObject名称。

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

? activecell.PivotTable.PivotCache.SourceData
Table1

鉴于表名在工作簿中是唯一的并且也是命名范围,那么要设置对实际ListObject的引用,您只需使用以下内容:

Set lo = Range(ActiveSheet.PivotTables("SomePivotTable").PivotCache.S‌​ourceData).ListObjec‌​t

知道这一点,我们可以编写一个接受数据透视表对象的函数,并返回包含数据透视表数据源的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

...你可以像这样使用它:

Sub Macro1()
Dim pt As PivotTable
Dim lo As ListObject

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

End Sub