Erstellen von PivotTables mit VBA
Swipe um das Menü anzuzeigen
Eine PivotTable fasst eine Tabelle zusammen, indem Felder in Zeilen, Spalten und Werte gezogen werden – und jede dieser Drag-and-Drop-Aktionen hat ein direktes VBA-Äquivalent. Das bedeutet, dass ein kompletter PivotTable-Bericht bei jedem Eintreffen neuer Daten durch ein Makro von Grund auf neu erstellt werden kann.
Erstellen einer PivotTable
Sub BuildProfitPivot()
Dim wsData As Worksheet, wsPivot As Worksheet
Dim tbl As ListObject
Dim pc As PivotCache
Dim pt As PivotTable
Set wsData = ThisWorkbook.Worksheets("Reports")
Set tbl = wsData.ListObjects("tblReports")
' start clean: remove an existing Pivot sheet if this has run before
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Pivot").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsPivot = ThisWorkbook.Worksheets.Add
wsPivot.Name = "Pivot"
Set pc = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=tbl.Range)
Set pt = pc.CreatePivotTable( _
TableDestination:=wsPivot.Range("A3"), _
TableName:="ptProfitByRegion")
With pt
.PivotFields("Region").Orientation = xlRowField
.PivotFields("Month").Orientation = xlColumnField
.AddDataField .PivotFields("Profit"), "Sum of Profit", xlSum
End With
End Sub
- Die Kombination von On Error Resume Next mit dem Umschalten von
DisplayAlertsund.Deleteist ein sicheres Muster für "Löschen, falls vorhanden": Das Löschen eines nicht existierenden Arbeitsblatts würde normalerweise einen Fehler auslösen und das Makro anhalten, aber On Error Resume Next weist VBA an, diesen spezifischen Fehler stillschweigend zu überspringen;DisplayAlerts = Falseunterdrückt Excels eigene Bestätigungsabfrage "Möchten Sie dieses Blatt wirklich löschen?"; Error GoTo 0unmittelbar danach schaltet die normale Fehlerberichterstattung wieder ein — würdeOn Error Resume Nextfür den Rest desSubaktiv bleiben, würden auch alle späteren, nicht zusammenhängenden Fehler stillschweigend ignoriert, was vermieden werden sollte;ThisWorkbook.PivotCaches.Createerstellt einen Schnappschuss der Tabellendaten — den PivotCache, nicht die PivotTable selbst —, welcher das Objekt ist, aus dem jede PivotTable im Hintergrund tatsächlich aufgebaut wird;pc.CreatePivotTablewandelt diesen Schnappschuss in eine sichtbare PivotTable um, die ab Zelle A3 auf dem neuen Pivot-Blatt platziert und mit dem Namen ptProfitByRegion versehen wird, sodass späterer Code (wie RefreshTable) sie wieder anhand des Namens finden kann;PivotFields("Region").Orientation = xlRowFieldund die darunterstehende Zeile für Month entsprechen im Code direkt dem Ziehen von Region in das Zeilenfeld und Month in das Spaltenfeld in der Feldliste;AddDataFieldbefüllt den Wertebereich — das zweite Argument ("Sum of Profit") ist lediglich die von Excel angezeigte Spaltenüberschrift, und xlSum gibt an, dass die Werte addiert und nicht gemittelt oder gezählt werden.
Aktualisieren von Berichten
Sobald eine PivotTable existiert, wird sie nicht jedes Mal neu erstellt, wenn neue Daten eintreffen — sie wird aktualisiert, was schneller ist und alle manuellen Layoutanpassungen eines Benutzers beibehält:
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
Diese einzelne Zeile liest den PivotCache aus dem aktuellen Stand von tblReports erneut ein und aktualisiert jede Zahl in der PivotTable entsprechend — das Layout bleibt jedoch exakt erhalten, einschließlich aller Spaltenbreiten, Zahlenformate oder Feldanordnungen, die ein Benutzer nach dem ersten Erstellen der Pivot manuell angepasst hat. Das ist der entscheidende Vorteil gegenüber einem erneuten Aufruf von BuildProfitPivot: Ein kompletter Neuaufbau würde das Blatt neu erstellen und alle manuellen Anpassungen löschen.
Aktualisieren von PivotCharts
Ein auf einer PivotTable basierendes PivotChart aktualisiert seine Daten automatisch, sobald die PivotTable aktualisiert wird — daher reicht es für ein Berichtsmakro in der Regel aus, nur die Tabelle zu aktualisieren, um auch ein verknüpftes Diagramm auf dem neuesten Stand zu halten:
Dim pt As PivotTable
Set pt = ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion")
pt.RefreshTable
' any PivotChart based on pt updates automatically — no extra code needed
Dies steht im Gegensatz zu den normalen Diagrammen, die im nächsten Abschnitt behandelt werden: Ein reguläres Diagramm benötigt einen expliziten SetSourceData-Aufruf, um auf neue Daten zu verweisen, während ein PivotChart dauerhaft mit seiner PivotTable verknüpft ist und automatisch folgt. Wenn ein Dashboard ein Diagramm benötigt, das immer die neuesten PivotTable-Werte mit minimalem Codeaufwand widerspiegelt, ist die Erstellung als PivotChart in der Regel die bessere Wahl.
Aufgabe
BuildProfitPivotexakt wie gezeigt ausführen und bestätigen, dass ein neues "Pivot"-Blatt erscheint, mit Region in den Zeilen und Month in den Spalten.- Manuell eine neue März-Zeile zu
tblReportsfür eine fiktive sechste Region hinzufügen, dann nur die RefreshTable-Zeile ausführen — bestätigen, dass die Pivot aktualisiert wird, ohne sie komplett neu zu erstellen. BuildProfitPivotso anpassen, dass Sales statt Profit zusammengefasst werden, und Region und Month tauschen, sodass Month in den Zeilen und Region in den Spalten steht.
Hier ist der Code, um eine sechste Region als neue März-Zeile in tblReports hinzuzufügen, wobei ListRows.Add verwendet wird, anstatt sie manuell einzutragen:
Sub AddSixthRegion()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "March" ' Month
newRow.Range(1, 2).Value = "Southwest" ' Region
newRow.Range(1, 3).Value = 41500 ' Sales
newRow.Range(1, 4).Value = 28200 ' Expenses
newRow.Range(1, 5).Value = 13300 ' Profit
newRow.Range(1, 6).Value = 39000 ' Target
End Sub
Führen Sie dies einmal aus und starten Sie dann das RefreshProfitPivot-Makro aus dem vorherigen Abschnitt – die Pivot-Tabelle sollte nun "Southwest" als neue Zeile neben North, South, East, West und Central anzeigen, ohne dass das Pivot-Erstellungs-Makro erneut angepasst werden musste.
1. Ausführen von BuildProfitPivot wie vorgegeben
- Kopieren Sie das
Subexakt wie im Kapitel angegeben in Ihr Modul und führen Sie es einmal aus. - Überprüfen Sie den Projekt-Explorer oder Ihre Blattregister – ein neues Blatt mit dem Namen "Pivot" sollte erscheinen, mit Region in den Zeilen und Month in den Spalten, wobei Profit summiert wird.
2. Hinzufügen einer sechsten Region und nur aktualisieren
- Geben Sie die neue Zeile direkt im Arbeitsblatt ein (nicht per Code) – gehen Sie ans Ende von
tblReportsund fügen Sie eine März-Zeile für eine erfundene Region, z. B. "Southwest", hinzu. - Führen Sie nicht erneut
BuildProfitPivotaus – das würde das gesamte Pivot-Blatt löschen und neu erstellen, was dem Zweck dieser Übung widerspricht. - Führen Sie stattdessen nur die einzeilige
RefreshTable-Anweisung aus dem Kapitel aus – Sie müssen die bestehende PivotTable wie im Refresh-Beispiel des Kapitels beim Namen referenzieren.
3. Felder tauschen und zusammengefassten Wert ändern
- Drei Zeilen im
With pt-Block müssen geändert werden: welches Feld alsxlRowField, welches alsxlColumnFieldund auf welches Feld sichAddDataFieldbezieht. - Geben Sie dieser modifizierten Version einen anderen
Sub-Namen und einen anderenTableName– die Wiederverwendung der gleichen Namen wie im Original würde entweder zu einem Fehler führen oder die erste Pivot-Tabelle stillschweigend überschreiben. - Die Bezeichnung, die an
AddDataFieldübergeben wird (das zweite Argument, z. B."Sum of Profit"), ist nur Anzeigetext – passen Sie sie an das an, was Sie tatsächlich zusammenfassen.
Punkt 2 – nach dem manuellen Hinzufügen der sechsten Regionszeile führen Sie nur Folgendes aus:
Sub RefreshProfitPivot()
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
End Sub
Punkt 3 – eine separate, modifizierte Version:
Sub BuildSalesPivotByMonth()
Dim wsData As Worksheet, wsPivot As Worksheet
Dim tbl As ListObject
Dim pc As PivotCache
Dim pt As PivotTable
Set wsData = ThisWorkbook.Worksheets("Reports")
Set tbl = wsData.ListObjects("tblReports")
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("SalesPivot").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsPivot = ThisWorkbook.Worksheets.Add
wsPivot.Name = "SalesPivot"
Set pc = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=tbl.Range)
Set pt = pc.CreatePivotTable( _
TableDestination:=wsPivot.Range("A3"), _
TableName:="ptSalesByMonth")
With pt
.PivotFields("Month").Orientation = xlRowField
.PivotFields("Region").Orientation = xlColumnField
.AddDataField .PivotFields("Sales"), "Sum of Sales", xlSum
End With
End Sub
Führen Sie BuildSalesPivotByMonth aus und Sie erhalten ein neues Blatt "SalesPivot" mit Month in den Zeilen, Region in den Spalten und Sales-Summen im Tabellenkörper – das Spiegelbild des ursprünglichen Layouts.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen