Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Erstellung Automatisierter Berichte | Tabellen und Berichte Automatisieren
Excel VBA für Geschäftsautomatisierung

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

  1. Tippen Sie GenerateMonthlyReport exakt 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.
  2. Ändern Sie targetMonth auf "January" und führen Sie das Makro erneut aus – bestätigen Sie, dass der Bericht nun den neuen Monat widerspiegelt.
  3. 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.
Hinweise
expand arrow

1. Ausführen von GenerateMonthlyReport wie vorgegeben

  • Stellen Sie sicher, dass das Pivot-Blatt und die PivotTable ptProfitByRegion aus der vorherigen Kapitelaufgabe tatsächlich existieren – dieses Sub aktualisiert 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 Sub erneut 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 Arbeitsblatt ws, nicht die gesamte Arbeitsmappe.
  • Erstellen Sie den Dateinamen wie im Rechnungsbeispiel des Kapitels: Kombinieren Sie ThisWorkbook.Path mit einem Namen, der targetMonth enthä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 MsgBox stehen – andernfalls würde die Bestätigungsmeldung erscheinen, bevor die Datei tatsächlich existiert.
Lösung
expand arrow
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.

Note
Hinweis

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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 5

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

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

  1. Tippen Sie GenerateMonthlyReport exakt 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.
  2. Ändern Sie targetMonth auf "January" und führen Sie das Makro erneut aus – bestätigen Sie, dass der Bericht nun den neuen Monat widerspiegelt.
  3. 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.
Hinweise
expand arrow

1. Ausführen von GenerateMonthlyReport wie vorgegeben

  • Stellen Sie sicher, dass das Pivot-Blatt und die PivotTable ptProfitByRegion aus der vorherigen Kapitelaufgabe tatsächlich existieren – dieses Sub aktualisiert 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 Sub erneut 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 Arbeitsblatt ws, nicht die gesamte Arbeitsmappe.
  • Erstellen Sie den Dateinamen wie im Rechnungsbeispiel des Kapitels: Kombinieren Sie ThisWorkbook.Path mit einem Namen, der targetMonth enthä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 MsgBox stehen – andernfalls würde die Bestätigungsmeldung erscheinen, bevor die Datei tatsächlich existiert.
Lösung
expand arrow
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.

Note
Hinweis

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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 5
some-alt