Microsoft Excel

Herbers Excel/VBA-Archiv

PivotItems mittles VBA auswaehlen

Betrifft: PivotItems mittles VBA auswaehlen von: Nikolaus
Geschrieben am: 10.09.2014 12:24:33

Hallo,

Folgende Situation: Habe eine Pivot Tabelle, bei der ich mittels Makro bestimmte PivotItems gefiltert haben moechte (den Rest ausgeblendet).

Mittels eines Beitrags hier im Forum (https://www.herber.de/forum/archiv/1128to1132/1130707_PivotTabellen_und_VBA.html#1130917), habe ich etwas zusammengeschrieben. Es hakt aber bei dem Array

Sub PivotFilter()

Dim varCustomercodes As Variant
Dim pvTab As PivotTable
Dim pvField As PivotField
Dim pvItem As PivotItem

varCustomercodes = Array("NNPSG1", "NNPSG5")

Set pvField = Worksheets("Supplier").PivotTables("PivotTable222").PivotFields("Customer  _
Modifier")

With pvField
    .EnableMultiplePageItems = False
    .ClearAllFilters
    .EnableMultiplePageItems = True
    For Each pvItem In .VisibleItems
        If pvItem <> varCustomercodes Then
            pvItem.Visible = False
        End If
    Next
    .PivotItems(varCustomercodes).ShowDetail = True
End With
    
End Sub

Wenn ich einzigen "Customer Code" manuell auswaehle, dann klappt der Filter, aber eben nur einer. Auch hier weiss ich nicht weiter, wie ich 2 oder mehrere "Customer Codes" abgleichen kann.

Sub PivotFilter()

Dim varCustomercodes As Variant
Dim pvTab As PivotTable
Dim pvField As PivotField
Dim pvItem As PivotItem

varCustomercodes = Array("NNPSG1", "NNPSG5")

Set pvField = Worksheets("Supplier").PivotTables("PivotTable222").PivotFields("Customer  _
Modifier")

With pvField
    .EnableMultiplePageItems = False
    .ClearAllFilters
    .EnableMultiplePageItems = True
    For Each pvItem In .VisibleItems
        If pvItem <> "NNPSG1" Then
            pvItem.Visible = False
        End If
    Next
    .PivotItems("NNPSG1").ShowDetail = True
End With
    
End Sub
Kann mir jemand erklaeren, wie ich das Array abgleichen kann und dann auch noch nur die Codes des Array anzeigen lassen kann.

Danke!

  

Betrifft: AW: PivotItems mittles VBA auswaehlen von: fcs
Geschrieben am: 10.09.2014 13:44:39

Hallo Nikolaus,

es gibt unterschiede zwischen Berichtsfiltern und Filtern für Zeilen-/Spaltenbeschriftungen.

Gruß
Franz

Sub PivotFilterPageField()
  'Mehrfachfilter für Berichtsfilter via Array setzen
  Dim varCustomercodes As Variant
  Dim pvTab As PivotTable
  Dim pvField As PivotField
  Dim pvItem As PivotItem, varListItem, bolVisible As Boolean
  
  varCustomercodes = Array("NNPSG1", "NNPSG5")

  Set pvTab = Worksheets("Supplier").PivotTables("PivotTable222")
  Set pvField = pvTab.PageFields("Customer Modifier")
  
  Application.ScreenUpdating = False
  With pvField
      .EnableMultiplePageItems = False
      .ClearAllFilters
      .EnableMultiplePageItems = True
      For Each pvItem In .PivotItems
          bolVisible = False
          For Each varListItem In varCustomercodes
                If pvItem.Name = varListItem Then
                    bolVisible = True
                    Exit For
                End If
          Next
          If bolVisible = False Then
            pvItem.Visible = False
          End If
      Next
      '.PivotItems("NNPSG1").ShowDetail = True 'Funktioniert bei Berichtsfeldern nicht
  End With
  Application.ScreenUpdating = True
    
End Sub

Sub PivotFilterField()
  'Mehrfachfilter für Zeilen-/Spaltenbeschriftung via Array setzen
  Dim varCustomercodes As Variant
  Dim pvTab As PivotTable
  Dim pvField As PivotField
  Dim pvItem As PivotItem, varListItem, bolVisible As Boolean
  Application.ScreenUpdating = False
  
  varCustomercodes = Array("NNPSG1", "NNPSG5")
  
  Set pvTab = Worksheets("Supplier").PivotTables("PivotTable2")
  Set pvField = pvTab.PivotFields("Customer Modifier")
  
  With pvField
      .ClearAllFilters
      For Each pvItem In .PivotItems
          bolVisible = False
          For Each varListItem In varCustomercodes
                If pvItem.Name = varListItem Then
                    bolVisible = True
                    Exit For
                End If
          Next
          If bolVisible = False Then
            pvItem.Visible = False
          End If
      Next
      .ShowDetail = True
  End With
  Application.ScreenUpdating = True
      
End Sub



  

Betrifft: AW: PivotItems mittles VBA auswaehlen von: Nikolaus
Geschrieben am: 11.09.2014 04:21:41

Hallo Franz!

Vielen Dank! Es handelte sich um einen Berichtsfilter; Dein erster Code hat (nachdem ich einen Abschreibfehler meinerseits korrigierte) funktioniert.

Ich habe jetzt noch eine Frage, um etwas zu lernen.

Dim pvItem As PivotItem, varListItem, bolVisible As Boolean
PvItem wird als PivotItem definiert.
bolVisible wird als Boolean definiert.

Aber welche Eigenschaft hat varListItem?

Um alle Filter wieder aufzuheben, verwende ich das hier:
Sub PivotFilterPageClear()
 
  Dim pvTab As PivotTable
  Dim pvField As PivotField

  Set pvTab = Worksheets("Supplier").PivotTables("PivotTable222")
  Set pvField = pvTab.PageFields("Customer Modifier")
  
  Application.ScreenUpdating = False
  
  pvField.ClearAllFilters

  Application.ScreenUpdating = True
Geht das kuerzer oder passt das eh so?

Danke!


  

Betrifft: AW: PivotItems mittles VBA auswaehlen von: fcs
Geschrieben am: 11.09.2014 09:45:51

Hallo Nikolaus,

alle Variablen, die in der Variablendeklarion ohne "As ..." stehen haben automatisch den Type Variant.

Dein Löschmakro kanst du natürlich einkürzen, indem du ohne die Variablen-Deklaration arbeitest.

Sub PivotFilterPageClear()
  
  Application.ScreenUpdating = False
  With Worksheets("Supplier").PivotTables("PivotTable222")
      .PageFields("Customer Modifier").ClearAllFilters
  End With
  Application.ScreenUpdating = True

End Sub

Ich persönlich bevorzuge aber mit explizit deklarierten Variablen zu arbeiten.
Dadurch werden beim Programmieren die zulässigen Methoden und Eigenschaften von Objektvariablen angezeigt, wenn man den Punkt nach den Variablen setzt (bei entsprechender Options-Einstellung im VBA-Editor). Auch die Suche nach Fehlern wird einfacher - insbesondere wenn man mit Option Explicit als 1. Anweisung in den Code-Modulen arbeitet; auch hierfür gibt es eine Einstellungs-Option im VBA-Editor.

Zusätzlich lassen sich Subs und Functions leichter für andere Projekte wiederverwenden. Man muss dann ggf. nur die Namen der zugewiesenen Objekte anpassen.

Gruß
Franz