Wenn man ein Dokument per VBA zusammengestellt hat, möchte man dieses gegebenenfalls auch noch weiterverarbeiten. Zum Beispiel, indem man es unter einen bestimmten Dateinamen speichert. Eine weitere Anforderung könnte sein, dass man das Dokument direkt als PDF-Dokument sichern möchte. Wie das gelingt, schauen wir uns in diesem Artikel an. Und wir gehen noch einen Schritt weiter und betrachten, wie wir bestimmte Bereiche oder auch jede einzelne Seite in einem PDF-Dokument speichern können.
In vielen Fällen sollen Word-Dokumente nicht im Format .docx weitergegeben werden. Einer der Gründe ist, dass wir nicht wollen, dass der Empfänger das Dokument bearbeiten oder die Inhalte auf einfache Weise extrahieren kann. Eine gute Lösung ist dann die Erstellung eines PDF-Dokuments. Dieses kann man auf allen Systemen mit entsprechenden Readern anzeigen und auch im Webbrowser erscheinen diese ohne Probleme.
Während man meist komplette Dokumente in eine PDF-Datei exportieren möchte, kommt es auch vor, dass ein Word-Dokument bereits mehrere Teildokumente enthält, die einzelnen exportiert werden sollen. Und ein weiterer Fall ist, dass wir nur bestimmte Seiten aus einem Dokument extrahieren wollen, andere jedoch nicht.
Dokument als .dotm speichern
Um einem eventuellen Verlust des nachfolgend erstellten VBA-Codes vorzubeugen, haben wir das Dokument direkt als .dotm-Dokument gespeichert. Die Prozeduren haben wir in das Modul ThisDocument eingefügt.
Komplettes Dokument als PDF speichern
Wir beginnen mit dem einfachsten Fall: Wir wollen alle Seiten des Dokuments in einer PDF-Datei speichern. Diesen Fall haben wir in der Prozedur PDFSpeichern aus Listing 1 abgedeckt. Hier deklarieren wir eine Variable des Typs Word.Document, um das zu extrahierende Dokument zu referenzieren. Das erledigen wir anschließend über die Eigenschaft ActiveDocument, die einen Verweis auf das aktuell angezeigte Dokument liefert.
Public Sub PDFSpeichern() Dim doc As Word.Document Dim strDateipfad As String Set doc = ActiveDocument strDateipfad = doc.Path & "\Export.pdf" doc.ExportAsFixedFormat OutputFileName:=strDateipfad, ExportFormat:=wdExportFormatPDF Set doc = Nothing End Sub
Listing 1: Speichern des kompletten Dokuments
Schließlich wollen wir noch den Namen der zu erstellenden Datei definieren. Die neue Datei soll im gleichen Verzeichnis wie das Original landen. Dieses ermitteln wir mit doc.Path. Fügen wir noch \Export.pdf an, erhalten wir den vollständigen Pfad.
Die eigentliche Arbeit übernimmt die Methode ExportAsFixedFormat des Document-Objekts. Dieser übergeben wir für den Parameter OutputFileName den Pfad aus der Variablen strDateipfad und als ExportFormat den Wert wdExportFormatPDF.
Das Ausführen der Prozedur sorgt für das Anlegen der Datei im gleichen Verzeichnis wie die Originaldatei.
PDF unter gleichem Namen speichern
Wir können noch ein wenig verfeinern, wenn wir wollen, dass das Dokument unter dem gleichen Namen wie das Original gespeichert wird – nur mit der Dateiendung .pdf statt.docx.
Dazu ermitteln wir mit doc.Name den Namen des Dokuments und ersetzen mit der Replace-Methode die Dateiendung .docx durch .pdf.
Damit wir den Code überhaupt ausführen können, verwenden wir eine Word-Datei mit der Dateiendung .docm. Also ersetzen wir auch diese Dateiendung noch durch .pdf (siehe Listing 2).
Public Sub PDFSpeichernGleicherName() Dim doc As Word.Document Dim strDateipfad As String Dim strDateiname As String Set doc = ActiveDocument strDateiname = Replace(doc.Name, ".docx", ".pdf") strDateiname = Replace(strDateiname, ".docm", ".pdf") strDateipfad = doc.Path & "\" & strDateiname doc.ExportAsFixedFormat OutputFileName:=strDateipfad, ExportFormat:=wdExportFormatPDF Set doc = Nothing End Sub
Listing 2: Speichern des kompletten Dokuments mit dem gleichen Namen und der Endung .pdf
Die ExportAsFixedFormat-Methode
Bevor wir weitere Anwendungsfälle wie das Extrahieren einzelner Seiten oder eines bestimmten Bereichs betrachten, wollen wir einen Blick auf die Parameter der Methode ExportAsFixedFormat werfen.
Diese lauten:
- OutputFileName (String): Erforderlich. Der Pfad und der Dateiname für die PDF-Datei.
- ExportFormat (WdExportFormat): Erforderlich. Das Format, in das exportiert werden soll (wdExportFormatPDF oder wdExportFormatXPS).
- OpenAfterExport (Boolean): Optional. Standardmäßig auf False gesetzt. Gibt an, ob die PDF-Datei nach dem Export geöffnet werden soll.
- OptimizeFor (wdExportOptimizeFor): Optional. Gibt an, ob für die Darstellung auf dem Bildschirm oder für den Druck optimiert werden soll (wdOptimizeForOnScreen oder wdOptimizeForPrint).
- Range (wdExportRange): Optional. Legt fest, welcher Bereich exportiert werden soll. Werte: wdExportAllDocument – Exportiert das vollständige Dokument, wdExportCurrentPage – Exportiert die aktuelle Seite, wdExportFromTo – Exportiert einen Seitenbereich, wdExportSelection – Exportiert die aktuelle Markierung.
- From (Long): Optional. Gibt die erste Seite des zu exportierenden Bereichs an.
- To (Long): Optional. Gibt die letzte Seite des zu exportierenden Bereichs an.
- Item: Optional. Das zu exportierende Element (zum Beispiel wdExportDocumentContent oder wdExportDocumentWithMarkup).
- IncludeDocProps (Boolean): Optional. Gibt an, ob Dokumenteigenschaften in die PDF-Datei eingefügt werden sollen.
- KeepIRM (Boolean): Optional. Gibt an, ob die Information Rights Management (IRM)-Berechtigungen beibehalten werden sollen.
- CreateBookmarks (WdExportCreateBookmarks): Optional. Gibt an, ob Lesezeichen erstellt werden sollen. Die Werte für diesen Parameter lauten: wdExportCreateHeadingBookmarks, wdExportCreateNoBookmarks, wdExportCreateWordBookmarks
- DocStructureTags (Boolean): Optional. Gibt an, ob Strukturinformationen in das PDF eingefügt werden sollen.
- BitmapMissingFonts (Boolean): Optional. Gibt an, ob fehlende Schriftarten als Bitmaps in das PDF eingebettet werden sollen.
- UseISO19005_1 (Boolean): Optional. Gibt an, ob das PDF im ISO-19005-1-kompatiblen (PDF/A) Format erstellt werden soll.
Damit erhalten wir bereits eine ganze Menge Möglichkeiten für den Export von Word-Dokumenten. Für uns sind in den nächsten Schritten vor allem die beiden Parameter StartPage und EndPage interessant.
Jede Seiten als eigenes PDF-Dokument extrahieren
Die erste Lösung soll jede Seite einzeln extrahieren. Dazu müssen wir die Anzahl der Seiten ermitteln und danach jede Seite einzeln durchlaufen und exportieren.
Das erledigen wir in der Prozedur aus Listing 3. Hier ermitteln wir die Seitenzahl mit doc.ComputeStatistics(wdStatisticsPages). Außerdem legen wir den Basisdateinamen fest, der aus dem eigentlichen Dateinamen mit der Endung .pdf besteht. Danach durchlaufen wir eine Schleife über alle Seiten. In dieser Schleife legen wir den Dateinamen für die jeweilige Seite fest.
Public Sub PDFSpeichernEinzelneSeite() Dim doc As Document Dim lngSeiten As Long Dim lngSeite As Integer Dim strDateipfad As String Dim strDateiname As String Set doc = ActiveDocument lngSeiten = doc.ComputeStatistics(wdStatisticPages) strDateiname = Replace(doc.Name, ".docx", ".pdf") strDateiname = Replace(strDateiname, ".docm", ".pdf") For lngSeite = 1 To lngSeiten strDateipfad = doc.Path & "\" & Replace(strDateiname, ".pdf", "_" & Format(lngSeite, "00") & ".pdf") doc.ExportAsFixedFormat OutputFileName:=strDateipfad, _ ExportFormat:=wdExportFormatPDF, _ Range:=wdExportFromTo, _ From:=lngSeite, _ To:=lngSeite Next lngSeite End Sub
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: