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

How can I get the ListObject object of a PivotTable?

此问题最初是作为 answer 的一部分由 Hugh Seagraves 在相关问题上发布的。他 "wanted to refer to a list object (a table) on one worksheet that a pivot table on a different worksheet refers to," 确实有一个相当不错的答案,但询问是否有 更直接的方法 。我试图强调他的回答,但其他人觉得这正在改变他回答的目的。

他的推理是,"Since list objects are part of the Worksheets collection, you have to know the name of the worksheet that list object is on in order to refer to it." 他提供了一些代码,如果您还没有创建 Pivot Table,它将输出 table (ListObject) 的名称。但我认为使用一些通用代码来获取任何创建的 Pivot Table 的 ListObject 对象可能会有所帮助,因为 PivotTable 姓名。

A PivotTable 从它的 PivotCache 中获取数据。所以你只需要使用 PivotCache.SourceData 属性 来查询 ListObject name.

例如,如果我根据 ListObject 组成一个 PivotTable,然后如果我 select PivotTable 中的一个单元格,那么我可以使用这个:

? activecell.PivotTable.PivotCache.SourceData
Table1

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

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

了解这一点,我们可以编写一个函数来接受 PivotTable 对象和 returns 包含 PivotTable 数据源的 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