如何使用 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 的行:

VBA 过滤器的数据透视表

数据透视表已被过滤为仅显示 Position 列中的值为 Guard 的行。

示例 2:根据多个值过滤数据透视表

假设我们想要过滤数据透视表以仅显示 Position 列中值为 GuardCenter 的行。

我们可以创建以下宏来执行此操作:

 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过滤器的数据透视表

数据透视表已被过滤为仅显示“位置”列中的值为“后卫”或“中心”的行。

其他资源

以下教程说明如何在 VBA 中执行其他常见任务:

VBA:如何刷新数据透视表
VBA:如何删除重复值
VBA:如何计算范围内的行数

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注