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
| Konstante | Bedeutung |
|---|---|
acViewPreview | Seitenansicht am Bildschirm |
acViewNormal | direkt drucken |
acViewReport | Berichtsansicht (interaktiv) |
acViewDesign | Entwurfsansicht |
Achtung:
acViewNormaldruckt sofort ohne Rückfrage. Zum Testen nimmacViewPreview, 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
SendObjectden kompletten Bericht an.
Zusammengefasst
DoCmd.OpenReportmitacViewPreviewzeigt an,acViewNormaldruckt sofort.WhereConditionist einWHEREohne das Wort — Text in'...', Datum in#...#.DoCmd.OutputTo acOutputReport … acFormatPDFerzeugt 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.