{"id":55000384,"date":"2023-08-01T00:00:00","date_gmt":"2023-09-12T17:14:39","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=384"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Word_PDF_per_VBA_erzeugen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Word_PDF_per_VBA_erzeugen\/","title":{"rendered":"Word: PDF per VBA erzeugen"},"content":{"rendered":"<p><b>Wenn man ein Dokument per VBA zusammengestellt hat, m&ouml;chte man dieses gegebenenfalls auch noch weiterverarbeiten. Zum Beispiel, indem man es unter einen bestimmten Dateinamen speichert. Eine weitere Anforderung k&ouml;nnte sein, dass man das Dokument direkt als PDF-Dokument sichern m&ouml;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&ouml;nnen.<\/b><\/p>\n<p>In vielen F&auml;llen sollen Word-Dokumente nicht im Format <b>.docx<\/b> weitergegeben werden. Einer der Gr&uuml;nde ist, dass wir nicht wollen, dass der Empf&auml;nger das Dokument bearbeiten oder die Inhalte auf einfache Weise extrahieren kann. Eine gute L&ouml;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.<\/p>\n<p>W&auml;hrend man meist komplette Dokumente in eine PDF-Datei exportieren m&ouml;chte, kommt es auch vor, dass ein Word-Dokument bereits mehrere Teildokumente enth&auml;lt, die einzelnen exportiert werden sollen. Und ein weiterer Fall ist, dass wir nur bestimmte Seiten aus einem Dokument extrahieren wollen, andere jedoch nicht.<\/p>\n<h2>Dokument als .dotm speichern<\/h2>\n<p>Um einem eventuellen Verlust des nachfolgend erstellten VBA-Codes vorzubeugen, haben wir das Dokument direkt als <b>.dotm<\/b>-Dokument gespeichert. Die Prozeduren haben wir in das Modul <b>ThisDocument<\/b> eingef&uuml;gt.<\/p>\n<h2>Komplettes Dokument als PDF speichern<\/h2>\n<p>Wir beginnen mit dem einfachsten Fall: Wir wollen alle Seiten des Dokuments in einer PDF-Datei speichern. Diesen Fall haben wir in der Prozedur <b>PDFSpeichern <\/b>aus Listing 1 abgedeckt. Hier deklarieren wir eine Variable des Typs <b>Word.Document<\/b>, um das zu extrahierende Dokument zu referenzieren. Das erledigen wir anschlie&szlig;end &uuml;ber die Eigenschaft <b>ActiveDocument<\/b>, die einen Verweis auf das aktuell angezeigte Dokument liefert.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>PDFSpeichern()\r\n     <span style=\"color:blue;\">Dim <\/span>doc<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>strDateipfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> doc = ActiveDocument\r\n     strDateipfad = doc.Path & \"\\Export.pdf\"\r\n     doc.ExportAsFixedFormat OutputFileName:=strDateipfad, ExportFormat:=wdExportFormatPDF\r\n     <span style=\"color:blue;\">Set<\/span> doc = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Speichern des kompletten Dokuments<\/span><\/b><\/p>\n<p>Schlie&szlig;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 <b>doc.Path<\/b>. F&uuml;gen wir noch <b>\\Export.pdf <\/b>an, erhalten wir den vollst&auml;ndigen Pfad.<\/p>\n<p>Die eigentliche Arbeit &uuml;bernimmt die Methode <b>ExportAsFixedFormat <\/b>des <b>Document<\/b>-Objekts. Dieser &uuml;bergeben wir f&uuml;r den Parameter <b>OutputFileName <\/b>den Pfad aus der Variablen <b>strDateipfad <\/b>und als <b>ExportFormat <\/b>den Wert <b>wdExportFormatPDF<\/b>.<\/p>\n<p>Das Ausf&uuml;hren der Prozedur sorgt f&uuml;r das Anlegen der Datei im gleichen Verzeichnis wie die Originaldatei.<\/p>\n<h2>PDF unter gleichem Namen speichern<\/h2>\n<p>Wir k&ouml;nnen noch ein wenig verfeinern, wenn wir wollen, dass das Dokument unter dem gleichen Namen wie das Original gespeichert wird &#8211; nur mit der Dateiendung <b>.pdf <\/b>statt<b>.docx<\/b>.<\/p>\n<p>Dazu ermitteln wir mit <b>doc.Name <\/b>den Namen des Dokuments und ersetzen mit der <b>Replace<\/b>-Methode die Dateiendung <b>.docx <\/b>durch <b>.pdf<\/b>.<\/p>\n<p>Damit wir den Code &uuml;berhaupt ausf&uuml;hren k&ouml;nnen, verwenden wir eine Word-Datei mit der Dateiendung <b>.docm<\/b>. Also ersetzen wir auch diese Dateiendung noch durch <b>.pdf<\/b> (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>PDFSpeichernGleicherName()\r\n     <span style=\"color:blue;\">Dim <\/span>doc<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>strDateipfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> doc = ActiveDocument\r\n     strDateiname = <span style=\"color:blue;\">Replace<\/span>(doc.Name, \".docx\", \".pdf\")\r\n     strDateiname = <span style=\"color:blue;\">Replace<\/span>(strDateiname, \".docm\", \".pdf\")\r\n     strDateipfad = doc.Path & \"\\\" & strDateiname\r\n     doc.ExportAsFixedFormat OutputFileName:=strDateipfad, ExportFormat:=wdExportFormatPDF\r\n     <span style=\"color:blue;\">Set<\/span> doc = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Speichern des kompletten Dokuments mit dem gleichen Namen und der Endung .pdf<\/span><\/b><\/p>\n<h2>Die ExportAsFixedFormat-Methode<\/h2>\n<p>Bevor wir weitere Anwendungsf&auml;lle wie das Extrahieren einzelner Seiten oder eines bestimmten Bereichs betrachten, wollen wir einen Blick auf die Parameter der Methode <b>ExportAsFixedFormat <\/b>werfen.<\/p>\n<p>Diese lauten:<\/p>\n<ul>\n<li><b>OutputFileName<\/b> (<b>String<\/b>): Erforderlich. Der Pfad und der Dateiname f&uuml;r die PDF-Datei.<\/li>\n<li><b>ExportFormat<\/b> (<b>WdExportFormat<\/b>): Erforderlich. Das Format, in das exportiert werden soll (<b>wdExportFormatPDF<\/b> oder <b>wdExportFormatXPS<\/b>).<\/li>\n<li><b>OpenAfterExport<\/b> (<b>Boolean<\/b>): Optional. Standardm&auml;&szlig;ig auf <b>False <\/b>gesetzt. Gibt an, ob die PDF-Datei nach dem Export ge&ouml;ffnet werden soll.<\/li>\n<li><b>OptimizeFor<\/b> (<b>wdExportOptimizeFor<\/b>): Optional. Gibt an, ob f&uuml;r die Darstellung auf dem Bildschirm oder f&uuml;r den Druck optimiert werden soll (<b>wdOptimizeForOnScreen <\/b>oder <b>wdOptimizeForPrint<\/b>).<\/li>\n<li><b>Range<\/b> (<b>wdExportRange<\/b>): Optional. Legt fest, welcher Bereich exportiert werden soll. Werte: <b>wdExportAllDocument <\/b>&#8211; Exportiert das vollst&auml;ndige Dokument, <b>wdExportCurrentPage <\/b>&#8211; Exportiert die aktuelle Seite, <b>wdExportFromTo <\/b>&#8211; Exportiert einen Seitenbereich, <b>wdExportSelection <\/b>&#8211; Exportiert die aktuelle Markierung.<\/li>\n<li><b>From<\/b> (<b>Long<\/b>): Optional. Gibt die erste Seite des zu exportierenden Bereichs an.<\/li>\n<li><b>To<\/b> (<b>Long<\/b>): Optional. Gibt die letzte Seite des zu exportierenden Bereichs an.<\/li>\n<li><b>Item<\/b>: Optional. Das zu exportierende Element (zum Beispiel <b>wdExportDocumentContent<\/b> oder <b>wdExportDocumentWithMarkup<\/b>).<\/li>\n<li><b>IncludeDocProps<\/b> (<b>Boolean<\/b>): Optional. Gibt an, ob Dokumenteigenschaften in die PDF-Datei eingef&uuml;gt werden sollen.<\/li>\n<li><b>KeepIRM<\/b> (<b>Boolean<\/b>): Optional. Gibt an, ob die Information Rights Management (IRM)-Berechtigungen beibehalten werden sollen.<\/li>\n<li><b>CreateBookmarks<\/b> (<b>WdExportCreateBookmarks<\/b>): Optional. Gibt an, ob Lesezeichen erstellt werden sollen. Die Werte f&uuml;r diesen Parameter lauten: <b>wdExportCreateHeadingBookmarks<\/b>, <b>wdExportCreateNoBookmarks<\/b>, <b>wdExportCreateWordBookmarks<\/b><\/li>\n<li><b>DocStructureTags<\/b> (<b>Boolean<\/b>): Optional. Gibt an, ob Strukturinformationen in das PDF eingef&uuml;gt werden sollen.<\/li>\n<li><b>BitmapMissingFonts<\/b> (<b>Boolean<\/b>): Optional. Gibt an, ob fehlende Schriftarten als Bitmaps in das PDF eingebettet werden sollen.<\/li>\n<li><b>UseISO19005_1<\/b> (<b>Boolean<\/b>): Optional. Gibt an, ob das PDF im ISO-19005-1-kompatiblen (PDF\/A) Format erstellt werden soll.<\/li>\n<\/ul>\n<p>Damit erhalten wir bereits eine ganze Menge M&ouml;glichkeiten f&uuml;r den Export von Word-Dokumenten. F&uuml;r uns sind in den n&auml;chsten Schritten vor allem die beiden Parameter <b>StartPage <\/b>und <b>EndPage <\/b>interessant.<\/p>\n<h2>Jede Seiten als eigenes PDF-Dokument extrahieren<\/h2>\n<p>Die erste L&ouml;sung soll jede Seite einzeln extrahieren. Dazu m&uuml;ssen wir die Anzahl der Seiten ermitteln und danach jede Seite einzeln durchlaufen und exportieren.<\/p>\n<p>Das erledigen wir in der Prozedur aus Listing 3. Hier ermitteln wir die Seitenzahl mit <b>doc.ComputeStatistics(wdStatisticsPages)<\/b>. Au&szlig;erdem legen wir den Basisdateinamen fest, der aus dem eigentlichen Dateinamen mit der Endung <b>.pdf <\/b>besteht. Danach durchlaufen wir eine Schleife &uuml;ber alle Seiten. In dieser Schleife legen wir den Dateinamen f&uuml;r die jeweilige Seite fest.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>PDFSpeichernEinzelneSeite()\r\n     <span style=\"color:blue;\">Dim <\/span>doc<span style=\"color:blue;\"> As <\/span>Document\r\n     <span style=\"color:blue;\">Dim <\/span>lngSeiten<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSeite<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateipfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> doc = ActiveDocument\r\n     lngSeiten = doc.ComputeStatistics(wdStatisticPages)\r\n     strDateiname = <span style=\"color:blue;\">Replace<\/span>(doc.Name, \".docx\", \".pdf\")\r\n     strDateiname = <span style=\"color:blue;\">Replace<\/span>(strDateiname, \".docm\", \".pdf\")\r\n     For lngSeite = 1 To lngSeiten\r\n         strDateipfad = doc.Path & \"\\\" & <span style=\"color:blue;\">Replace<\/span>(strDateiname, \".pdf\", \"_\" & Format(lngSeite, \"00\") & \".pdf\")\r\n         doc.ExportAsFixedFormat OutputFileName:=strDateipfad, _\r\n             ExportFormat:=wdExportFormatPDF, _\r\n             Range:=wdExportFromTo, _\r\n             From:=lngSeite, _\r\n             To:=lngSeite\r\n         <span style=\"color:blue;\">Next<\/span> lngSeite\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000384\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000384?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000384\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man ein Dokument per VBA zusammengestellt hat, m&ouml;chte man dieses gegebenenfalls auch noch weiterverarbeiten. Zum Beispiel, indem man es unter einen bestimmten Dateinamen speichert. Eine weitere Anforderung k&ouml;nnte sein, dass man das Dokument direkt als PDF-Dokument sichern m&ouml;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&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662023,66042023,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000384","post","type-post","status-publish","format-standard","hentry","category-662023","category-66042023","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000384"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000384\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000384"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}