首页 文章

打开和关闭pivotItem可见性错误

提问于
浏览
0

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

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

  • 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” 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/

  • 0

    尝试使用 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
    

相关问题