自动更改透视过滤器的宏不起作用

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

我有一份包含几个数据透视表的报告,用于记录生产数据、订单和交货情况。我每天运行它,然后更改报告中的过滤器以选择所有交货编号,然后取消选择空白交货编号。

换句话说,我只选择那些包含交货编号的订单。如果交货编号为空,则订单尚未设置为发货。

    ActiveSheet.PivotTables("PivotTable5").PivotFields("Del #").CurrentPage = _
        "(All)"
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Del #")
        .PivotItems("(blank)").Visible = True
    End With
    ActiveSheet.PivotTables("PivotTable5").PivotFields("Del #").CurrentPage = _
        "(All)"
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Del #")
        .PivotItems("(blank)").Visible = False
    End With
End Sub

我希望进入并选择除空白交货编号之外的所有交货编号。

Screen shot

似乎无法选择“全部”,只选择了前一天选择的内容。

excel vba filter pivot pivot-table
2个回答
1
投票

如何显示除空白之外的每个数据透视项

如果

PivotTables().PivotFields().EnableMultiplePageItems
设置为
True
,则无法通过将 PivotFields.CurrentPage 设置为
="(All)"
来选择
所有
PivotItems(尽管宏记录器仅记录这一点!)。

要选择所有数据透视项,只需使用

PivotField.ClearManualFilter
PivotField.ClearAllFilters
(在数据透视字段上,而不是意外地在数据透视表上!)。然后您可以隐藏(取消选择)空白的。

With WorkSheet.PivotTables(...).PivotFields(...)
    .ClearManualFilter    ' or ClearAllFilters
    If .PivotItems.Count > 1 Then   ' at least 1 has to remain visible
        .PivotItems("(blank)").Visible = False
    End If
End With

错误处理
至少有一个 PivotItem 必须保持可见。如果有only空白并且您尝试隐藏它们,您会收到错误。
如果也没有 no 空白,那么您会收到一个错误,您应该使用

On Error Resume Next
捕获该错误,或者您可以先循环所有项目以检查其中一个是否被称为“(空白)”。仅检查最后一个 PivotItem 的名称(如
If .PivotItems(.PivotItems.Count).Name = "(blank)"
)是不够的,因为它不一定是最后一个条目。

你的例子应该适用于此:

With ActiveSheet.PivotTables("PivotTable5").PivotFields("Del #")
    .ClearManualFilter
    If .PivotItems.Count > 1 Then   ' at least 1 has to remain visible
        .PivotItems("(blank)").Visible = False
    End If
End With

也许您需要每天额外

ActiveSheet.PivotTables("PivotTable5").RefreshTable

反过来:如何仅显示空白的数据透视项

如果选择了

EnableMultiplePageItems = True
和一个或多个,但不是空白的,则
CurrentPage = "(blank)"
会引发错误。 您必须首先启用空白页面,可以通过像上面一样清除过滤器或使空白另外可见,然后您可以选择仅包含空白页面:

WorkSheet.PivotTables().PivotFields().PivotItems("(blank)").Visible = True
WorkSheet.PivotTables().PivotFields().CurrentPage = "(blank)"

0
投票

我有一个相关疑问:

我在数据透视表上应用了这个过滤器:

Pivot Table filter

但是当我更新全部时,过滤器没有更新。 我怎样才能用vba做到这一点?

© www.soinside.com 2019 - 2024. All rights reserved.