打开和关闭pivotItem可见性错误

时间:2018-03-23 15:18:40

标签: vba pivotitem

我正在尝试过滤数据透视表中的项目。

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 个答案:

答案 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