【问题标题】:VBA Pivot Table Filter .ClearAllFilters without replacing data belowVBA 数据透视表过滤器 .ClearAllFilters 不替换下面的数据
【发布时间】:2019-10-03 20:57:18
【问题描述】:

我有一个代码可以将数据透视表过滤到不超过 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

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

【问题讨论】:

  • 当您尝试一次删除一个手动过滤器项目时出现错误的原因是您无法将过滤器设置为根本不显示任何项目。
  • 我在With语句中添加了这一行.PivotItems(SelectedDate1).Visible = True,但仍然出现同样的错误,它在列表中被选中但没有出现在表格中,我需要刷新吗? @GregViers
  • 我以前遇到过类似的挑战,我有一个令牌项目,我总是打开然后关闭所有其他项目作为设置过滤器的一种方式。
  • 另一种完全不同的方法是创建一个“数据透视表沟”。基本上,在表格下方插入 1000 条空行,然后隐藏它们。这样,当您 ClearAllFilters 时,它不会覆盖您下面的数据,它只会流入沟渠。
  • 对于数据透视表,我通常有一些要比较的标准,并且在 if 语句中我有一个变量,如 switch,这样 z = 0 除非某些东西符合标准并且 z = 1。 .. 所以当你到达最后一项时if i = pivotitems.count and z = 0 then .visible = true。这可确保至少 1 个过滤器应用于数据,即使前一个过滤器已关闭。

标签: excel vba filter pivot-table


【解决方案1】:

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

  • 在您的基表中添加一个列,该列将用作虚拟过滤器,例如“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多