我有一个从数据模型表“table1”创建的数据透视表“pvt_1”,其中包含两个过滤器“filter1”和“filter2”以及两个值“sum_of_donoughts”、“sum_of_cookies”。 “filter1”有项目“all”、“item1”、“item2”
我想编写一个 VBA 子例程以仅从“filter1”中选择“item1”。
到目前为止我已经有了这个,但是 if 语句从未被执行,pf.PivotItems.Count 似乎是 0:
Sub Select_Filter()
Dim pt As PivotTable
Dim pf As PivotField
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set pt = ws.PivotTables("pvt1")
Set pf = pt.PivotFields("[table1].[filter1].[filter1]")
pf.ClearAllFilters
For Each Pi In pf.PivotItems
If Pi.Name = "Item1" Then
Pi.Selected = True
Exit For
End If
Next Pi
结束子
任何帮助将不胜感激。
首先,您忘记了
Dim pi AS PivotItem
,因此您可能会从 使用 Option Explicit
中受益。 但是,这不是(直接)您的主要问题之一。
您的第一个问题非常简单:数据透视表中的字段不名为“[table1].[filter1].[filter1]”;它被称为“过滤器1”。
你的第二个问题是......调用
ClearAllFilters
将选择所有内容,而不是取消选择它。 因此,您当前的代码只会将过滤器设置为“(全部)”。
你的第三个问题是......
PivotItem
不有 Selected
属性。 (您需要 Visible
属性。正确使用 Dim pi As PivotItem
将启用 IntelliSense,并使其更容易发现)
您可能遇到的最后一个问题是,逐一更改项目将导致数据透视表在每次更改时自行更新 - 与在 Excel 中手动执行此操作不同,当您单击“确定”时,数据透视表将仅更新”。 如果数据透视表中有大量数据,那么这将使宏运行速度非常慢。 幸运的是,我们可以使用 ManualUpdate
属性来控制它。 (当然,如果您只选择 one 项,那么您可以只设置 PivotField 的
CurrentPage
)
Sub Select_Filter()
Dim pt As PivotTable, pf As PivotField, pi As PivotItem
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set pt = ws.PivotTables("pvt1")
Set pf = pt.PivotFields("filter1")
pf.ClearAllFilters
pt.ManualUpdate = True
For Each pi In pf.PivotItems
pi.Visible = (pi.Name = "Item1")
Next pi
pt.ManualUpdate = False
End Sub
或
Sub Select_Filter()
Dim pt As PivotTable, pf As PivotField
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set pt = ws.PivotTables("pvt1")
Set pf = pt.PivotFields("filter1")
pf.ClearAllFilters
pf.CurrentPage = "Item1"
End Sub