2017-09-29 1 views
0

Mein Ziel ist es, eine Pivot-Tabelle anhand eines Bereichs in einem anderen Blatt zu filtern. In diesem Bereich werden Daten aus einem dritten Blatt abgerufen, bei dem es sich um den Daten-Dump handelt, der eine ganze Reihe von Formeln auslöst und bei jeder Verwendung geändert wird.Filtern einer Pivot-Tabelle basierend auf einem Variablenbereich

Ich habe den untenstehenden Code, aber was ich sehe es läuft durch jedes Pivot-Tabelle-Feld, vergleicht es mit dem Bereich, und dann den Filter entfernen. Ich habe 32.000 Felder, die überprüft werden müssen, damit das aktuelle Makro zu langsam zu verwenden ist.

Könnte mir jemand helfen, den Code so zu fixieren, dass er nur anhand von Werten im Bereich "Nicht leer" filtert?

Sub PT() 
Dim PT As PivotTable 
Dim PI As PivotItem 
Set PT = Sheets("Pivot_Sheet").PivotTables("PivotTable2") 
With Sheets("Pivot_Sheet").PivotTables("PivotTable2").PivotFields("Product") 
.ClearAllFilters 
End With 
For Each PI In PT.PivotFields("Product").PivotItems 
PI.Visible = WorksheetFunction.CountIf(Sheets("Sheet1").Range("J2:J100"), 
PI.Name) > 0 
Next PI 
Set PT = Nothing 
End Sub 
+0

Setzen Sie Ihren Code in Code-Tags bitte. – Sand

+0

Entschuldigung, Code markiert. – NMO

Antwort

0

Ihr Code wird langsam auf viele, viele zählt. Lesen Sie meine blogpost on this subject, wenn Sie mehr über die Engpässe erfahren möchten, die beim Filtern von PivotTables vermieden werden müssen.

Der folgende Code sollte Ihnen den Einstieg erleichtern. Wenn Sie Fragen haben, rufen Sie einfach an.

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 
Verwandte Themen