Filtering a Pivot Table Based on Variable Range

前端 未结 1 601
旧巷少年郎
旧巷少年郎 2021-01-25 01:49

My objective is to filter a pivot table using a range in another sheet. This range pulls data from a 3rd sheet, which is the data dump that kicks off a whole hosts of formulas a

相关标签:
1条回答
  • 2021-01-25 02:32

    Your code is going to be slow on many, many counts. Have a read of my blogpost on this subject if you're interested in learning about the bottlenecks to avoid when filtering PivotTables.

    The below code should get you started. If you have any questions, just holler.

    Option Explicit
    
    Sub FilterPivot()
    Dim pt As PivotTable
    Dim pf As PivotField
    Dim pi As PivotItem
    Dim i As Long
    Dim vItem As Variant
    Dim vList As Variant
    
    Set pt = ActiveSheet.PivotTables("PivotTable2")
    Set pf = pt.PivotFields("Product")
    
    vList = Application.Transpose(ActiveWorkbook.Worksheets("Sheet1").Range("J2:J100"))
    
    pt.ManualUpdate = True 'Stops PivotTable from refreshing after each PivotItem is changed
    
    With pf
    
        'At least one item must remain visible in the PivotTable at all times, so make the first
        'item visible, and at the end of the routine, check if it actually  *should* be visible
        .PivotItems(1).Visible = True
    
        'Hide any other items that aren't already hidden.
        'Note that it is far quicker to check the status than to change it.
        ' So only hide each item if it isn't already hidden
        For i = 2 To .PivotItems.Count
            If .PivotItems(i).Visible Then .PivotItems(i).Visible = False
        Next i
    
        'Make the PivotItems of interest visible
        On Error Resume Next 'In case one of the items isn't found
        For Each vItem In vList
            .PivotItems(vItem).Visible = True
        Next vItem
        On Error GoTo 0
    
        'Hide the first PivotItem, unless it is one of the items of interest
        On Error Resume Next
        If InStr(UCase(Join(vList, "|")), UCase(.PivotItems(1))) = 0 Then .PivotItems(1).Visible = False
        If Err.Number <> 0 Then
            .ClearAllFilters
            MsgBox Title:="No Items Found", Prompt:="None of the desired items was found in the Pivot, so I have cleared the filter"
        End If
        On Error GoTo 0
    
    End With
    
    pt.ManualUpdate = False
    
    End Sub
    
    0 讨论(0)
提交回复
热议问题