如果这是一个 OLAP 数据透视表,那么您不能遍历 PivotItems 集合。相反,启动宏记录器,手动过滤感兴趣的项目,然后检查生成的代码。
如果它是一个 PageField,您会看到如下内容:
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]").ClearAllFilters
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]"). _
CurrentPageName = "[Table1].[test].&[2]"
如果它是 Row 或 Column 字段,您将看到如下内容:
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]"). _
VisibleItemsList = Array("[Table1].[test].&[3]")
正如您所看到的,您不需要在任何一种情况下进行迭代,并且吐出的代码应该足以让您确定要做什么。
如果它不是 OLAP 数据透视表,那么您一定是无意中将它们全部设置为 false ...可能是因为 .caption 已更改,因此与 .name 不匹配,或者可能是因为“00087”项目不存在在您的数据中。所以发生的事情是它没有在 PivotItems 中找到标题为“00087”的 PivotItem,并且当您尝试将最后一个设置为隐藏时,没有可见项目。
但无论如何,通过 PivotItems 进行迭代是非常低效的,并且有一个更好的方法来解决这个问题,因为您只想过滤一个项目:将感兴趣的字段设置为 PageField(即把它放在数据透视表的过滤器部分),然后将 .EnableMultipleItems 设置为 FALSE,然后简单地设置 .CurrentPage = "00087"
要获得准确的语法,请启动宏记录器,过滤一项,然后查看宏记录器吐出的代码。
如果您不想更改数据透视表的布局(即不能将字段设为 PageField,因为您希望它保留在 ROWS 或 COLUMNS 区域中),请在https://stackoverflow.com/a上查看我的答案/39604425/2507160
为了将来参考,请注意,如果您曾经迭代过 PivotItems,请在进行更改时将 PivotTable 的 .ManualUpdate 设置为 TRUE,然后再将其设置回 FALSE 以避免在每次更改后刷新 PivotTable。
有关有效编程数据透视表的更多信息,请查看我在http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/上的博客文章