我正在尝试过滤数据透视表中的项目。
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将是一个问题。
答案 0 :(得分:1)
如果这是OLAP数据透视表,则无法遍历PivotItems集合。相反,启动宏录制器,手动过滤感兴趣的项目,然后检查生成的代码。
如果它是PageField,你会看到类似的东西:
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]").ClearAllFilters
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]"). _
CurrentPageName = "[Table1].[test].&[2]"
如果是行或列字段,您将看到如下内容:
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]"). _
VisibleItemsList = Array("[Table1].[test].&[3]")
正如您所看到的,您不需要在任何一种情况下进行迭代,并且获得吐出的代码应该足以让您找出要做的事情。
如果它不是OLAP数据透视表,那么您必须无意中将它们全部设置为false ...可能是因为.caption已更改,因此与.name不匹配,或者可能因为“00087”项目没有不存在于您的数据中。所以发生的事情是它没有在PivotItems中找到带有“00087”标题的PivotItem,当你尝试将最后一个设置为隐藏时,没有剩下可见的项目。
但是无论如何,迭代PivotItems的效率非常低,并且有一个更好的方法可以解决这个问题,因为你只想过滤一个项目:将感兴趣的字段设为PageField(即将它放在数据透视表的Filters部分中) )然后将.EnableMultipleItems设置为FALSE然后简单地设置.CurrentPage =“00087”
要获得确切的语法,请启动宏录制器,过滤一个项目,然后查看宏录制器吐出的代码。
如果您不想更改数据透视表的布局(即无法将字段设为PageField,因为您希望它保留在ROWS或COLUMNS区域中),请在https://stackoverflow.com/a/39604425/2507160 <上查看我的答案/ p>
为了将来参考,请注意,如果您迭代PivotItems,请在进行更改时将数据透视表的.ManualUpdate设置为TRUE,然后将其设置回FALSE以避免在每次更改后刷新数据透视表。
有关高效编程数据透视表的更多信息,请查看http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/上的博客文章
答案 1 :(得分:0)
尝试使用Like
运算符来查看是否可以过滤以&#34; 000&#34;开头的任何内容。或&#34; 0008&#34;?
Sub test()
Dim pivot_table As PivotTable
Dim pivot_item As PivotItem
Dim pivot_field As PivotField
Set pivot_table = ActiveSheet.PivotTables("PivotTable1")
Set pivot_field = pivot_table.PivotFields(1)
pivot_table.ClearAllFilters
For Each pivot_item In pivot_field.PivotItems
If pivot_item.Caption Like "000*" Then
pivot_item.Visible = True
Else
pivot_item.Visible = False
End If
Next pivot_item
End Sub