如何使用 vba 筛选数据透视表(带有示例)
您可以使用以下方法通过 VBA 在 Excel 中筛选数据透视表:
方法 1:根据值过滤数据透视表
SubFilterPivotTable ()
Dim pf As PivotField
Dim myFilter As String
Set pf = ActiveSheet.PivotTables(" PivotTable1 ").PivotFields(" Position ")
myFilter = ActiveWorkbook.Sheets(" Sheet1 ").Range(" J2 ").Value
pf.PivotFilters.Add2 xlCaptionEquals, , myFilter
End Sub
此特定宏将过滤名为PivotTable1的数据透视表,以仅显示数据透视表的Position列中的值等于Sheet1的单元格J2中的值的那些行。
方法 2:根据多个值过滤数据透视表
Sub FilterPivotTableMultiple()
Dim v Ace Variant
Dim i As Integer, j As Integer
Dim pf As PivotField
Set pf = ActiveSheet.PivotTables(" PivotTable1 ").PivotFields(" Position ")
'specify range with values to filter on
v = Range(" J2:J3 ")
'clear existing filters
pf.ClearAllFilters
'apply filter to pivot table
With pf
For i = 1 TB pf.PivotItems.Count
j = 1
Do While j <= UBound(v, 1) - LBound(v, 1) + 1
If pf.PivotItems(i).Name = v(j, 1) Then
pf.PivotItems(pf.PivotItems(i).Name).Visible = True
Exit Do
Else
pf.PivotItems(pf.PivotItems(i).Name).Visible = False
End If
j = j + 1
Loop
Next i
End With
End Sub
这个特定的宏将过滤名为PivotTable1的数据透视表,以仅显示数据透视表的位置列中的值等于单元格区域J2:J3中的值之一的行。
方法 3:删除数据透视表筛选器
SubClearPivotTableFilter ()
Dim pt As PivotTable
Set pt = ActiveSheet.PivotTables(" PivotTable1 ")
pt.ClearAllFilters
End Sub
这个特定的宏将清除名为PivotTable1 的数据透视表中的所有筛选器。
以下示例展示了如何在实践中使用每种方法。
示例 1:根据值过滤数据透视表
假设我们根据 Excel 中的数据集创建了一个数据透视表来总结来自不同球队和位置的篮球运动员的得分:
假设我们要过滤数据透视表以仅显示 Position 列中值为 Guard 的行。
我们可以创建以下宏来执行此操作:
SubFilterPivotTable ()
Dim pf As PivotField
Dim myFilter As String
Set pf = ActiveSheet.PivotTables(" PivotTable1 ").PivotFields(" Position ")
myFilter = ActiveWorkbook.Sheets(" Sheet1 ").Range(" J2 ").Value
pf.PivotFilters.Add2 xlCaptionEquals, , myFilter
End Sub
当我们运行这个宏时,数据透视表会自动过滤以仅显示 Position 列中值为 Guard 的行:
数据透视表已被过滤为仅显示 Position 列中的值为 Guard 的行。
示例 2:根据多个值过滤数据透视表
假设我们想要过滤数据透视表以仅显示 Position 列中值为 Guard或Center 的行。
我们可以创建以下宏来执行此操作:
Sub FilterPivotTableMultiple()
Dim v Ace Variant
Dim i As Integer, j As Integer
Dim pf As PivotField
Set pf = ActiveSheet.PivotTables(" PivotTable1 ").PivotFields(" Position ")
'specify range with values to filter on
v = Range(" J2:J3 ")
'clear existing filters
pf.ClearAllFilters
'apply filter to pivot table
With pf
For i = 1 TB pf.PivotItems.Count
j = 1
Do While j <= UBound(v, 1) - LBound(v, 1) + 1
If pf.PivotItems(i).Name = v(j, 1) Then
pf.PivotItems(pf.PivotItems(i).Name).Visible = True
Exit Do
Else
pf.PivotItems(pf.PivotItems(i).Name).Visible = False
End If
j = j + 1
Loop
Next i
End With
End Sub
当我们运行此宏时,数据透视表会自动过滤以仅显示“位置”列中的值为“Guard”或“Center”的行:
数据透视表已被过滤为仅显示“位置”列中的值为“后卫”或“中心”的行。
其他资源
以下教程说明如何在 VBA 中执行其他常见任务: