Lektionen/Formulare & Berichte

Berichte automatisch als PDF

Fortgeschritten9 Min. Lesezeit

Berichte sind das Aushängeschild deiner Datenbank: Rechnungen, Lieferscheine, Monatsauswertungen. Mit VBA machst du daraus einen Knopfdruck. Du öffnest Berichte gefiltert, exportierst sie als PDF und erzeugst bei Bedarf gleich hundert einzelne Dateien — eine pro Kunde — vollautomatisch.

Einen Bericht öffnen

Der Einstieg ist DoCmd.OpenReport. Wichtig ist der zweite Parameter, die Ansicht:

' Am Bildschirm anzeigen (Seitenansicht)
DoCmd.OpenReport "rptRechnung", acViewPreview

' Direkt an den Drucker schicken
DoCmd.OpenReport "rptRechnung", acViewNormal
KonstanteBedeutung
acViewPreviewSeitenansicht am Bildschirm
acViewNormaldirekt drucken
acViewReportBerichtsansicht (interaktiv)
acViewDesignEntwurfsansicht

Achtung: acViewNormal druckt sofort ohne Rückfrage. Zum Testen nimm acViewPreview, damit dir nicht die halbe Papierschublade wegläuft.

Nur bestimmte Datensätze: WhereCondition

Selten willst du den ganzen Bericht. Der vierte Parameter WhereCondition ist ein SQL-WHERE-Ausdruck ohne das Wort WHERE:

Dim kundenID As Long
kundenID = 42

DoCmd.OpenReport "rptRechnung", acViewPreview, , "KundenID = " & kundenID

Bei Text musst du den Wert in Anführungszeichen setzen, bei Datum in #...# im US-Format:

DoCmd.OpenReport "rptUmsatz", acViewPreview, , _
    "Land = 'Deutschland' And Datum >= #2026-01-01#"

Als PDF exportieren mit OutputTo

Der eigentliche PDF-Export läuft über DoCmd.OutputTo. Der Bericht muss dazu nicht geöffnet sein — Access rendert ihn im Hintergrund:

DoCmd.OutputTo acOutputReport, "rptRechnung", acFormatPDF, _
    "C:\Rechnungen\Rechnung.pdf"

Die Parameter der Reihe nach:

  • acOutputReport — es ist ein Bericht (nicht Formular, Abfrage, Tabelle).
  • "rptRechnung" — der Name des Berichts.
  • acFormatPDF — das Zielformat.
  • der Dateipfad — wohin gespeichert wird.

Setzt du hinter dem Pfad noch True, öffnet Access die fertige PDF gleich im Standard-Viewer:

DoCmd.OutputTo acOutputReport, "rptRechnung", acFormatPDF, _
    "C:\Rechnungen\Rechnung.pdf", True

Gefiltert exportieren

OutputTo selbst kennt keinen Filter. Der Trick: Bericht erst gefiltert öffnen, dann exportieren, dann schließen. So landet nur der gewünschte Datensatz in der PDF.

Public Sub RechnungAlsPDF(ByVal kundenID As Long)
    Dim pfad As String
    pfad = "C:\Rechnungen\Rechnung_" & kundenID & ".pdf"

    DoCmd.OpenReport "rptRechnung", acViewPreview, , "KundenID = " & kundenID
    DoCmd.OutputTo acOutputReport, "rptRechnung", acFormatPDF, pfad
    DoCmd.Close acReport, "rptRechnung"

    MsgBox "PDF gespeichert:" & vbCrLf & pfad, vbInformation
End Sub

Viele PDFs auf einmal: die Schleife

Der große Zeitgewinn: Du gehst mit einem Recordset über alle Kunden und erzeugst für jeden eine eigene PDF. Den Dateinamen baust du dynamisch zusammen.

Public Sub AlleRechnungenExportieren()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim pfad As String
    Dim zielordner As String

    zielordner = "C:\Rechnungen\"
    Set db = CurrentDb
    Set rs = db.OpenRecordset( _
        "SELECT KundenID, Kundenname FROM tblKunden WHERE Aktiv = True", _
        dbOpenSnapshot)

    Do Until rs.EOF
        ' Dateiname: 00042_Mueller_GmbH.pdf
        pfad = zielordner _
             & Format(rs!KundenID, "00000") & "_" _
             & SaeuberNamen(rs!Kundenname) & ".pdf"

        DoCmd.OpenReport "rptRechnung", acViewPreview, , _
            "KundenID = " & rs!KundenID
        DoCmd.OutputTo acOutputReport, "rptRechnung", acFormatPDF, pfad
        DoCmd.Close acReport, "rptRechnung"

        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set db = Nothing

    MsgBox "Alle Rechnungen wurden als PDF exportiert.", vbInformation
End Sub

Weil Windows in Dateinamen keine Zeichen wie \ / : * ? " < > | erlaubt, filterst du den Kundennamen vorher. Eine kleine Hilfsfunktion räumt auf:

Private Function SaeuberNamen(ByVal txt As String) As String
    Dim verboten As Variant, z As Variant
    verboten = Array("\", "/", ":", "*", "?", """", "<", ">", "|", " ")
    For Each z In verboten
        txt = Replace(txt, z, "_")
    Next z
    SaeuberNamen = txt
End Function

Direkt per E-Mail verschicken

Statt die PDF nur zu speichern, kannst du sie mit DoCmd.SendObject als Anhang an eine Mail hängen. Access erzeugt das PDF dabei selbst:

DoCmd.SendObject acSendReport, "rptRechnung", acFormatPDF, _
    "kunde@example.com", , , _
    "Ihre Rechnung", "Guten Tag,\n\nanbei Ihre Rechnung als PDF.", False

Der letzte Parameter False (EditMessage) schickt ohne Zwischenanzeige — bei True öffnet sich die Mail noch zum Prüfen. SendObject nutzt den installierten Mail-Client (z. B. Outlook); für Massenversand mit voller Kontrolle steuerst du Outlook besser direkt per Automation, was Thema einer späteren Lektion ist.

Hinweis: Filtere auch beim Versand vorher über einen geöffneten Bericht, wenn jeder Kunde nur seine eigene Rechnung bekommen soll — sonst hängt SendObject den kompletten Bericht an.

Zusammengefasst

  • DoCmd.OpenReport mit acViewPreview zeigt an, acViewNormal druckt sofort.
  • WhereCondition ist ein WHERE ohne das Wort — Text in '...', Datum in #...#.
  • DoCmd.OutputTo acOutputReport … acFormatPDF erzeugt die PDF-Datei.
  • Für Serien: gefiltert öffnen → exportieren → schließen in einer Recordset-Schleife.
  • Dateinamen dynamisch bauen und unerlaubte Zeichen entfernen; Versand per DoCmd.SendObject.
Nächste Lektion
Module versionieren mit SaveAsText & LoadFromText