Erstellung Automatisierter Berichte
Swipe um das Menü anzuzeigen
Das Muster für Monatsberichte Jeder automatisierte Bericht in diesem Kurs folgt demselben Ablauf: alten Zustand löschen, Daten filtern oder zusammenfassen, die visuelle Ausgabe aktualisieren oder neu erstellen, Präsentationsformatierung anwenden und dem Benutzer die Fertigstellung bestätigen.
Durchgearbeitetes Beispiel: Monatsbericht mit einem Klick
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Die fünf nummerierten Kommentare sind nicht nur Beschriftungen – sie machen das zuvor beschriebene Berichtsmuster wörtlich, ein Schritt pro Phase. Einige Details, die besonders hervorzuheben sind:
targetMonth As String, oben festgelegt, ist die eine Zeile, die Sie laut Aufgabe auf "January" ändern sollen – da jeder weitere Schritt auf diese einzelne Variable zugreift und nicht das Wort "March" mehrfach im Sub steht, muss für einen anderen Berichtsmonat nur eine einzige Zeile angepasst werden;- Schritt 3 umschließt RefreshTable mit On Error Resume Next / On Error GoTo 0, aus demselben Grund wie das Pivot-Makro in Abschnitt 4.3: Falls das Pivot-Blatt noch nicht existiert, würde diese Zeile sonst einen Fehler auslösen und das gesamte Makro stoppen, statt einfach einen noch nicht vorbereiteten Schritt zu überspringen;
- Schritt 4 setzt PrintArea = tbl.Range.Address und koppelt so den Druckbereich direkt an die Adresse der Tabelle. Werden später Zeilen per ListRows.Add hinzugefügt, passt der Druckbereich weiterhin exakt zu den Daten – eine separate Pflege des Druckbereichs entfällt;
- Schritt 5 fügt targetMonth in den Bestätigungstext der MsgBox ein, sodass die Meldung immer den tatsächlich verarbeiteten Monat nennt.
Dashboard-Aktualisierung
Wenn eine Arbeitsmappe mehrere PivotTables und Diagramme enthält, die ein Dashboard-Blatt speisen, berechnet RefreshAll jede Datenverbindung und jeden PivotCache in einem Schritt neu – die Ein-Zeilen-Version dessen, was GenerateMonthlyReport für eine einzelne PivotTable erledigt: ThisWorkbook.RefreshAll
Diese eine Zeile übernimmt denselben Schritt wie Schritt 3 in GenerateMonthlyReport, nur auf die gesamte Arbeitsmappe angewendet statt auf eine einzelne PivotTable – nützlich, sobald ein Dashboard mehrere PivotTables, externe Datenverbindungen oder verknüpfte Abfragen enthält, die alle synchron bleiben müssen.
Exportbereite Formatierung
Über die Seiteneinrichtung hinaus muss ein fertiger Bericht oft Excel ganz verlassen. ExportAsFixedFormat erzeugt direkt aus dem Code ein PDF:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path gibt den Ordner zurück, in dem die aktuelle Arbeitsmappe gespeichert ist, ohne abschließenden Backslash – deshalb wird der Dateiname durch explizites Anhängen von "\March_Report.pdf" zusammengesetzt. Wurde ThisWorkbook noch nicht gespeichert, liefert .Path einen leeren String und diese Zeile versucht, nur unter "\March_Report.pdf" im Stammverzeichnis des aktuellen Laufwerks zu speichern. Es empfiehlt sich daher, sicherzustellen, dass die Arbeitsmappe mindestens einmal gespeichert wurde, bevor dieses Muster verwendet wird.
Aufgabe
- Tippen Sie
GenerateMonthlyReportexakt wie gezeigt (das Pivot-Blatt aus den vorherigen Kapiteln muss bereits existieren) und führen Sie es aus. Bestätigen Sie, dass die Tabelle auf März gefiltert wird und das Pivot aktualisiert wird. - Ändern Sie targetMonth auf "January" und führen Sie das Makro erneut aus – bestätigen Sie, dass der Bericht nun den neuen Monat widerspiegelt.
- Fügen Sie am Ende des Subs, vor der MsgBox, eine Zeile hinzu, die das Blatt Reports mit ExportAsFixedFormat wie oben gezeigt als PDF exportiert.
1. Ausführen von GenerateMonthlyReport wie vorgegeben
- Stellen Sie sicher, dass das Pivot-Blatt und die PivotTable
ptProfitByRegionaus der vorherigen Kapitelaufgabe tatsächlich existieren – diesesSubaktualisiert eine bestehende PivotTable, es erstellt keine neue. - Tippen Sie die Prozedur exakt wie gezeigt, führen Sie sie aus und prüfen Sie zwei Dinge: Die Tabelle Reports sollte jetzt nur noch Zeilen für März anzeigen und die Zahlen im Pivot-Blatt sollten dies widerspiegeln (das Pivot selbst fasst allerdings weiterhin alle Monate zusammen, da PivotCaches den gesamten Bereich und nicht nur die gefilterte Ansicht lesen).
2. targetMonth auf Januar ändern
- Es muss nur eine Zeile geändert werden – die Zuweisung
targetMonth = "March"am Anfang. - Führen Sie das gesamte
Suberneut aus und bestätigen Sie, dass die Tabelle Reports nun auf Januar filtert.
3. Hinzufügen einer PDF-Exportzeile
- Dies ist exakt dieselbe
ExportAsFixedFormat-Zeile wie zuvor im Kapitel – Sie exportieren das Arbeitsblattws, nicht die gesamte Arbeitsmappe. - Erstellen Sie den Dateinamen wie im Rechnungsbeispiel des Kapitels: Kombinieren Sie
ThisWorkbook.Pathmit einem Namen, dertargetMonthenthält, sodass jeder Durchlauf eine eindeutig benannte Datei erzeugt und nicht immer dieselbe überschreibt. - Die Platzierung ist wichtig: Die Zeile muss nach den Schritten zum Filtern/Aktualisieren/Formatieren, aber vor der abschließenden
MsgBoxstehen – andernfalls würde die Bestätigungsmeldung erscheinen, bevor die Datei tatsächlich existiert.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Führen Sie das Makro einmal mit targetMonth = "March" und einmal mit "January" aus – Sie sollten anschließend zwei separate PDFs (March_Report.pdf und January_Report.pdf) neben Ihrer Arbeitsmappe finden, die jeweils die zum Ausführungszeitpunkt korrekt gefilterten Daten enthalten.
Wenn ein Dialogfeld erscheint, in dem Sie aufgefordert werden, einen Drucker auszuwählen (anstatt dass der Code sofort fehlschlägt), wählen Sie eine beliebige verfügbare Option – einschließlich "Microsoft Print to PDF", "Microsoft XPS Document Writer" oder jeden anderen aufgeführten Drucker, sogar einen Fax-Treiber. Welcher Drucker gewählt wird, spielt hier keine Rolle; VBA benötigt lediglich irgendeinen ausgewählten Drucker, um den PageSetup-/Exportvorgang auszuführen, da Excel diese Vorgänge im Hintergrund immer über das Druckersystem abwickelt, unabhängig davon, welcher Drucker aktiv ist.
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
Erstellung Automatisierter Berichte
Das Muster für Monatsberichte Jeder automatisierte Bericht in diesem Kurs folgt demselben Ablauf: alten Zustand löschen, Daten filtern oder zusammenfassen, die visuelle Ausgabe aktualisieren oder neu erstellen, Präsentationsformatierung anwenden und dem Benutzer die Fertigstellung bestätigen.
Durchgearbeitetes Beispiel: Monatsbericht mit einem Klick
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Die fünf nummerierten Kommentare sind nicht nur Beschriftungen – sie machen das zuvor beschriebene Berichtsmuster wörtlich, ein Schritt pro Phase. Einige Details, die besonders hervorzuheben sind:
targetMonth As String, oben festgelegt, ist die eine Zeile, die Sie laut Aufgabe auf "January" ändern sollen – da jeder weitere Schritt auf diese einzelne Variable zugreift und nicht das Wort "March" mehrfach im Sub steht, muss für einen anderen Berichtsmonat nur eine einzige Zeile angepasst werden;- Schritt 3 umschließt RefreshTable mit On Error Resume Next / On Error GoTo 0, aus demselben Grund wie das Pivot-Makro in Abschnitt 4.3: Falls das Pivot-Blatt noch nicht existiert, würde diese Zeile sonst einen Fehler auslösen und das gesamte Makro stoppen, statt einfach einen noch nicht vorbereiteten Schritt zu überspringen;
- Schritt 4 setzt PrintArea = tbl.Range.Address und koppelt so den Druckbereich direkt an die Adresse der Tabelle. Werden später Zeilen per ListRows.Add hinzugefügt, passt der Druckbereich weiterhin exakt zu den Daten – eine separate Pflege des Druckbereichs entfällt;
- Schritt 5 fügt targetMonth in den Bestätigungstext der MsgBox ein, sodass die Meldung immer den tatsächlich verarbeiteten Monat nennt.
Dashboard-Aktualisierung
Wenn eine Arbeitsmappe mehrere PivotTables und Diagramme enthält, die ein Dashboard-Blatt speisen, berechnet RefreshAll jede Datenverbindung und jeden PivotCache in einem Schritt neu – die Ein-Zeilen-Version dessen, was GenerateMonthlyReport für eine einzelne PivotTable erledigt: ThisWorkbook.RefreshAll
Diese eine Zeile übernimmt denselben Schritt wie Schritt 3 in GenerateMonthlyReport, nur auf die gesamte Arbeitsmappe angewendet statt auf eine einzelne PivotTable – nützlich, sobald ein Dashboard mehrere PivotTables, externe Datenverbindungen oder verknüpfte Abfragen enthält, die alle synchron bleiben müssen.
Exportbereite Formatierung
Über die Seiteneinrichtung hinaus muss ein fertiger Bericht oft Excel ganz verlassen. ExportAsFixedFormat erzeugt direkt aus dem Code ein PDF:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path gibt den Ordner zurück, in dem die aktuelle Arbeitsmappe gespeichert ist, ohne abschließenden Backslash – deshalb wird der Dateiname durch explizites Anhängen von "\March_Report.pdf" zusammengesetzt. Wurde ThisWorkbook noch nicht gespeichert, liefert .Path einen leeren String und diese Zeile versucht, nur unter "\March_Report.pdf" im Stammverzeichnis des aktuellen Laufwerks zu speichern. Es empfiehlt sich daher, sicherzustellen, dass die Arbeitsmappe mindestens einmal gespeichert wurde, bevor dieses Muster verwendet wird.
Aufgabe
- Tippen Sie
GenerateMonthlyReportexakt wie gezeigt (das Pivot-Blatt aus den vorherigen Kapiteln muss bereits existieren) und führen Sie es aus. Bestätigen Sie, dass die Tabelle auf März gefiltert wird und das Pivot aktualisiert wird. - Ändern Sie targetMonth auf "January" und führen Sie das Makro erneut aus – bestätigen Sie, dass der Bericht nun den neuen Monat widerspiegelt.
- Fügen Sie am Ende des Subs, vor der MsgBox, eine Zeile hinzu, die das Blatt Reports mit ExportAsFixedFormat wie oben gezeigt als PDF exportiert.
1. Ausführen von GenerateMonthlyReport wie vorgegeben
- Stellen Sie sicher, dass das Pivot-Blatt und die PivotTable
ptProfitByRegionaus der vorherigen Kapitelaufgabe tatsächlich existieren – diesesSubaktualisiert eine bestehende PivotTable, es erstellt keine neue. - Tippen Sie die Prozedur exakt wie gezeigt, führen Sie sie aus und prüfen Sie zwei Dinge: Die Tabelle Reports sollte jetzt nur noch Zeilen für März anzeigen und die Zahlen im Pivot-Blatt sollten dies widerspiegeln (das Pivot selbst fasst allerdings weiterhin alle Monate zusammen, da PivotCaches den gesamten Bereich und nicht nur die gefilterte Ansicht lesen).
2. targetMonth auf Januar ändern
- Es muss nur eine Zeile geändert werden – die Zuweisung
targetMonth = "March"am Anfang. - Führen Sie das gesamte
Suberneut aus und bestätigen Sie, dass die Tabelle Reports nun auf Januar filtert.
3. Hinzufügen einer PDF-Exportzeile
- Dies ist exakt dieselbe
ExportAsFixedFormat-Zeile wie zuvor im Kapitel – Sie exportieren das Arbeitsblattws, nicht die gesamte Arbeitsmappe. - Erstellen Sie den Dateinamen wie im Rechnungsbeispiel des Kapitels: Kombinieren Sie
ThisWorkbook.Pathmit einem Namen, dertargetMonthenthält, sodass jeder Durchlauf eine eindeutig benannte Datei erzeugt und nicht immer dieselbe überschreibt. - Die Platzierung ist wichtig: Die Zeile muss nach den Schritten zum Filtern/Aktualisieren/Formatieren, aber vor der abschließenden
MsgBoxstehen – andernfalls würde die Bestätigungsmeldung erscheinen, bevor die Datei tatsächlich existiert.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Führen Sie das Makro einmal mit targetMonth = "March" und einmal mit "January" aus – Sie sollten anschließend zwei separate PDFs (March_Report.pdf und January_Report.pdf) neben Ihrer Arbeitsmappe finden, die jeweils die zum Ausführungszeitpunkt korrekt gefilterten Daten enthalten.
Wenn ein Dialogfeld erscheint, in dem Sie aufgefordert werden, einen Drucker auszuwählen (anstatt dass der Code sofort fehlschlägt), wählen Sie eine beliebige verfügbare Option – einschließlich "Microsoft Print to PDF", "Microsoft XPS Document Writer" oder jeden anderen aufgeführten Drucker, sogar einen Fax-Treiber. Welcher Drucker gewählt wird, spielt hier keine Rolle; VBA benötigt lediglich irgendeinen ausgewählten Drucker, um den PageSetup-/Exportvorgang auszuführen, da Excel diese Vorgänge im Hintergrund immer über das Druckersystem abwickelt, unabhängig davon, welcher Drucker aktiv ist.
Danke für Ihr Feedback!