我正在尝试从数据透视表中过滤项目 .
Public Sub Test()
Dim pi As PivotItem
Dim pt As PivotTable
Dim pf As PivotField
Set pt = Worksheets("Collections").PivotTables("Collections")
Set pf = pt.PivotFields(1)
pt.ClearAllFilters
For Each pi In pf.PivotItems
Debug.Print pi.Name
If pi.Caption = "00087" Then
pi.Visible = True
Else
pi.Visible = False
End If
Next pi
End Sub
如果认为这是相当直接的,那么,我得到一个
运行时错误'1004'无法设置PivotItem类的visible属性
据我所知,我不能把每一个都弄错 . 但是,我做了一个debug.print,所有可见的属性都是真的开始,所以我不明白为什么将.Visible属性设置为false将是一个问题 .
2 回答
如果这是一个OLAP数据透视表,那么您无法遍历PivotItems集合 . 相反,启动宏录制器,手动过滤感兴趣的项目,然后检查生成的代码 .
如果它是一个PageField,你会看到这样的东西:
如果它是行或列字段,您将看到如下内容:
正如您所看到的,您无需在任何一种情况下进行迭代,并且获得吐出的代码应该足以让您找出要做的事情 .
如果它不是OLAP数据透视表,那么您必须无意中将它们全部设置为false ...可能是因为.caption已更改,因此与.name不匹配,或者可能因为“00087”项不存在在你的数据中 . 所以发生的事情是它没有在PivotItems中找到带有“00087” Headers 的PivotItem,当你尝试将最后一个设置为隐藏时,没有剩下可见的项目 .
但无论如何,迭代PivotItems是非常低效的,并且有一个更好的方法来处理这个,因为你只想过滤一个项目:使感兴趣的字段成为PageField(即将它放在数据透视表的Filters部分)然后将.EnableMultipleItems设置为FALSE,然后设置.CurrentPage =“00087”
要获得确切的语法,请启动宏录制器,过滤一个项目,然后查看宏录制器吐出的代码 .
如果您不将该字段设为PageField,因为您希望它保留在ROWS或COLUMNS区域中,那么请在https://stackoverflow.com/a/39604425/2507160查看我的答案
为了将来参考,请注意,如果您迭代PivotItems,在进行更改时将数据透视表的.ManualUpdate设置为TRUE,然后将其设置回FALSE以避免在每次更改后刷新数据透视表 .
有关高效编程数据透视表的更多信息,请查看我的博客文章http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/
尝试使用
Like
运算符来查看是否可以过滤以"000"或"0008"开头的任何内容?