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

Auswahl im Datenschnitt Makro auslösen

Forumthread: Auswahl im Datenschnitt Makro auslösen

Auswahl im Datenschnitt Makro auslösen
18.02.2020 15:28:28
haze
Hallo zusammen,
ich habe ein Tabellenblatt mit einer Pivot und 5 dazugehörigen Datenschnitten.
Je nachdem, in welchem Datenschnitt eine Auswahl getroffen wird, soll die Pivot entsprechend angepasst werden: es handelt sich um einen hierarchischen Drilldown von der obersten bis zur untersten Ebene.
Mein Problem: Das Makro soll von sich aus nach Auswahl eines Filters starten und auch irgendwann aufhören ;).
Wenn ich mit "Worksheet_PivotTableUpdate" oder "Worksheet_Change" arbeite, dann handelt es sich um eine Endlosschleife und das Makro endet nie.
Habt ihr hier eine Idee, wie ich das Makro anhand der Auswahl in einem Datenschnitt (und zwar egal in welchem der 5) nur einmal auslösen kann?
Herzlichen Dank für eure Mühe und viele Grüße
haze
Public Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
'### Etwas kryptische Formel: Wenn ein Eintrag im Datenschnitt aktiviert ist, dann bedeutet das  _
_
= true!
'Deshalb werden "False" item angesprochen, ganz einfach deshalb: Es ist egal welcher Filter auf  _
_
einen Datenschnitt angewendet wird,
'nur das ein Filter (Wie gesagt egal welcher) angesprochen wurde reicht aus, um das MAkro  _
anzuwerfen!
Dim objItem As SlicerItem
Application.ScreenUpdating = False
For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_11").SlicerItems
If objItem.Selected = False Then 'Wenn ein Item abgewählt, dann Filter aktiv!
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =   _
_
xlHidden Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =  _
xlRowField
End If 'Blende das richtige Pivot Field ein (sofern noch nicht vorhanden) und alle   _
_
anschließend aus
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation  _
_
= xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =   _
_
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation  _
_
= xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =   _
_
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation  _
_
= xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =   _
_
xlHidden
End If
End If
Next
'### Ab hier analog oberer Block, aber auf die anderen Datenschnitte angewnedet (andere  _
Pivot Field nötig)
For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_21").SlicerItems
If objItem.Selected = False Then
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =  _
xlHidden Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =  _
xlRowField
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlHidden
End If
End If
Next
For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_31").SlicerItems
If objItem.Selected = False Then
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =  _
xlHidden Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =  _
xlRowField
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlHidden
End If
End If
Next
For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_41").SlicerItems
If objItem.Selected = False Then
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlHidden Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlRowField
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =  _
xlHidden
End If
End If
Next
For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_Element1").SlicerItems
If objItem.Selected = False Then
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlHidden Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost Element").Orientation =  _
xlRowField
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 4").Orientation =  _
xlHidden
End If
If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =   _
_
xlRowField Then
ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation =  _
xlHidden
End If
End If
Next
Application.ScreenUpdating = True
End Sub

Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Auswahl im Datenschnitt Makro auslösen
19.02.2020 06:56:03
Luschi
Hallo haze,
einen Ansatz (1. Vorahnung), wie das gehen könnte, findest Du hir:
https://blog.soprani.at/2016/08/08/ereignis-beim-klick-auf-datenschnitt/
Die Idee ist stark ausbaufähig. Wenn Du eine Demodatei bereitstellst, helfe ich Dir weiter.
Gruß von Luschi
aus klein-Paris
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Auswahl im Datenschnitt Makro auslösen


Schritt-für-Schritt-Anleitung

Um ein Makro zu erstellen, das auf die Auswahl in einem Datenschnitt reagiert, kannst du die folgenden Schritte befolgen:

  1. Öffne Excel und lade deine Arbeitsmappe mit der Pivot-Tabelle und den Datenschnitten.

  2. Öffne den VBA-Editor mit ALT + F11.

  3. Füge das folgende Makro in das entsprechende Arbeitsblatt-Modul ein:

    Public Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
       Dim objItem As SlicerItem
       Application.ScreenUpdating = False
    
       ' Hier wird überprüft, ob ein Datenschnitt-Element ausgewählt wurde
       For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_11").SlicerItems
           If objItem.Selected = False Then
               ' Anpassungen an der Pivot-Tabelle vornehmen
               If ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation = xlHidden Then
                   ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 2").Orientation = xlRowField
               End If
           End If
       Next
    
       ' Weitere Datenschnitte hier analog hinzufügen...
    
       Application.ScreenUpdating = True
    End Sub
  4. Schließe den VBA-Editor und teste das Makro, indem du verschiedene Elemente in den Datenschnitten auswählst.


Häufige Fehler und Lösungen

  • Endlosschleife bei der Auswahl: Wenn das Makro nicht aufhört, kann es daran liegen, dass die Worksheet_PivotTableUpdate-Methode ständig die Pivot-Tabelle aktualisiert. Achte darauf, dass das Makro nur einmal pro Auswahl ausgeführt wird.

  • Datenschnitt nicht drucken: Um zu verhindern, dass der Datenschnitt beim Drucken angezeigt wird, kannst du die Sichtbarkeit des Datenschnitts im Drucklayout anpassen.


Alternative Methoden

Eine andere Möglichkeit, um den Excel Datenschnitt mehrfachauswahl zu steuern, ist die Verwendung von Worksheet_Change. Diese Methode reagiert jedoch auf alle Änderungen im Arbeitsblatt, weshalb sie sorgfältig implementiert werden sollte, um Endlosschleifen zu vermeiden.


Praktische Beispiele

Hier ist ein Beispiel, wie du den Datenschnitt für die Auswahl von Kostenleveln anpassen kannst:

For Each objItem In ActiveWorkbook.SlicerCaches("Datenschnitt_Cost_level_21").SlicerItems
    If objItem.Selected = False Then
        ActiveSheet.PivotTables("CCCockpit").PivotFields("Cost level 3").Orientation = xlRowField
    End If
Next

Du kannst ähnliche Blöcke für andere Datenschnitte und Pivot-Felder hinzufügen, um die Logik deiner hierarchischen Drilldowns zu vervollständigen.


Tipps für Profis

  • Nutze Application.EnableEvents = False am Anfang deines Makros, um zu verhindern, dass andere Ereignisse ausgelöst werden, während dein Makro läuft. Vergiss nicht, es am Ende wieder auf True zu setzen.

  • Halte deinen Code modular, indem du das Makro in kleinere Subroutinen aufteilst, die spezifische Aufgaben erledigen. Das verbessert die Lesbarkeit und Wartbarkeit des Codes.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur eine Auswahl in den Datenschnitten möglich ist?
Du kannst die Datenschnitt-Optionen so einstellen, dass nur eine Auswahl möglich ist, indem du die MultiSelect-Eigenschaft der Datenschnitte anpasst.

2. Was tun, wenn die Pivot-Tabelle nicht aktualisiert wird?
Überprüfe, ob das Makro korrekt an das PivotTableUpdate-Ereignis gebunden ist und ob die Datenschnitte korrekt konfiguriert sind.

3. Kann ich mehrere Datenschnitte gleichzeitig verwenden?
Ja, du kannst mehrere Datenschnitte in einer Pivot-Tabelle verwenden. Achte jedoch darauf, dass die Logik in deinem VBA-Code entsprechend angepasst wird, um alle Datenschnitte zu berücksichtigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige