根据两个单元格值过滤数据透视表

时间:2019-05-24 17:11:43

标签: excel vba pivot-table

我需要根据两个不同单元格中的值过滤数据透视表。
每个单元格都会在数据透视表中过滤不同的字段。

我知道如何根据一个单元格中的值过滤数据透视表。
但是,我不知道如何添加第二个过滤器。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xptable As PivotTable
    Dim xpfile As PivotField
    Dim xstr As String
    On Error Resume Next
    If Intersect(target, Range("H6:H7")) Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    Set xptable = Worksheets("Sheet11").PivotTables("PivotTable2")
    Set xpfile = xptable.PivotFields("FilterField")
    xstr = target.Text
    xpfile.ClearAllFilters
    xpfile.CurrentPage = xstr
    Application.ScreenUpdating = True
End Sub

1 个答案:

答案 0 :(得分:1)

您的数据透视表(Dim xptable As PivotTable)可以通过其名称或工作表中的编号来寻址,例如。 g。

Set xptable = Worksheets("Given Name of Sheet3").PivotTables("PivotTable3")
Set xptable = Worksheets("Given Name of Sheet3").PivotTables(1)
Set xptable = Sheet3.PivotTables(1) ' or just use codename of Sheet3

您的过滤器字段(Dim xpfile As PivotField)可以寻址为PivotFieldPageField。这几乎是相同的,但我建议使用后者以更好地进行识别。 e。 g。

Set xpfile = xptable.PivotFields("MyFirstFilterFieldName")
Set xpfile = xptable.PageFields("MyFirstFilterFieldName")
Set xpfile = xptable.PageFields(1)

要过滤单个条目,请将页面字段的CurrentPage设置为有效PivotItem的标题。您必须通过循环遍历其所有PivotItems来确保标题存在(否则会出现错误)。

Dim xpitem As PivotItem
With xpfile
    .ClearAllFilters
    For Each xpitem In .PivotItems
        If xpitem.Caption = ... Then
            .CurrentPage = ...
            Exit For
        End If
    Next xpitem

如果要通过更改特定单元格来自动执行此操作,请将以下代码放在该工作表的代码模块中,即单元格输入的位置 (而不是数据透视表是)。

Target代表更改范围的单元格范围。由于它可能更大(例如,某人从剪贴板复制了较大范围到工作表),因此您必须按Intersect进行检查,如果您的单元格已更改,然后使用单个单元格的值。

在工作表的代码模块中,您通过Me引用了相应的工作表。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xptable As PivotTable
    Dim xpfile As PivotField
    Dim xpitem As PivotItem

    Set xptable = Sheet3.PivotTables("PivotTable3")

    If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
        Set xpfile = xptable.PageFields(1)
        With xpfile
            .ClearAllFilters
            For Each xpitem In .PivotItems
                If xpitem.Caption = Me.Range("A1").Value Then
                    .CurrentPage = Me.Range("A1").Value
                    Exit For
                End If
            Next xpitem
        End With

    ElseIf Not Intersect(Target, Me.Range("A2")) Is Nothing Then
        ' like above
    End If
End Sub

如果您需要一个包含多个项的过滤器,则必须EnableMultiplePageItems并隐藏所有不需要的枢轴项-但必须确保,始终至少一个枢轴项< / em>保持可见,e。 g。

Dim AtLeastOneVisible As Boolean
With myPivotTable.PageFields(1)
    .ClearAllFilters
    .EnableMultiplePageItems = True

    AtLeastOneVisible = False
    For Each myPivotItem In .PivotItems
        If myPivotItem .Caption = ... Or myPivotItem .Caption = ... Then
            AtLeastOneVisible = True
            Exit For
        End If
    Next myPivotItem

    If AtLeastOneVisible Then
        For Each myPivotItem In .PivotItems
            If myPivotItem .Caption <> ... And myPivotItem .Caption <> ... Then
                pi.Visible = False
            End If
        Next myPivotItem 
    End If
End With