Kurzfassung — Ein „SaveAs PDF“ gibt es in VBA nicht. Sie rufen
ExportAsFixedFormatfür ein Blatt, einen Bereich oder eine Arbeitsmappe auf, übergebenType:=xlTypePDFund einen vollständigen Pfad, der auf .pdf endet, und Excel rendert genau die Seiten, die es auch drucken würde. Das ist der ganze Kern: Ein PDF ist ein Druckauftrag, der in eine Datei geht. Druckbereich, Ausrichtung und Skalierung auf Seitenbreite entscheiden also, was im PDF landet — erst die Seite einrichten, dann exportieren.
Sub SaveReportAsPdf()
Dim pdfPath As String
pdfPath = ThisWorkbook.Path & "\Report_" & Format(Date, "yyyy-mm-dd") & ".pdf"
ThisWorkbook.Worksheets("Report").ExportAsFixedFormat _
Type:=xlTypePDF, Filename:=pdfPath, Quality:=xlQualityStandard, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
Die meisten landen hier, nachdem sie SaveAs mit einem .pdf-Namen probiert haben oder nachdem sie
Datei → Exportieren mit dem Makrorekorder aufgezeichnet und eine Zeile bekommen haben, die sie nicht
verstehen. Diese Anleitung eröffnet einen dreiteiligen Themenblock darüber, wie Ergebnisse aus Excel
herauskommen. Alle drei Teile hängen an derselben Pipeline. Page Setup legt fest,
was eine Seite ist — Druckbereich, Ausrichtung und Skalierung. PrintOut schickt
diese Seiten an einen Drucker. ExportAsFixedFormat, um das es hier geht, schickt dieselben Seiten in
eine PDF-Datei. Stimmt die Seite einmal, stimmen beide Ausgaben; stimmt sie nicht, rettet Sie keine
Exportoption.
Was Sie lernen
- Warum ein PDF aus Excel ein Druckauftrag ist und was das für Ihren Code bedeutet
- Der Aufruf von
ExportAsFixedFormatund die Argumente, auf die es wirklich ankommt - Ein Blatt, einen Bereich oder die ganze Arbeitsmappe exportieren
- Mehrere ausgewählte Blätter in ein einziges PDF packen
- Einen sicheren Dateipfad bauen — und der Laufzeitfehler 1004, den ein schlechter auslöst
- Die Abwägung:
ExportAsFixedFormatgegenüber dem „Drucken als PDF“
Das mentale Modell: Ein PDF ist ein Druck in eine Datei
Excel hat kein eigenes PDF-Layout. Beim Export paginiert es das Blatt genau so, wie es das für Papier tun würde — gleicher Druckbereich, gleiche Seitenumbrüche, gleiche Ränder, gleiche Kopf- und Fußzeile — und schreibt diese Seiten in eine Datei, statt sie an einen Drucker zu spoolen. Diese eine Tatsache erklärt fast jede Frage der Art „warum sieht mein PDF so aus“:
- Das PDF zerschneidet eine breite Tabelle auf zwei Seiten, weil die Seite im Hochformat bei 100 % steht.
- Das PDF enthält einen verirrten Zellblock weit unterhalb der Daten, weil der verwendete Bereich so weit reicht.
- Das PDF zeigt nur einen Teil des Blatts, weil vor Monaten ein Druckbereich gesetzt und nie gelöscht wurde.
Keines davon ist ein Exportproblem. Es sind Seitenprobleme, und sie werden in Page Setup behoben, bevor die Exportzeile läuft.
Der Aufruf von ExportAsFixedFormat
ExportAsFixedFormat gibt es für Worksheet, Range, Workbook und Chart. Die Argumente, die Sie
tatsächlich brauchen:
| Argument | Was es bewirkt |
|---|---|
Type |
xlTypePDF (oder xlTypeXPS). Pflichtangabe. |
Filename |
Der vollständige Pfad der zu erzeugenden Datei. Mit Ordner und .pdf. |
Quality |
xlQualityStandard für Druckqualität, xlQualityMinimum für eine kleinere Datei. |
IgnorePrintAreas |
False (Standard) beachtet den Druckbereich; True exportiert alles. |
From, To |
Ein Seitenbereich, etwa Seite 1 bis 3. |
OpenAfterPublish |
True öffnet das PDF danach im Standardbetrachter. |
Verwenden Sie benannte Argumente. Die Positionsform funktioniert zwar, aber
ExportAsFixedFormat xlTypePDF, p, , , True ist schon eine Woche später unlesbar, und die Reihenfolge ist
schnell vertauscht.
Ein Blatt, ein Bereich oder die ganze Arbeitsmappe
Das Objekt, für das Sie die Methode aufrufen, bestimmt den Umfang:
' Ein Blatt (beachtet den Druckbereich dieses Blatts)
Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
' Ein Bereich, unabhaengig vom Druckbereich
Worksheets("Report").Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
' Jedes sichtbare Blatt der Arbeitsmappe, in Registerreihenfolge
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
Die Bereichsform ist der schnellste Weg, „nur diesen Block“ auszuliefern, ohne den Druckbereich des Blatts anzufassen. Die Arbeitsmappenform lässt ausgeblendete Blätter weg — für Hilfsblätter und Nachschlagetabellen ist das meist genau richtig.
Mehrere ausgewählte Blätter in einem PDF
Um eine bestimmte Auswahl von Blättern zusammenzufassen — etwa eine Übersicht und zwei Detailregister —, markieren Sie sie als Gruppe und exportieren dann das aktive Blatt. Eine gruppierte Auswahl wird als ein Dokument exportiert:
Sub ExportChosenSheets(pdfPath As String)
ThisWorkbook.Worksheets(Array("Summary", "North", "South")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
ThisWorkbook.Worksheets("Summary").Select ' Gruppierung wieder aufheben
End Sub
Das ist eine der wenigen Stellen, an denen Select wirklich nötig ist; warum Sie es sonst meiden, steht in
Select and Activate. Heben Sie die Gruppierung danach immer auf: Wer in
gruppierte Blätter tippt, schreibt in alle gleichzeitig.
Für ein PDF pro Blatt nehmen Sie stattdessen eine Schleife und bilden den Namen aus jedem Blatt:
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & ws.Name & ".pdf"
End If
Next ws
Ein sicherer Dateipfad und der Fehler 1004, den er verhindert
Der Fehler, in den alle laufen, ist Laufzeitfehler 1004: Document not saved. The document may be open, or an error may have been encountered when saving. Er bedeutet so gut wie nie das, wonach er klingt. Die üblichen Ursachen:
- Der Ordner existiert nicht — Excel legt ihn nicht an. Erstellen Sie ihn vorher mit MkDir.
- Das PDF ist bereits in einem Betrachter geöffnet, der die Datei sperrt.
- Der Dateiname enthält ein Zeichen, das Windows verbietet, etwa
/aus einem Datum oder:aus einer Uhrzeit. - Es gibt nichts zu drucken — das Blatt oder der Druckbereich ist leer.
Ein bloßer Dateiname ohne Ordner ist kein Fehler, und genau das ist schlimmer: Das PDF landet im aktuellen Ordner von Excel (siehe CurDir), und der Benutzer findet es nie. Bauen Sie also immer den vollständigen Pfad und bereinigen Sie die Teile, die aus Daten stammen:
Function SafePdfPath(folder As String, baseName As String) As String
Dim bad As Variant
For Each bad In Array("/", "\", ":", "*", "?", """", "<", ">", "|")
baseName = Replace(baseName, bad, "-")
Next bad
If Dir(folder, vbDirectory) = "" Then MkDir folder
SafePdfPath = folder & "\" & baseName & ".pdf"
End Function
Soll der Benutzer den Speicherort selbst wählen, fragen Sie mit
GetSaveAsFilename und übergeben das Ergebnis als Filename — und prüfen
Sie auf False, denn das bedeutet, dass er abgebrochen hat.
Die Abwägung: exportieren statt als PDF drucken
Sie werden Code finden, der den aktiven Drucker auf Microsoft Print to PDF umstellt und PrintOut mit
einem Dateinamen aufruft. Übernehmen Sie ihn nicht. Er hängt an einem Druckernamen, der je nach Rechner und
Sprache anders lautet, er kann einen Speichern-Dialog aufpoppen lassen, der ein unbeaufsichtigtes Makro
blockiert, und er ändert nebenbei den aktiven Drucker des Benutzers. ExportAsFixedFormat ist in Excel
eingebaut, braucht überhaupt keinen Drucker und nimmt den Pfad als Argument. Die Regel ist einfach:
Papier geht über PrintOut, Dateien gehen über ExportAsFixedFormat. Und egal,
was Sie aufrufen — die gerenderte Seite wurde in Page Setup festgelegt. Dort wird
ein PDF repariert, das falsch aussieht.
Wie ExcelMaster hilft
PDF-Makros scheitern auf banale, sehr konkrete Weise: ein Ordner, den es noch nicht gibt, ein Datum mit Schrägstrichen im Dateinamen, ein Druckbereich aus dem letzten Quartal, eine Tabelle, die auf eine zweite Seite überläuft. Jedes davon zeigt sich als derselbe nichtssagende Fehler 1004 oder als PDF, das irgendwie nicht stimmt.
ExcelMaster lässt Sie sagen, was Sie wollen — „exportiere die Übersicht und beide Regionsregister in ein PDF mit dem Namen dieses Monats, Querformat, eine Seite breit“ — und schreibt Seiteneinrichtung, sicheren Pfad und Export in einem Zug, anschließend prüft es das Ergebnis. Das Makro gehört Ihnen, das Rätselraten entfällt.
Häufig gestellte Fragen
Wie speichere ich ein Excel-Blatt per VBA als PDF?
Rufen Sie ExportAsFixedFormat für das Blatt mit Type:=xlTypePDF und einem vollständigen Filename auf,
der auf .pdf endet, zum Beispiel
Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Out\Report.pdf". SaveAs hat
keine PDF-Option; die Exportmethode ist der unterstützte Weg.
Wie speichere ich nur einen Bereich als PDF?
Rufen Sie die Methode für den Bereich selbst auf: Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath. Damit wird genau dieser Block exportiert, unabhängig vom Druckbereich des Blatts — Sie
müssen den Druckbereich also nicht vor dem Export ändern und danach wiederherstellen.
Wie exportiere ich mehrere Blätter in ein PDF?
Markieren Sie die Blätter als Gruppe mit Worksheets(Array("Summary", "North")).Select und rufen Sie dann
ActiveSheet.ExportAsFixedFormat auf. Die gruppierte Auswahl wird als ein Dokument geschrieben. Markieren Sie
danach ein einzelnes Blatt, um die Gruppierung aufzuheben, damit spätere Eingaben nicht auf jedem Blatt landen.
Warum löst ExportAsFixedFormat den Laufzeitfehler 1004 aus?
Meist, weil der Ordner im Pfad nicht existiert, das PDF bereits in einem Betrachter geöffnet ist, der
Dateiname ein verbotenes Zeichen wie / oder : enthält oder es nichts zu drucken gibt. Bauen Sie den
vollständigen Pfad, legen Sie den Ordner vorher an und entfernen Sie unzulässige Zeichen aus allen Teilen,
die aus Daten stammen.
Warum zerschneidet mein PDF die Tabelle oder enthält zusätzliche Zellen?
Weil das PDF die Seiteneinrichtung des Blatts verwendet. Eine breite Tabelle im Hochformat bei 100 % bricht
über mehrere Seiten um, und ein verwendeter Bereich, der weit unter die Daten reicht, erzeugt leere Seiten.
Beheben Sie das vor dem Export in PageSetup — Ausrichtung, Druckbereich und Anpassen auf eine Seite Breite.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 29.09.2026.
Verwandte Anleitungen: VBA PrintOut · VBA Page Setup · VBA GetSaveAsFilename · VBA MkDir · VBA CurDir · VBA Outlook · VBA On Error
