打开和关闭 pivotItem 可见性错误

Turning on and off pivotItem visibility error

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

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

如果我认为它会相当简单,但是,我得到

Runtime error '1004' Unable to set the visible property of PivotItem class

据我了解,我不能将每个都设置为 false。但是,我做了一个 debug.print 并且所有可见属性一开始都是真的,所以我不明白为什么将 .Visible 属性 设置为 false 会是一个问题。

尝试使用 Like 运算符,看看是否可以过滤任何以“000”或“0008”开头的内容?

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

如果这是一个 OLAP 数据透视表,则您无法遍历数据透视表 collection。相反,启动宏记录器,手动过滤感兴趣的项目,然后检查生成的代码。

如果它是 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(即将其放入数据透视表),然后将 .EnableMultipleItems 设置为 FALSE,然后简单地设置 .CurrentPage = "00087"

要获得准确的语法,请启动宏记录器,筛选一项,然后查看宏记录器输出的代码。

如果您不想更改数据透视表的布局(即不能将该字段设为 PageField,因为您希望它保留在 ROWS 或 COLUMNS 区域中),请参阅我的回答 https://whosebug.com/a/39604425/2507160

为了将来参考,请注意,如果您曾经遍历数据透视表,请在进行更改时将数据透视表的 .ManualUpdate 设置为 TRUE,然后将其设置回 FALSE,以避免数据透视表在每次更改后刷新。

有关高效编程数据透视表的更多信息,请查看我的博客 post http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/