Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Pivotfilter verknüpfen

Forumthread: Pivotfilter verknüpfen

Pivotfilter verknüpfen
16.10.2013 09:35:16
david.a2k
Hallo,
ich habe in Tabellenblatt 1 eine Pivottabelle und möchte die darin gesetzen Filter in eine Pivot in Tabellenblatt 2 übertragen.
Diese Funktion um die Filter zu übertragen würde durch eine Change Funktion ausgelöst. Diese habe ich bereits fertig.
Ich schaffe es aber nicht die gesetzten Fitler auf die zweite Pivottabelle zu übertragen, insbesondere wenn es sich um eine Mehrfachauswahl in einem Filter handelt,
kann mir jemald dabei helfen?
Danek udn Gruß

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Pivottabellenbericht - Filter synchronisieren
16.10.2013 18:48:55
fcs
Hallo Danek,
die Filtereinstellungen in 2 oder mehreren Pivot-Tabellenberichten zu synchronisieren ist mühsehlig zu programmieren.
Extreme Probleme bereiten dabei Dezimalzalen und Datumswerte als Feldnamen und Pivot-Items.
Ich hab hier jetz mal einen Anlauf genaommen dies für Excel 2010 umzusetzen.
Grundvoraussetzung ist, dass die Feldnamen (Berichtsfelder/Zeilen und Spaltenfeldnamen) in den Pivotberichten identisch sind. Bei Wertefiltern müssen dann auch die entsprechenden Feldnamen im Datenbereich übereinstimmen.
Wenn das nicht der Fall ist, dann müssen im Code die Feldnamen der Master-Pivot angegeben werden, die nicht synchronisiert werden sollen.
mfg
Franz
'Code in einem allgemeinen Modul der Datei
Option Explicit
'Erstellt unter Excel 2010 -- fcs 2013-10-16 -- Version 01
'- Nicht lauffähig unter Excel 2003 !!!
'- unter Excel 2007 nicht getestet
Sub Pivotfilter_Sychronisieren()
'Synchronisiert die Filtereinstellungen mehrerer Pivottabellenberichte
Dim pvMaster As PivotTable, pvSlave() As PivotTable
Dim pvMasterField As PivotField, pvItem As PivotItem
Dim pvSlaveField As PivotField
Dim AnzPvSlave As Integer, intSlave As Integer
Dim strTemp As String
Application.EnableEvents = False
'Pivottabellen setzen
With ActiveWorkbook
'Master-Pivottabellenbericht setzen, dessen Einstellungen für die anderen
'Pivotberichte übernommen werden sollen.
Set pvMaster = .Worksheets("Feld04").PivotTables(1) 'Blattname anpassen!!!
'Slave-Tabellen definieren, die synchronisiert werden sollen
AnzPvSlave = 1 'Anzahl ggf. anpassen
ReDim pvSlave(1 To AnzPvSlave)
Set pvSlave(1) = .Worksheets("Feld06").PivotTables(1) 'Blattname anpassen!!!
'ggf. weitere Slave-Pivottabellen setzen
End With
For intSlave = 1 To AnzPvSlave
pvSlave(intSlave).ClearAllFilters
'Berichtsfelder
'- funktioniert nicht bei mehren ausgewählten Elementen in einem BerichtsFeld
For Each pvMasterField In pvMaster.PageFields
Select Case pvMasterField.Name
Case "Berichtsfeld1", "Berichtsfeld2"
'diese Feldnamen nicht synchronisieren
Case Else
Set pvSlaveField = pvSlave(intSlave).PivotFields(pvMasterField.Name)
pvSlaveField.EnableMultiplePageItems = pvMasterField.EnableMultiplePageItems
strTemp = pvMasterField.LabelRange.Offset(0, 1).Value
Select Case strTemp
Case "(All)", "(Alle)"
'keine Filter für Berichtsfeld gesetzt
'do nothing
Case "(Mehrere Elemente)", "(Multi-Selektion)" 'englischen text anpassen !!!
If fncPageFieldsMultiple(pvMasterField, pvSlaveField) = False Then
MsgBox "Probleme beim Synchronisieren des Berichtsfeldes: " & pvMasterField. _
Name
Err.Clear
GoTo Beenden
End If
Case Else
pvSlaveField.CurrentPage = strTemp
End Select
End Select
Next
'Zeilenfelder
For Each pvMasterField In pvMaster.RowFields
Select Case pvMasterField.Name
Case "Zeilenfeld1", "Zeilenfeld2"
'diese ZeilenFeldnamen nicht synchronisieren
Case Else
Set pvSlaveField = pvSlave(intSlave).PivotFields(pvMasterField.Name)
If fncSynchronizePivotField(pvMasterField, pvSlaveField, _
bolDateMsgBox:=True) = False Then GoTo Beenden
End Select
Next
'Spaltenfelder
For Each pvMasterField In pvMaster.ColumnFields
Select Case pvMasterField.Name
Case "Zeilenfeld1", "Zeilenfeld2"
'diese SpaltenFeldnamen nicht synchronisieren
Case Else
Set pvSlaveField = pvSlave(intSlave).PivotFields(pvMasterField.Name)
If fncSynchronizePivotField(pvMasterField, pvSlaveField, _
bolDateMsgBox:=True) = False Then GoTo Beenden
End Select
Next
Next
Beenden:
Erase pvSlave
Set pvMaster = Nothing
Application.EnableEvents = True
End Sub
Function fncSynchronizePivotField(objMasterField As PivotField, _
objSlaveField As PivotField, _
Optional bolDateMsgBox As Boolean = False) As Boolean
'Synchronisierung von Zeilen-/Spaltenfeldern in 2 Pivottabellen
'bolDateMsgBox: Wenn True, dann wird eine Meldung angezeigt, wenn ein _
Datumswert in der Dropdownauswahl gewählt wurde
fncSynchronizePivotField = True
On Error GoTo Fehler
Dim pvItem As PivotItem, pvItemNr As Integer
Dim pvFilter As PivotFilter
Dim strTemp As String
If objMasterField.PivotFilters.Count = 0 Then
'es ist kein Beschriftungs oder Wertefilter gewählt sondern evtl. nur _
einzelne Werte in den Einzelwerten gewählt/abgewählt.
For pvItemNr = 1 To objMasterField.PivotItems.Count
Set pvItem = objMasterField.PivotItems(pvItemNr)
If IsDate(pvItem.Name) Or IsDate(Right(pvItem.Name, 10)) Then
Select Case objMasterField.Name
Case "Minuten", "Minutes", "Stunden", "Hours", "Tage", "Days"
'Keine Meldung bei gruppierten Zeitangaben
Case "Monate" To "Months", "Quartale", "Quarters", "Jahre" To "Years"
'Keine Meldung bei gruppierten Datums/Zeitangaben
Case Else
If bolDateMsgBox = True Then
MsgBox "Pivot Items mit manueller Auswahl von Datumswerten " _
& "können noch nicht verarbeitet werden. " & vbLf _
& "Bitte bei der Auswahl den Datumsfilter verwenden", _
vbInformation + vbOKOnly, _
"Synchronisation Pivot - Manueller Datumsfilter: " _
& objMasterField.Name
End If
End Select
Exit For 'Pivotfeld wird nicht weiter bearbeitet
Else
If pvItem.Visible = False Then
strTemp = pvItem.Name
objSlaveField.PivotItems(strTemp).Visible = False
End If
End If
Next
Else
'es ist ein Beschriftungs oder Wertefilter gesetzt
For Each pvFilter In objMasterField.PivotFilters
With pvFilter
Select Case .FilterType
'Beschriftungs - Werte-Filter
Case xlCaptionEquals, xlCaptionDoesNotEqual, _
xlCaptionBeginsWith, xlCaptionDoesNotBeginWith, _
xlCaptionEndsWith, xlCaptionDoesNotEndWith, _
xlCaptionContains, xlCaptionDoesNotContain, _
xlCaptionIsGreaterThan, xlCaptionIsGreaterThanOrEqualTo, _
xlCaptionIsLessThan, xlCaptionIsLessThanOrEqualTo
objSlaveField.PivotFilters.Add Type:=.FilterType, Value1:=.Value1
Case xlCaptionIsBetween, xlCaptionIsNotBetween
objSlaveField.PivotFilters.Add Type:=.FilterType, Value1:=.Value1, _
Value2:=.Value2
'Beschriftung - Datums-Filter
Case xlSpecificDate, xlAfter, xlBefore 'Datum/Zeit gleich, nach, vor
objSlaveField.PivotFilters.Add Type:=.FilterType, Value1:=CDbl(.Value1)
Case xlDateBetween, xlDateNotBetween 'Datum/Zeit von-bis, nicht von-bis
objSlaveField.PivotFilters.Add Type:=.FilterType, Value1:=CDbl(.Value1), _
Value2:=CDbl(.Value2)
Case xlDateLastWeek, xlDateThisWeek, xlDateNextWeek 'Woche letzte, _
dieser, nächster
objSlaveField.PivotFilters.Add Type:=.FilterType
Case xlDateLastMonth, xlDateThisMonth, xlDateNextMonth 'Monat letzter, _
diese, nächste
objSlaveField.PivotFilters.Add Type:=.FilterType
Case xlDateLastQuarter, xlDateThisQuarter, xlDateNextQuarter 'Quartal letzte, _
dieser, nächster
objSlaveField.PivotFilters.Add Type:=.FilterType
Case xlYearToDate, xlDateLastYear, xlDateThisYear, xlDateNextYear
'Jahr bis heute, letztes, dieses, nächstes
Case xlAllDatesInPeriodQuarter1, xlAllDatesInPeriodQuarter2, _
xlAllDatesInPeriodQuarter3, xlAllDatesInPeriodQuarter4
'Quartal im aktuellen Jahr
objSlaveField.PivotFilters.Add Type:=.FilterType
Case xlAllDatesInPeriodJanuary, xlAllDatesInPeriodFebruary, _
xlAllDatesInPeriodMarch, xlAllDatesInPeriodApril, xlAllDatesInPeriodMay, _
xlAllDatesInPeriodJune, xlAllDatesInPeriodJuly, xlAllDatesInPeriodAugust, _
xlAllDatesInPeriodSeptember, xlAllDatesInPeriodOctober, _
xlAllDatesInPeriodNovember, xlAllDatesInPeriodDecember
'Monat im aktuellen Jahr
objSlaveField.PivotFilters.Add Type:=.FilterType
'Filter für Ergebnisse der berechneten Daten
Case xlValueIsGreaterThan, xlValueIsGreaterThanOrEqualTo, _
xlValueIsLessThan, xlValueIsLessThanOrEqualTo, _
xlValueEquals, xlValueDoesNotEqual
objSlaveField.PivotFilters.Add Type:=.FilterType, DataField:=.DataField, _
Value1:=.Value1
Case xlValueIsBetween, xlValueIsNotBetween
objSlaveField.PivotFilters.Add Type:=.FilterType, DataField:=.DataField, _
Value1:=.Value1, Value2:=.Value2
Case xlTopCount, xlBottomCount, _
xlTopPercent, xlTopSum
objSlaveField.PivotFilters.Add Type:=.FilterType, DataField:=.DataField, _
Value1:=.Value1
Case xlBottomPercent, xlBottomSum
objSlaveField.PivotFilters.Add Type:=.FilterType, DataField:=.DataField, _
Value1:=.Value1, Order:=.Order
Case Else
MsgBox "Der gewählte Filter wird vom Makro noch nicht unterstützt", _
vbInformation + vbOKOnly, _
"Synchronisation Pivot - Manueller Datumsfilter: " _
& objMasterField.Name
End Select
End With
Next
End If
Fehler:
With Err
Select Case .Number
Case 0 'Alles OK
Case Else
strTemp = "Probleme mit Feld """ & objMasterField.Name
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description & vbLf & vbLf _
& strTemp
fncSynchronizePivotField = False
End Select
End With
Set pvItem = Nothing: Set pvFilter = Nothing
End Function
Function fncPageFieldsMultiple(objMasterField As PivotField, _
objSlaveField As PivotField) As Boolean
'Selektion in 2 Berichtsfeldern synchronisieren
Dim pvItem As PivotItem, pvItemSlave As PivotItem, bolFound As Boolean
Dim strTemp As String
fncPageFieldsMultiple = True
On Error GoTo Fehler
For Each pvItemSlave In objSlaveField.PivotItems
bolFound = False
strTemp = pvItemSlave.Name
For Each pvItem In objMasterField.PivotItems
If pvItem.Name = strTemp Then
bolFound = True
pvItemSlave.Visible = pvItem.Visible
Exit For
End If
Next
If bolFound = False Then
pvItemSlave.Visible = False
End If
Next
Fehler:
With Err
Select Case .Number
Case 0 'Alles OK
Case Else
strTemp = "Probleme mit Berichts-Feld """ & objMasterField.Name
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description & vbLf & vbLf _
& strTemp
fncPageFieldsMultiple = False
End Select
End With
End Function

Anzeige
AW: Pivottabellenbericht - Filter synchronisieren
17.10.2013 09:42:17
david.a2k
Hallo,
ich bin erschlagen! So viel Code habe ich nicht erwartet!
Aber der Code hat auf Anhieb funktioniert! Vielen Dank!
Es klappt wenn ich zwei Filter auswähle mit jeweils einem Filterelement oder einen Filter mit mehreren Fitlerelementen.
Allerdings klappt es noch nicht wenn ich zwei Filter setze und in einem oder beiden mehrere Elemente auswähle. Gibt es dafür noch eine Lösung?
Vielen vielen Dank aber schon mal für diesen Code!
Grüße David

Anzeige
AW: Pivottabellenbericht - Filter synchronisieren
17.10.2013 14:04:39
fcs
Hallo David,
die Länge des Codes rührt halt daher, dass das Makro so ziemlich alle Varianten der Filtereinstellungen vom Master auf die anderen Pivots übertragen soll.
Ich habe jetzt nochmals verschiedenste Kombinationen von Filtereinstellungen probiert (Berichtsfelder, Zeilenfelder, Spaltenfelder).
Soweit ich feststellen konnte funktioniert es in meiner Deutschen Excelversion mit deutschsprachigem Betriebssystem ExcelXP korrekt bis auf die schon beschriebenen Einschränkungen.
Falls du eine andere Sprachversion verwendest, dann müssen im Code ggf. für die Case-Fälle für die Berichtsfilter, die Texte der Sprache für "(Alle)", "(Mehrere Elemente)" angepasst werden.
Meine Test-Pivots haben dabei die gleiche Datenquelle, es werden im Datenbereich jedoch unterschiedliche Datenfelder summiert.
Es funktioniert sowohl wenn ich mehrere Filter im Master einstelle und dann das Makro starte als auch wenn ich mit folgendem Makro nach jeder Master-Pivotaktualisierung/Änderung die Slaves akltualisiere.
'Code unter dem Tabellenblatt mit der Masterpivot-Tabelle
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Call Pivotfilter_Sychronisieren
End Sub
fg
Franz

Anzeige
AW: Pivottabellenbericht - Filter synchronisieren
17.10.2013 15:21:29
david.a2k
Hallo,
ich habe meinen Fall nochmal in klein nachgebaut und da funktioniert alles so wie du sagst.
Es muss also was mit meinem Originalfile nicht passen.
Aber das kann ich dann bestimmt schaffen.
Vielen Dank für die Hilfe,
echt super!
Grüße
;
Anzeige

Infobox / Tutorial

Pivotfilter verknüpfen in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne dein Excel-Dokument mit den relevanten Pivot-Tabellen.
  2. Erstelle eine Master-Pivottabelle auf dem ersten Tabellenblatt (z.B. "Feld04").
  3. Füge eine Slave-Pivottabelle auf einem anderen Tabellenblatt (z.B. "Feld06") hinzu.
  4. Kopiere den bereitgestellten VBA-Code in ein allgemeines Modul in deinem Excel-VBA-Editor:
    Sub Pivotfilter_Sychronisieren()
       ' Dein VBA-Code hier
    End Sub
  5. Passe die Blattnamen im Code an deine tatsächlichen Blattnamen an.
  6. Führe das Makro aus, um die Filtereinstellungen von der Master-Pivottabelle auf die Slave-Pivottabelle zu übertragen.

Häufige Fehler und Lösungen

  • Problem: Die Filter werden nicht korrekt übertragen.

    • Lösung: Stelle sicher, dass die Feldnamen in beiden Pivottabellen identisch sind. Unterschiede können zu Synchronisationsproblemen führen.
  • Problem: Bei der Auswahl mehrerer Filterelemente klappt die Synchronisation nicht.

    • Lösung: Überprüfe die Funktion fncPageFieldsMultiple, um sicherzustellen, dass die Mehrfachauswahl korrekt behandelt wird.
  • Problem: Fehlermeldungen beim Ausführen des Makros.

    • Lösung: Schau dir die Zeilen im Code an, die Fehler auslösen könnten, und passe die Filterbedingungen entsprechend an.

Alternative Methoden

Eine alternative Methode zur Synchronisierung von Pivotfiltern ist die Verwendung von Excel-Formeln, um die Filterbedingungen dynamisch zu setzen. Dies kann jedoch umständlicher sein und erfordert ein tieferes Verständnis der Excel-Funktionen.


Praktische Beispiele

Angenommen, du hast eine Master-Pivot-Tabelle mit den folgenden Berichtsfeldern:

  • Berichtsfeld1: Produkte
  • Berichtsfeld2: Regionen

Wenn du mehrere Filter in der Master-Pivot-Tabelle auswählst, wird der Code sicherstellen, dass dieselben Filtereinstellungen auf die Slave-Pivot-Tabelle angewendet werden. Dies funktioniert besonders gut in Excel 2010 und neueren Versionen.

Set pvMaster = .Worksheets("Feld04").PivotTables(1) 'Master-Pivot
Set pvSlave(1) = .Worksheets("Feld06").PivotTables(1) 'Slave-Pivot

Hier wird für beide Pivot-Tabellen sichergestellt, dass die Filter synchronisiert werden.


Tipps für Profis

  • Nutze die Worksheet_PivotTableUpdate-Ereignisprozedur, um die Slave-Pivottabellen automatisch zu aktualisieren, wenn die Master-Pivottabelle aktualisiert wird:

    Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
       Call Pivotfilter_Sychronisieren
    End Sub
  • Teste den Code mit verschiedenen Sprachversionen von Excel, da die Filterbezeichnungen je nach Sprache variieren können. Achte darauf, die entsprechenden Texte im Code anzupassen.


FAQ: Häufige Fragen

1. Warum funktioniert der Code nicht in Excel 2003? Der bereitgestellte Code ist speziell für Excel 2010 und neuere Versionen optimiert. Excel 2003 unterstützt einige der VBA-Funktionen nicht.

2. Was ist, wenn ich unterschiedliche Datenquellen für die Pivots habe? Stelle sicher, dass die Berichtsfelder in beiden Pivot-Tabellen identisch sind. Unterschiedliche Datenquellen könnten die Synchronisation der Filter erschweren.

3. Kann ich die Filter während der Laufzeit ändern? Ja, du kannst die Filter während der Ausführung des Makros ändern. Achte jedoch darauf, dass die Änderungen nicht die Struktur der Pivots beeinflussen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige