excel - 应用了数据透视表标签过滤器,但实际上并未过滤数据
问题描述
我有一个数据透视表,我试图通过 VBA 向其中添加标签过滤器(在单个列上)。
我目前的代码是:
Sub Filter__Pivot()
Application.ScreenUpdating = False
Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
ClearAllFilters
Worksheets("Summary").PivotTables("Pivot1").PivotSelect _
"Sales[All]", xlLabelOnly, True
Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
PivotFilters.Add2 Type:=xlCaptionIsNotBetween, Value1:="-10", Value2:= _
"10"
Application.ScreenUpdating = True
End Sub
代码运行没有错误,并且枢轴具有正在应用的过滤器的外观。我的意思是在我想要的枢轴列上有一个典型的过滤器图标。单击此标题图标显示已应用标签过滤器,当我单击过滤器本身时:过滤器在标题->标签过滤器->不在之间......我看到 -10 和 10 在值字段。问题是数据透视表中的实际数据不反映过滤器 - 它尚未应用(即 -10 和 10 之间的值仍然可见)。
我尝试了宏录制并且我的语法匹配。我也尝试Worksheets("Summary").PivotTables("Pivot1").PivotCache.Refresh
在放置过滤器后使用,但这没有帮助。
奇怪的是,如果我通过 VBA 应用过滤器,然后如上所述单击通过,当我单击“确定”时,我在 Not Between 过滤器上看到 -10 和 10,然后过滤器激活并且数据在枢轴反映过滤器。
本质上,我的过滤器被放置在数据透视表上,但它不是“正在执行”,数据透视表数据也没有反映似乎在其上处于活动状态的过滤器。
谢谢大家!
更新:
我创建了以下代码:
With Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales")
For i = 1 To .PivotItems.count
If i > -10 And i < 10 Then
.PivotItems(i).Visible = False
Else
.PivotItems(i).Visible = True
End If
Next i
End With
这不是根据我的数据透视表的销售列中的值进行评估和过滤,但它确实会移动/过滤表中的数据。有没有办法调整这种方法并循环或遍历每个枢轴线并.Visibility
根据销售列中的值更改?
这将是完全使用过滤器的一种解决方法,但可能会达到我的需要。
谢谢!
解决方案
我永远无法实现一个解决方案,该解决方案通过按最初预期处理数据透视表或标签过滤器来工作。我的解决方法是避免数据透视表本身,并根据我在原始问题中概述的标准隐藏行(在 -10 到 10 之间隐藏)。这可能对其他人不起作用,当然也不是最干净的解决方案,但根据我的需要,下面的代码有效:
Sub Filter_Summary_Pivot()
Application.ScreenUpdating = False
Worksheets("Summary").PivotTables("Pivot1").PivotFields("Sales"). _
ClearAllFilters
Worksheets("Summary").PivotTables("Pivot1").PivotSelect _
"Sales[All]", xlLabelOnly, True
'workaround to pivot filters not actioning data - hides rows based on "isbetween" logic of values in Sales Column
Dim lastrow As Long
lastrow = Worksheets("Summary").Range("C" & Rows.Count).End(xlUp).Row
BeginRow = 5
EndRow = lastrow
ChkCol = 6
For RowCnt = BeginRow To EndRow
If Worksheets("Summary").Cells(RowCnt, ChkCol).Value > -10 And Worksheets("Summary").Cells(RowCnt, ChkCol).Value < 10 Then
Worksheets("Summary").Cells(RowCnt, ChkCol).EntireRow.Hidden = True
End If
Next RowCnt
'secondary "filter" to remove "(Blank)" values in Sales column of pivot
BeginRow = 5
EndRow = lastrow
ChkCol = 6
For RowCnt = BeginRow To EndRow
If Worksheets("Summary").Cells(RowCnt, ChkCol).Value = "(blank)" Then
Worksheets("Summary").Cells(RowCnt, ChkCol).EntireRow.Hidden = True
End If
Next RowCnt
Application.ScreenUpdating = True
End Sub
干杯!
推荐阅读
- php - 使用 PHP UPDATE 更新 MySQL 记录时出现问题,没有更新
- rust - 可以是“发送”的 RefCell 替代方案?
- c++ - 使 DLL 大小尽可能小的最佳方法是什么?
- python - 使用python(Django)的Fushioncharts msline
- git - 在我的 Github 上显示协作存储库
- python - Python 3.9.0 在 rasberry pi 4 上设置为默认值,但我的 IDE 看不到它
- c# - 如何为我的班级创建一个唯一哈希以用作字典键
- word2vec - 使用 gensim word2vec 沿输出或输入向量查找单词相似性?
- python - 为什么我的函数不返回“错误”变量?
- sql - SQL如何限制特定列的数量?