我有一个数据透视表,我正在尝试通过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
?
这是完全使用过滤器的一种解决方法,但可能会实现我所需要的。
谢谢!
答案 0 :(得分:0)
我始终无法实现通过按原先预定的方式处理数据透视表或标签过滤器的解决方案。我的解决方法是避免数据透视表本身,并根据我在原始问题中概述的标准(在-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
干杯!