首页 > 解决方案 > VBA数据透视表过滤器.ClearAllFilters而不替换下面的数据

问题描述

我有一个代码可以将数据透视表过滤到不超过 31 天的日期范围。由于我知道数据透视表的长度,因此我在数据透视表下方还有其他数据和信息可供使用。问题是数据源的日期范围更大,所以当我使用它时,.ClearAllFilters它希望在过滤到正确的范围之前替换下面的所有数据。

这是我的简单代码:

Set pt = RepSheet.PivotTables("PivotTable1")
    pt.PivotFields("Date").ClearAllFilters
    pt.PivotFields("Date").PivotFilters.Add Type:=xlDateBetween, _
        Value1:=SelectedDate1, Value2:=SelectedDate2

我尝试使用下面的代码将过滤器全部设置为,False而不是清除过滤器,但在尝试设置过滤器时出现错误。

With pt.PivotFields("Date")
    For i = 1 To .PivotItems.Count - 1
        .PivotItems(.PivotItems(i).Name).Visible = False
    Next i
End With

有什么建议么?我真的不想将数据放在数据透视表的顶部。

标签: excelvbafilterpivot-table

解决方案


我想出了一个相当简单的解决方法:

  • 向您的基表添加一个列,该列将用作虚拟过滤器,例如“ClearAllFiltersWorkaround”
  • 填充它,使其仅包含数据透视表中的一行的相同值。我使用了公式 =IF(A1=$A$1,"Single Item Flag",""),其中我的 pt 行填充了 A 列中的项目
  • 编辑您的 pt 数据源(数据透视表分析 --> 更改数据源)并将这个新字段作为过滤器添加到您的数据透视字段列表中
  • 然后,在更新数据透视表时,首先过滤一个行标签
  • 更改/添加/删除数据透视字段、排序/过滤值或您需要做的任何事情
  • 清除你的虚拟过滤器
    pt.PivotFields("ClearAllFiltersWorkaround").CurrentPage = "Single Item Flag"
    'Filter/Sort fields, add columns, add values
    pt.PivotFields("ClearAllFiltersWorkaround").ClearAllFilters

推荐阅读