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 类的可见属性

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

4

2 回答 2

1

如果这是一个 OLAP 数据透视表,那么您不能遍历 PivotItems 集合。相反,启动宏记录器,手动过滤感兴趣的项目,然后检查生成的代码。

如果它是一个 PageField,您会看到如下内容:

ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]").ClearAllFilters
ActiveSheet.PivotTables("Pt1").PivotFields("[Table1].[test].[test]"). _
        CurrentPageName = "[Table1].[test].&[2]" 

如果它是 Row 或 Column 字段,您将看到如下内容:

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://stackoverflow.com/a上查看我的答案/39604425/2507160

为了将来参考,请注意,如果您曾经迭代过 PivotItems,请在进行更改时将 PivotTable 的 .ManualUpdate 设置为 TRUE,然后再将其设置回 FALSE 以避免在每次更改后刷新 PivotTable。

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

于 2018-03-28T09:18:15.290 回答
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
于 2018-03-23T15:55:58.390 回答