Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen

Pivot Berichtsfilter auslesen

Betrifft: Pivot Berichtsfilter auslesen von: Johann
Geschrieben am: 06.08.2014 18:18:11

Hallo zusammen,

ich möchte alle Berichtsfilter meiner Pivottabelle auslesen, um mit diesen Infos ein Diagramm zu beschriften.

Wie kann ich mir die Informationen anzeigen lassen, wenn mehrere Elemente des jeweiligen Filterfeldes markiert sind? Die markierten Elemente sollen anschließend einzeln in das Feld C1, D1, usw. geschrieben werden. Die Elemente des nächsten Filterfeldes in C2, D2, ...

Da meine VBA-Kenntnisse relativ bescheiden sind, ist mir eine Nicht VBA-Lösung auch sehr willkommen. Könnte man das z.B. mit getpivotdata() lösen?

Viele Grüße
Johann

PS: Eine Umstrukturierung der Tabelle, so dass "Country" als zusätzliches Spaltenelement hinzugenommen wird, ist leider nicht möglich.

  

Betrifft: AW: Pivot Berichtsfilter auslesen von: Johann
Geschrieben am: 07.08.2014 09:49:19

Gueten Morgen,

habe einen Codeschnipsel gefunden und angepasst..

 Sub Read_filter()

 
    Dim pi As PivotItem
    
    For Each pi In ActiveSheet.PivotTables("MeritOrder").PivotFields( _
        "[Pivot_MerO_DataImport].[Country].[Country]").PivotItems
        
        If pi.Visible Then MsgBox pi.Name & " is selected"
    Next pi
    
 End Sub
Leider kommt kein PopUp, das mir den Inhalt anzeigt. Oder wird es zu kurz angezeigt?

Gruß
Johann


  

Betrifft: Wirklich keiner eine Idee? von: Johann
Geschrieben am: 07.08.2014 11:56:39

Gruß Johann


  

Betrifft: AW: Pivottabelle, Berichtsfilter gewählte Elemente von: fcs
Geschrieben am: 07.08.2014 13:13:13

Hallo Johann,

ohne Makros kommt man an die Filterinformation des Berichtfilters nicht heran.
Ich hab hier mal für eine ähnliche Fragestelltung entsprechende Makros bzw. eine Function erstellt.
https://www.herber.de/forum/archiv/1368to1372/t1370486.htm#1370486

Die gewählten Filter werden in einer Zelle ausgegeben.
Das könnte man aber ggf. noch anpassen.

Gruß
Franz


  

Betrifft: AW: Pivottabelle, Berichtsfilter gewählte Elemente von: Johann
Geschrieben am: 07.08.2014 14:05:19

Hallo Franz,

vielen Dank für den Link!
Leider passiert nicht viel bei mir, wenn ich die Pivot Tabelle aktualisiere.

Verstehe ich dich richtig, dass dieses Makro nur dann startet, wenn die PT aktualisiert wird? Wenn ich mir dein Makro im VBA Editor ansehe und aus dem Editor starten will, fragt er welches Makro ich ausführen soll (habe noch zwei weitere in der Mappe). Deins tauch darunter nicht auf.

Und noch zwei Fragen: Ist "B2" die Zelle, in welche der Filterinhalt ausgegebn wird? Wenn mehrere Bereichsfilter existieren, werden dann die Inhalte darunter (B3) geschrieben oder wird nur ein Filter ausgewertet bzw. darf die PT nur einen Filter haben, damit das Makro funktioniert?

Sorry, wenns blöde Fragen sind, aber mit VBA hab ich mich noch nicht wirklich angefreundet ^^

Gruß Johann


  

Betrifft: AW: Pivottabelle, Berichtsfilter gewählte Elemente von: fcs
Geschrieben am: 07.08.2014 16:29:22

Hallo Johann,

es sind ja 2 Makros:
1.: Public Function fncBerichtsfilter(pvTable As ....
Dieses Makro musst du in einem allgemeinen Modul in deiner Datei einfügen.

2.: Ereignismakro

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
  With Me
    'in nächster Zeile _
      - die Zelle (wo Filter eingetragen werden soll), _
      - Name des Berichtsfeldes, _
      - und ggf. den Trenntext zwischen den Filterwerten _
    anpassen.
    .Range("B2").Value = fncBerichtsfilter(pvTable:=Target, _
        strFieldName:="Feld01", strSep:=";")
    .Range("B3").Value = fncBerichtsfilter(pvTable:=Target, _
        strFieldName:="Feld02", strSep:=";")
  End With
End Sub

Dieses muss im VBA-Editor jeweils unter den Tabellenblättern mit den Pivot-Tabellenberichten eingefügt werden.
Das Makro schreibt dann alle Filterwerte zu dem unter strFieldName angegebenen Berichtsfeld in die Zelle.

Nachfolgend eine Variante. Diese arbeitet alle Felder im Seitenbereich ab und trägt die selektierten Elemente in die rechten Nachbarzellen ein. Für die Ausgabe der Werte kann man sich natürlich auch etwas anderes zusammenstellen.

Gruß
Franz
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
  Dim pvField As PivotField, varFilterwerte As Variant, intV, intZeile As Integer, intSpalte As  _
Integer
  With Me
    'Alle slektierten Elemente der >Berichtsfelder in den rechten nachbarzellen anzeigen
    For Each pvField In Target.PageFields
        pvField.LabelRange.Offset(0, 2).Resize(1, 10).ClearContents
        varFilterwerte = fncBerichtsfilter(pvTable:=Target, _
            strFieldName:=pvField.Name, strSep:=";")
        If varFilterwerte <> "" Then
          varFilterwerte = Split(varFilterwerte, ";")
          intZeile = 0
          intSpalte = 0
          For intV = LBound(varFilterwerte) To UBound(varFilterwerte)
            intSpalte = intSpalte + 1
            pvField.LabelRange.Offset(0 + intZeile, 2 + intSpalte).Value = varFilterwerte(intV)
          Next
        End If
    Next
  End With
End Sub



  

Betrifft: Berichtsfilter lesen - läuft nicht durch von: Johann
Geschrieben am: 07.08.2014 18:48:53

Hallo Franz,

vielen Dank! Ich glaube, die beiden Codes nun an der richtigen Stelle eingefügt zu haben.
Wenn ich meine PT aktualisiere stoppt das Makro im allgemeinen Modul an der ersten If Bedingung mit dem LZ Fehler 5: "Ungültiger Prozeduraufruf oder ungültiges Argument".

  With pvField
    fncBerichtsfilter = ""
    If .EnableMultiplePageItems = True Then
        For Each pvItem In .PivotItems
          If Not IsError(pvItem.SourceName) Then
Weißt du Rat?
Sofern relevant: Ich lade die Daten für meine PT über ein Datenmodell (Power Pivot)

Viele Grüße
Johann


  

Betrifft: AW: Berichtsfilter lesen - läuft nicht durch von: fcs
Geschrieben am: 08.08.2014 10:16:08

Hallo Johann,

wenn das Makro bis an diese Stelle kommt, dann hast du alles an der richtigen Position eingefügt.

Das Makro hab erstellt für einen "normalem" Pivot-Bericht. Ich hab keine Erfahrungen wie das Makro mit einer PowerPivot-basierten Pivot-Tabelle funktioniert.

Diese Prüfzeile hab ich eingebaut, damit Items "(Leer)" bzw. "(blank)" erkannt werden. Diese haben ein Problem bei der nachfolgenden Prüfung auf die Visble-Eigenschaft.

Wenn du keine (Leer)-Einträge unter den Berichtsfeld-Elementen hast dann kannst du diese Zeile inklusive der zugehörigen EndIf-Zeile löschen.

Alternativ könntest du die Zeile durch folgende erstzen:

          If pvItem.Name <> "(blank)" Then
funktioniert zumendest für eine normale Pivot-Tabelle.

Gruß
Franz


  

Betrifft: AW: Berichtsfilter lesen - läuft nicht durch von: Johann
Geschrieben am: 08.08.2014 14:06:19

Hallo Franz,

es scheint sich wirklich um ein Problem zu handeln, das durch die Nutzung eines Datenmodells als Datenquelle enststeht.
Dein Code hat auch nach den Änderungen nicht funktioniert.

Habe folgenden Code ausprobiert, den ich in einem anderen Forum gefunden habe und für mich leichter anzupassen, weil kürzer ist. Er fuktioniert für eine "normale" Pivot Tabelle. Ich werde einen anderen Thread aufmachen, der das Problem mit Power Pivot konkretisiert.

Viele Grüße
Johann

Sub Get_Current_PageFilters_OnePageField()
    Dim PT As PivotTable
    Dim sArray() As String
    Dim i As Long
    On Error Resume Next
    
    Set PT = Worksheets("PivotData").Range("A1").PivotTable

    If PT.PageFields.Count < 1 Then
        MsgBox "There are no PageFields in this Pivot Table"
        Exit Sub
    End If
    
    With PT.PageFields(1)
        '---store field name in sArray(0)
        ReDim sArray(0)
        sArray(0) = .Name
        If .EnableMultiplePageItems Then
            '---store visible items in sArray(1) and up
            For i = 1 To .PivotItems.Count
                If .PivotItems(i).Visible Then
                    ReDim Preserve sArray(UBound(sArray) + 1)
                    sArray(UBound(sArray)) = .PivotItems(i)
                End If
            Next i
        Else
            ReDim Preserve sArray(UBound(sArray) + 1)
            sArray(UBound(sArray)) = .CurrentPage
        End If
    End With
    
    '---display results in Immediate Window
    For i = 0 To UBound(sArray)
        'Debug.Print sArray(i)
        Worksheets("Filter").Range("A" & i + 1).Value = sArray(i)
    Next i
End Sub



 

Beiträge aus den Excel-Beispielen zum Thema "Pivot Berichtsfilter auslesen "