打开和关闭 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/
我正在尝试从数据透视表中过滤项目 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/