VBA 从数据模型创建的数据透视表中选择特定的筛选项

问题描述 投票:0回答:1

我有一个从数据模型表“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

结束子

任何帮助将不胜感激。

pvt_1

excel vba
1个回答
0
投票

首先,您忘记了

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
    
© www.soinside.com 2019 - 2024. All rights reserved.