{"id":55001524,"date":"2024-12-01T00:00:00","date_gmt":"2024-11-06T18:59:46","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1524"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"PDF_per_VBA_erstellen_im_Detail","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/","title":{"rendered":"PDF per VBA erstellen im Detail"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190\" width=\"1\" height=\"1\" alt=\"\"><b>Im Beitrag &#8222;PDF erstellen mit Access im Detail&#8220; (www.access-im-unternehmen.de\/1523) haben wir uns bereits angesehen, wie wir PDF-Dokumente &uuml;ber die Benutzeroberfl&auml;che erstellen k&ouml;nnen. Typischerweise m&ouml;chte man einem Benutzer allerdings nicht die Aufgabe &uuml;berlassen, einen Bericht zu &ouml;ffnen und dann die entsprechenden Schaltfl&auml;chen im Ribbon aufzurufen, um den Bericht als PDF-Dokument zu speichern. Dazu stellen wir einen eigenen Button zur Verf&uuml;gung, mit dem wir den Bericht direkt als PDF speichern. Es fehlt also nur noch der passende VBA-Befehl. In diesem Beitrag schauen wir uns an, wie dieser lautet und welche Alternativen es gibt. Au&szlig;erdem werfen wir einen Blick darauf, wie wir Dokumente im PDF\/A-Format erzeugen. W&auml;hrend wir dazu &uuml;ber die Benutzerfl&auml;che lediglich eine Option im Dateiauswahl-Dialog aktivieren mussten, ist der Aufwand unter VBA bereits deutlich h&ouml;her. Aber immerhin ist dieser nur einmalig durchzuf&uuml;hren, weshalb wir gern darauf eingehen.<\/b><\/p>\n<h2>Bericht als PDF exportieren per DoCmd.OutputTo<\/h2>\n<p>Die erste und offensichtliche M&ouml;glichkeit zum Exportieren eines Berichts ist die <b>OutputTo<\/b>-Methode des <b>DoCmd<\/b>-Objekts.<\/p>\n<p>Diese Methode erwartet die folgenden Parameter:<\/p>\n<ul>\n<li><b>ObjectType<\/b>: Typ des zu exportierenden Objekts, in diesem Fall <b>acOutputReport<\/b><\/li>\n<li><b>ObjectName<\/b>: Name des Berichts<\/li>\n<li><b>OutputFormat<\/b>: Ausgabeformat, hier <b>acFormatPDF<\/b><\/li>\n<li><b>OutputFile<\/b>: Pfad der zu erstellenden Datei<\/li>\n<li><b>Autostart<\/b>: Gibt an, ob die exportierte Datei nach dem Export automatisch angezeigt werden soll.<\/li>\n<li><b>TemplateFile<\/b>: Relevant f&uuml;r Exporte in andere Dateiformate wie Word oder Excel.<\/li>\n<li><b>Encoding<\/b>: Nur relevant f&uuml;r den Export in das Textformat.<\/li>\n<li><b>OutputQuality<\/b>: Gibt die Qualit&auml;t der zu erstellenden Datei an. Wir k&ouml;nnen die beiden Werte <b>acExportQualityPrint <\/b>und <b>acExportQualityScreen <\/b>angeben.<\/li>\n<\/ul>\n<p>Ein Aufruf sieht beispielsweise wie folgt aus:<\/p>\n<pre>DoCmd.OutputTo acOutputReport, \"rptBeispiel\", acFormatPDF, CurrentProject.Path & \"\\rptBeispiel_Screen.pdf\", True, , , acExportQualityScreen<\/pre>\n<h2>Bericht mit Kriterium als PDF exportieren<\/h2>\n<p>Nat&uuml;rlich kommt es immer mal vor, dass man einen Bericht genau so als PDF-Dokument speichern m&ouml;chte, wie man diesen auch per Doppelklick auf seinen Namen im Navigationsbereich anzeigen w&uuml;rde &#8211; also ohne die Angabe von Kriterien et cetera.<\/p>\n<p>Allerdings gibt es auch Berichte, die vor der Ausgabe im PDF-Format gefiltert werden sollen. Zu Beispielzwecken haben wir einen weiteren Bericht namens <b>rptArtikel <\/b>angelegt, der in der Entwurfsansicht wie in Bild 1 erscheint.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_001.png\" alt=\"Entwurf eines Beispielberichts mit einer Artikelliste\" width=\"549,559\" height=\"180,5568\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf eines Beispielberichts mit einer Artikelliste<\/span><\/b><\/p>\n<p>Wenn wir den Bericht nun gefiltert &ouml;ffnen, sodass er beispielsweise nur die Artikel mit den Werten bis <b>10 <\/b>im Feld <b>ArtikelID <\/b>ausgibt, &ouml;ffnen wir diesen wie folgt:<\/p>\n<pre>DoCmd.OpenReport \"rptArtikel\", acViewPreview, , \"ArtikelID &lt;= 10\"<\/pre>\n<p>Das Ergebnis sehen wir in Bild 2. Hier gibt der Bericht wie erwartet nur die ersten zehn Datens&auml;tze aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_002.png\" alt=\"Bericht mit Where-Bedingung\" width=\"424,5589\" height=\"432,3728\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Bericht mit Where-Bedingung<\/span><\/b><\/p>\n<p>Nun schlie&szlig;en wir diesen Bericht und exportieren ihn im PDF-Format:<\/p>\n<pre>DoCmd.OutputTo acOutputReport, \"rptArtikel\", acFormatPDF, CurrentProject.Path & \"\\rptArtikel.pdf\", True, , , acExportQualityScreen<\/pre>\n<p>Dies liefert logischerweise den Bericht mit allen Datens&auml;tzen (siehe Bild 3). Nun wollen wir diesen allerdings in gefilterter Form in einem PDF-Dokument speichern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_003.png\" alt=\"Artikel-Bericht als PDF\" width=\"524,559\" height=\"366,7604\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Artikel-Bericht als PDF<\/span><\/b><\/p>\n<p>Dummerweise liefert uns die <b>DoCmd.OutputTo<\/b>-Methode keine M&ouml;glichkeit, einen Parameter namens <b>WhereCondion <\/b>f&uuml;r den Bericht anzugeben.<\/p>\n<p>Also m&uuml;ssen wir einen alternativen Weg finden, um den Bericht gefiltert auszugeben.<\/p>\n<p>Dazu gehen wir zun&auml;chst den folgenden Weg:<\/p>\n<ul>\n<li>Wir &ouml;ffnen den Bericht unter Angabe der <b>WhereCondition <\/b>in der Seitenansicht.<\/li>\n<li>Dann exportieren wir den Bericht.<\/li>\n<\/ul>\n<p>Das l&auml;uft nun ohne Probleme und liefert das gew&uuml;nschte Ergebnis. Wir &ouml;ffnen den Bericht, dessen Namen wir zuvor in der Variablen <b>strReport <\/b>gespeichert haben, mit <b>DoCmd.OpenReport<\/b>, geben diesen dann mit <b>DoCmd.OutputTo <\/b>aus und schlie&szlig;en ihn mit <b>DoCmd.Close <\/b>wieder.<\/p>\n<p>Die verwendete Prozedur sieht wie in Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ArtikellisteGefiltert()\r\n     <span style=\"color:blue;\">Dim <\/span>strReport<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     strReport = \"rptArtikel\"\r\n     strPfad = CurrentProject.Path & \"\\\" & strReport & \".pdf\"\r\n     DoCmd.OpenReport strReport, acViewPreview, , \"ArtikelID &lt;= 10\"\r\n     DoCmd.OutputTo acOutputReport, strReport, acFormatPDF, strPfad\r\n     DoCmd.Close acReport, strReport\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Exportieren der zuvor gefilterten Artikelliste <\/span><\/b><\/p>\n<h2>Achtung, Fehler 2501!<\/h2>\n<p>Es kann beim Aufruf der Prozedur <b>DoCmd.OutputTo <\/b>passieren, dass wir den Fehler <b>2501 <\/b>erhalten. Wir haben einige Minuten gebraucht, um herauszufinden, weshalb dieser aufgetreten ist. Der Grund war einfach: Wir hatten die zuvor bereits einmal erzeugte PDF-Datei namens <b>rptArtikel.pdf <\/b>bereits ge&ouml;ffnet. Eine ge&ouml;ffnete PDF-Datei kann jedoch nicht einfach &uuml;berschrieben werden. Dabei erscheint die hier wenig aussagekr&auml;ftige Meldung <b>Die Aktion OutputTo wurde abgebrochen<\/b>.<\/p>\n<h2>Bericht mit dem Standard PDF\/A-3 speichern<\/h2>\n<p>Im Beitrag <b>PDF erstellen im Detail <\/b>(<b>www.access-im-unternehmen.de\/1523<\/b>) haben wir gezeigt, wie wir zumindest mit neueren Access-Versionen Berichte so als PDF-Dokumente exportieren konnten, dass diese dem PDF\/A-3-Standard entsprechen. Dazu mussten wir im <b>Speichern<\/b>-Dialog, den wir mit dem Ribbonbefehl <b>Seitenansicht|Daten|PDF oder XPS <\/b>ge&ouml;ffnet haben, die Optionen einblenden und dort die Option <b>PDF\/A-kompatibel <\/b>aktivieren (siehe Bild 4). Dies f&uuml;hrte je nach Access-Version dazu, dass die PDF-Datei im Format PDF\/A-1 oder PDF\/A-3 erzeugt wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_004.png\" alt=\"Exportieren im PDF\/A-3-Format &uuml;ber die Benutzeroberfl&auml;che\" width=\"649,559\" height=\"417,3143\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Exportieren im PDF\/A-3-Format &uuml;ber die Benutzeroberfl&auml;che<\/span><\/b><\/p>\n<p>Wenn wir uns den <b>Speichern<\/b>-Dialog genauer ansehen, finden wir hier mit <b>Datei nach dem Ver&ouml;ffentlichen &ouml;ffnen <\/b>und <b>Optimieren f&uuml;r <\/b>auch noch zwei Optionen, die wir bereits von der <b>OutputTo<\/b>-Methode des <b>DoCmd<\/b>-Objekts kennen. Da stellt sich die Frage, ob wir vielleicht auch noch die PDF\/A-3-Kompatibilit&auml;t per VBA sicherstellen k&ouml;nnen. Allerdings liefert selbst die Aktivierung der Anzeige versteckter Elemente im Objektkatalog keinerlei Hinweise auf weitere M&ouml;glichkeiten.<\/p>\n<p>Wenn wir den Export-Vorgang &uuml;ber diesen Dialog abschlie&szlig;en, taucht jedoch noch der Schritt <b>Exportschritte speichern <\/b>auf (siehe Bild 5). Vielleicht liefert dieser ja noch hilfreiche Informationen?<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_005.png\" alt=\"Speichern der Exportschritte\" width=\"649,559\" height=\"460,4575\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Speichern der Exportschritte<\/span><\/b><\/p>\n<p>Und was geschieht eigentlich, wenn wir das Speichern der Exportschritte wie im Screenshot aktivieren? Also probieren wir das einmal aus und nennen den Export <b>Exportschritte_rptArtikel<\/b>.<\/p>\n<p>Danach stellt sich allerdings die Frage, wo diese Exportschritte &uuml;berhaupt gespeichert werden und wie wir diese nutzen k&ouml;nnen. Wenn wir erneut versuchen, den Bericht zu exportieren, finden wir jedenfalls keine Gelegenheit, diese auszuw&auml;hlen.<\/p>\n<p>Suchen wir ein wenig weiter, finden wir allerdings im Ribbon unter <b>Externe Daten <\/b>einen Befehl namens <b>Gespeicherte Exporte<\/b> (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_006.png\" alt=\"Im Ribbon befindet sich ein Button namens Gespeicherte Exporte.\" width=\"424,5589\" height=\"208,5223\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Im Ribbon befindet sich ein Button namens Gespeicherte Exporte.<\/span><\/b><\/p>\n<p>Klicken wir diesen an, &ouml;ffnet sich ein Dialog, der unseren gespeicherten Export anzeigt (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_007.png\" alt=\"Unser gespeicherter Export\" width=\"700\" height=\"227,9428\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Unser gespeicherter Export<\/span><\/b><\/p>\n<p>Hier haben wir jedoch auch nur die M&ouml;glichkeit, den Export nochmals zu starten.<\/p>\n<h2>Gespeicherten Export per VBA aufrufen<\/h2>\n<p>Logischerweise gibt es auch noch einen VBA-Befehl, mit dem wir einen gespeicherten Export starten k&ouml;nnen.<\/p>\n<p>Dieser ist ebenfalls eine Methode des <b>DoCmd<\/b>-Objekts und hei&szlig;t <b>RunSavedImportExport <\/b>und wir rufen diese wie folgt auf:<\/p>\n<pre>DoCmd.RunSavedImportExport \"Exportschritte_rptArtikel\"<\/pre>\n<p>Mit dieser Methode k&ouml;nnen wir den Bericht exportieren. Die Frage ist noch, ob wir damit eine PDF\/A-3-kompatible Datei erstellt haben. Dazu wollen wir nun einen Validierer hinzuziehen.<\/p>\n<h2>Validieren, ob ein PDF-Dokument dem Standard PDF\/A-3 entspricht<\/h2>\n<p>Unter dem folgenden Link haben wir unsere mit Access erzeugten Dokumente auf PDF\/A-3 validiert:<\/p>\n<pre>https:\/\/avepdf.com\/de\/pdfa-validation<\/pre>\n<p>Hier kann man sein Dokument angeben und dieses pr&uuml;fen lassen. In unserem Beispiel kam das Ergebnis aus Bild 8 heraus. Auch in der kostenpflichtigen Version von Adobe Acrobat k&ouml;nnen wir erkennen, ob es sich um eine PDF\/A-3-Datei handelt. Wenn wir das PDF-Dokument damit &ouml;ffnen, erscheint erstens oben die Meldung, dass die Datei schreibgesch&uuml;tzt ge&ouml;ffnet wurde, weil sie Konformit&auml;t mit dem PDF\/A-Standard verlangt (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_008.png\" alt=\"Validieren von PDF\/A-3-Dateien\" width=\"649,559\" height=\"544,323\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Validieren von PDF\/A-3-Dateien<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_009.png\" alt=\"Validieren von PDF\/A-3-Dateien im Adobe Acrobat\" width=\"700\" height=\"312,3848\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Validieren von PDF\/A-3-Dateien im Adobe Acrobat<\/span><\/b><\/p>\n<p>Au&szlig;erdem sehen wir rechts ein Icon, mit dem wir den Bereich <b>Standards <\/b>&ouml;ffnen k&ouml;nnen (der &uuml;brigens bei Dateien ohne PDF\/A-Standard gar nicht erscheint). In diesem Bereich erhalten wir die Information, dass dieses Dokument dem Standard PDF\/A-3B entspricht.<\/p>\n<p>PDF-Dateien, die nicht mit neueren Access-Versionen erstellt wurden, weisen teilweise nur den Standard <b>PDF\/A-1B <\/b>auf. Wir konnten nicht genau herausfinden, ab welchen Versionen PDF\/A-3B erzeugt wird, daher sollte man dies immer selbst pr&uuml;fen, wenn PDF-Dokumente mit diesem Standard ben&ouml;tigt werden &#8211; beispielsweise als Basis f&uuml;r ZUGFeRD-Rechnungen.<\/p>\n<p>Damit haben wir grunds&auml;tzlich eine L&ouml;sung, mit der wir unseren Bericht im PDF\/A-3-Format exportieren k&ouml;nnen. Wir ben&ouml;tigen allerdings nun noch eine M&ouml;glichkeit, die auszugebenden Daten wie im vorherigen Beispiel durch eine <b>WhereCondition<\/b> festzulegen. L&auml;sst sich dies genau wie zuvor erledigen, indem wir den Bericht mit <b>WhereCondition<\/b> &ouml;ffnen, diesen &uuml;ber den gespeicherten Export als PDF-Dokument speichern, und den Bericht dann wieder schlie&szlig;en?<\/p>\n<p>So etwas findet man nur heraus, indem man es ausprobiert. Unsere Testprozedur sieht wie folgt aus, und diesmal wollen wir die ersten 15 Datens&auml;tze ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GespeicherterExportGefiltert()\r\n     <span style=\"color:blue;\">Dim <\/span>strReport<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     strReport = \"rptArtikel\"\r\n     strPfad = CurrentProject.Path & \"\\\" & strReport & \".pdf\"\r\n     DoCmd.OpenReport strReport, acViewPreview, , _\r\n         \"ArtikelID &lt;= 15\"\r\n     DoCmd.RunSavedImportExport \"Exportschritte_rptArtikel\"\r\n     DoCmd.Close acReport, strReport\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Aber k&ouml;nnen wir damit nun beispielsweise auch einen anderen Bericht &ouml;ffnen und diesen im PDF\/A-3-Format speichern? Wir &ouml;ffnen also einfach mal unseren ganz einfachen Beispielbericht von Anfang des Beitrags und versuchen, den gespeicherten Export auf diesen anzuwenden:<\/p>\n<pre>DoCmd.OpenReport \"rptBeispiel\", acViewPreview\r\nDoCmd.RunSavedImportExport \"Exportschritte_rptArtikel\"\r\nDoCmd.Close acReport, strReport<\/pre>\n<p>Dies f&uuml;hrt allerdings nicht zum gew&uuml;nschten Ergebnis &#8211; es wird der Bericht <b>rptArtikel <\/b>exportiert, und zwar diesmal mit allen Datens&auml;tzen.<\/p>\n<p>Das bedeutet also: Der gespeicherte Export legt das PDF immer f&uuml;r den beim Erstellen des Exports angegebenen Bericht an. Wenn wir den gleichen Bericht w&auml;hrend des gespeicherten Exports ge&ouml;ffnet haben, holt sich die Methode <b>RunSavedImportExport <\/b>aber wohl die <b>WhereCondition <\/b>vom aktuell ge&ouml;ffneten Datensatz.<\/p>\n<h2>Gespeicherten Export anpassen<\/h2>\n<p>Damit bleibt noch eine Frage: Wie k&ouml;nnen wir mithilfe eines gespeicherten Exports einen beliebigen Bericht exportieren, ohne dass wir f&uuml;r jeden zu exportierenden Bericht zuvor einen gespeicherten Export angelegt haben? Hier stellt sich erst einmal die Frage, ob es so viele Berichte gibt, dass man sich genauer ansieht, wie man dies automatisieren k&ouml;nnte. Wenn wir davon ausgehen, dass das PDF\/A-3-Format &uuml;berwiegend zum Erstellen von PDFs f&uuml;r ZUGFeRD-Rechnungen verwendet werden soll, d&uuml;rfte die Anzahl in den meisten Anwendungen &uuml;berschaubar sein.<\/p>\n<p>Aber uns reizt schon die Aufgabe, herauszufinden, wo die gespeicherten Exporte gespeichert werden &#8211; um diese dann auch noch anpassen zu k&ouml;nnen. Wie das gelingt, schauen wir uns allerdings in einem eigenen Beitrag namens <b>Gespeicherte Importe und Exporte verwalten<\/b> (<b>www.access-im-unternehmen.de\/1526<\/b>) an.<\/p>\n<h2>Anpassbaren gespeicherten Export f&uuml;r PDF\/A-3-Dokumente<\/h2>\n<p>Nachdem wir dort herausgefunden haben, wie wir auf die gespeicherten Importe und Exporte zugreifen k&ouml;nnen, passen wir dies nun auf unsere hier vorliegende Anforderung an. <\/p>\n<p>Dazu legen wir noch einmal einen neuen gespeicherten Export an, den wir gleich entsprechend benennen:<\/p>\n<ul>\n<li>Markieren eines zu exportierenden Berichts im Navigationsbereich<\/li>\n<li>Anklicken des Ribbonbefehls <b>Externe Daten|Exportieren|PDF oder XPS<\/b><\/li>\n<li>Anklicken des Befehls <b>Optionen&#8230; <\/b>im Dialog <b>Als PDF oder XPS ver&ouml;ffentlichen<\/b><\/li>\n<li>Aktivieren der Option <b>PDF\/A-kompatibel<\/b> (wobei wir diese auch noch sp&auml;ter einstellen k&ouml;nnen)<\/li>\n<li>Bet&auml;tigen des Befehls <b>Ver&ouml;ffentlichen<\/b><\/li>\n<li>Im Dialog <b>Exportieren &#8211; PDF <\/b>die Option <b>Exportschritte speichern aktivieren<\/b><\/li>\n<li>F&uuml;r <b>Speichern unter: <\/b>einen Text wie <b>Export PDF\/A-3 <\/b>eintragen<\/li>\n<li>Auf <b>Export speichern <\/b>klicken<\/li>\n<\/ul>\n<p>Damit ist der gespeicherte Export mit den wichtigsten Optionen bereits angelegt. Nun wollen wir zwei Parameter anpassen k&ouml;nnen:<\/p>\n<ul>\n<li>den Namen des zu exportierenden Berichts und<\/li>\n<li>den Speicherort.<\/li>\n<\/ul>\n<p>Bevor wir uns den XML-Code ansehen, f&uuml;gen wir einen Verweis auf die Bibliothek <b>Microsoft XML v3.0 <\/b>zum VBA-Projekt hinzu (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1524_010.png\" alt=\"Hinzuf&uuml;gen des Verweises auf die XML-Bibliothek\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Hinzuf&uuml;gen des Verweises auf die XML-Bibliothek<\/span><\/b><\/p>\n<h2>XML-Code des gespeicherten Exports betrachten<\/h2>\n<p>Um den Code vorab einmal zu sichten, reichen uns nun die folgenden Anweisungen.<\/p>\n<p>Wichtig ist, dass wir den korrekten, soeben festgelegten Namen f&uuml;r den gespeicherten Export als Index angeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GespeichertenExportAnpassen()\r\n     <span style=\"color:blue;\">Dim <\/span>objSpecification<span style=\"color:blue;\"> As <\/span>ImportExportSpecification\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Set<\/span> objSpecification = CurrentProject. _\r\n         ImportExportSpecifications(\"Export PDF\/A-3\")\r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n     objXML.loadXML objSpecification.XML\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objXML.XML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier ist das Ergebnis:<\/p>\n<pre>&lt;ImportExportSpecification     Path=\"C:\\Users\\User\\Documents\\rptArtikel.pdf\"     xmlns=\"urn:www.microsoft.com\/office\/access\/imexspec\"&gt;\r\n   &lt;ExportPDF AccessObject=\"rptArtikel\"       ObjectType=\"Report\"       AutoStart=\"false\"       Quality=\"screen\"       UseISO19005_1=\"true\"\/&gt;\r\n&lt;\/ImportExportSpecification&gt;<\/pre>\n<p>Wir m&uuml;ssen hier zwei Elemente anpassen. Das erste ist das Attribut <b>Path <\/b>des Elements <b>ImportExportSpecification<\/b>, das den Pfad der zu erstellenden Datei enth&auml;lt.<\/p>\n<p>Das zweite ist der Name des zu exportierenden Berichts, hier aktuell auf <b>rptArtikel <\/b>eingestellt.<\/p>\n<p>Diese Elemente &auml;ndern wir durch einfache XML-Operationen. Damit wir diese flexibel &auml;ndern k&ouml;nnen, f&uuml;gen wir diese als Parameter zu der Prozedur <b>GespeichertenExportAnpassen <\/b>hinzu. Au&szlig;erdem wollen wir dort noch den Namen des gespeicherten Exports hinzuf&uuml;gen, damit wir die Prozedur flexibel nutzen k&ouml;nnen.<\/p>\n<p>Das Ergebnis sehen wir in Listing 2. Die Prozedur erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GespeichertenExportAnpassen(strSpecification<span style=\"color:blue;\"> As String<\/span>, strPath<span style=\"color:blue;\"> As String<\/span>, strAccessObject<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objSpecification<span style=\"color:blue;\"> As <\/span>ImportExportSpecification\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objNode_ImportExportSpecification<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objNode_ExportPDF<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_Path<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_AccessObject<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_UseISO19005_1<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objSpecification = CurrentProject.ImportExportSpecifications(strSpecification)\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n     objXML.loadXML objSpecification.XML\r\n     <span style=\"color:blue;\">Set<\/span> objNode_ImportExportSpecification = objXML.selectSingleNode(\"ImportExportSpecification\")\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_Path = objNode_ImportExportSpecification.Attributes.getNamedItem(\"Path\")\r\n     objAttribute_Path.nodeTypedValue = strPath\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objNode_ExportPDF = objNode_ImportExportSpecification.selectSingleNode(\"\/\/ExportPDF\")\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_AccessObject = objNode_ExportPDF.Attributes.getNamedItem(\"AccessObject\")\r\n     objAttribute_AccessObject.nodeTypedValue = strAccessObject\r\n         \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_UseISO19005_1 = objNode_ExportPDF.Attributes.getNamedItem(\"UseISO19005_1\")\r\n     <span style=\"color:blue;\">If <\/span>objAttribute_UseISO19005_1 Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objAttribute_UseISO19005_1 = objXML.createAttribute(\"UseISO19005_1\")\r\n         objNode_ExportPDF.Attributes.setNamedItem objAttribute_UseISO19005_1\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objAttribute_UseISO19005_1.nodeTypedValue = \"true\"\r\n     objSpecification.XML = objXML.XML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anpassen des gespeicherten Exports<\/span><\/b><\/p>\n<ul>\n<li><b>strSpezification<\/b>: Name der Spezifikation wie zuvor festgelegt<\/li>\n<li><b>strPath<\/b>: Pfad der zu erstellenden Datei<\/li>\n<li><b>strAccessObject<\/b>: Name des zu exportierenden Elements, hier der Name des Berichts<\/li>\n<\/ul>\n<p>In der Prozedur deklarieren wir ein Objekt des Typs <b>ImportExportSpecification <\/b>sowie ein XML-Dokument mit dem Typ <b>MSXML2.DOMDocument<\/b>.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir ein paar Variablen f&uuml;r <b>Node<\/b>&#8211; und <b>Attribute<\/b>-Elemente. Mit den <b>Node<\/b>-Variablen referenzieren wir die eigentlichen Elemente, mit den <b>Attribute<\/b>-Variablen die innerhalb der Elemente angegebenen Attribute.<\/p>\n<p>Im ersten Schritt referenzieren wir &uuml;ber die Auflistung <b>ImportExportSpecifications <\/b>des Objekts <b>CurrentProject <\/b>den mit <b>strSpezification <\/b>&uuml;bergebenen gespeicherten Export.<\/p>\n<p>Dann erstellen wir das <b>DOMDocument<\/b>-Objekt und f&uuml;llen es &uuml;ber die <b>loadXML<\/b>-Methode mit dem XML-Inhalt der Spezifikation.<\/p>\n<p>&Uuml;ber die <b>selectSingleNode<\/b>-Methode referenzieren wir das Element <b>ImportExportSpecification<\/b> mit der Variablen <b>objNode_ImportExportSpecification<\/b>. Daraus holen wir uns mit <b>Attributes.getNamedItem(&#8222;Path&#8220;) <\/b>das Attribut namens <b>Path<\/b> und referenzieren es mit <b>objAttribute_Path<\/b>.<\/p>\n<p>Den Wert dieses Attributes passen wir &uuml;ber die Eigenschaft <b>nodeTypedValue <\/b>auf den Wert aus dem Parameter <b>strPath <\/b>an.<\/p>\n<p>Danach widmen wir uns dem Unterelement <b>ExportPDF<\/b>, das wir mit der Variablen <b>objNode_ExportPDF <\/b>erfassen. Sein Attribut <b>AccessObject<\/b> enth&auml;lt den Namen des zu im- oder exportierenden Access-Objekts. Dieses Attribut referenzieren wir mit der Objektvariablen <b>objAttribute_AccessObject <\/b>und stellen seinen Wert &uuml;ber die Eigenschaft <b>nodeTypedValue <\/b>auf den Wert aus <b>strAccessObject <\/b>ein.<\/p>\n<p>Schlie&szlig;lich fehlt, dass wir sicherstellen, dass das Objekt im Format PDF\/A-3 exportiert wird. Weiter oben haben wir diese Einstellung bereits beim Erstellen der Spezifikation &uuml;ber die Benutzeroberfl&auml;che vorgenommen, aber wir haben dort auch angemerkt, dass wir diese Eigenschaft programmatisch setzen k&ouml;nnen.<\/p>\n<p>Wenn wir diese nicht im Dialog eingestellt haben, liegt das Attribut <b>UseISO19005_1 <\/b>normalerweise einfach nicht vor, statt den Wert <b>false <\/b>zu enthalten.<\/p>\n<p>Also pr&uuml;fen wir zun&auml;chst, ob das Objekt vorhanden ist. Dazu referenzieren wir es &uuml;ber die <b>Attributes.getNamedItem<\/b>-Funktion mit dem Wert <b>UseISO19005_1 <\/b>als Parameter. Danach pr&uuml;fen wir durch den Operator <b>Is Nothing<\/b>, ob das so gef&uuml;llte Objekt <b>objAttribute_UseISO19005_1 <\/b>vorhanden ist. Ist das nicht der Fall, erstellen wir es mit der <b>createAttribute<\/b>-Methode des <b>DOMDocument<\/b>-Objekts aus <b>objXML<\/b> und f&uuml;gen es der Auflistung <b>Attributes <\/b>des Objekts aus <b>objNode_ExportPDF <\/b>hinzu.<\/p>\n<p>Danach ist sichergestellt, dass das Attribut vorhanden ist und wir k&ouml;nnen es auf den Wert <b>true <\/b>einstellen.<\/p>\n<p>Schlie&szlig;lich weisen wir den Wert der Eigenschaft <b>XML <\/b>des <b>DOMDocument<\/b>-Objekts der gleichnamigen Eigenschaft von <b>objSpecification <\/b>zu, wodurch die ge&auml;nderte Spezifikation gespeichert wird. <\/p>\n<p>Einen Testaufruf k&ouml;nnen wir nun &uuml;ber die folgende Prozedur starten:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GespeichertenExportAnpassen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSpezifikation<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBericht<span style=\"color:blue;\"> As String<\/span>\r\n     strSpezifikation = \"Export PDF\/A-3\"\r\n     strPfad = CurrentProject.Path & \"\\Artikel_PDFA3.pdf\"\r\n     strBericht = \"rptArtikel\"\r\n     <span style=\"color:blue;\">Call<\/span> GespeichertenExportAnpassen(strSpezifikation, _\r\n         strPfad, strBericht)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach sollte der Inhalt der XML-Eigenschaft wie gew&uuml;nscht aussehen.<\/p>\n<h2>Aufruf der Prozedur zum Anpassen des gespeicherten Exports<\/h2>\n<p>Diese Prozedur k&ouml;nnen wir nun so aufrufen, nachdem wir den Bericht ge&ouml;ffnet haben (sofern dieser gefiltert werden soll) und bevor wir den gespeicherten Export mit der Methode <b>RunSaveImportExport <\/b>aufrufen. Das w&uuml;rde etwa wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GespeicherterExportGefiltert_PDFA3()\r\n     <span style=\"color:blue;\">Dim <\/span>strBericht<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSpezifikation<span style=\"color:blue;\"> As String<\/span>\r\n     strBericht = \"rptArtikel\"\r\n     strPfad = CurrentProject.Path & \"\\\" _\r\n         & strBericht & \".pdf\"\r\n     DoCmd.OpenReport strBericht, acViewPreview, , _\r\n         \"ArtikelID &lt;= 15\"\r\n     strSpezifikation = \"Export PDF\/A-3\"\r\n     strPfad = CurrentProject.Path & \"\\Artikel_PDFA3.pdf\"\r\n     <span style=\"color:blue;\">Call<\/span> GespeichertenExportAnpassen(strSpezifikation, _\r\n         strPfad, strBericht)\r\n     DoCmd.RunSavedImportExport strSpezifikation\r\n     DoCmd.Close acReport, strBericht\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Gespeicherten Export komplett selbst erstellen<\/h2>\n<p>Bleibt noch eine Optimierung: Wir sparen uns das Zusammenstellen des gespeicherten Exports &uuml;ber die Benutzeroberfl&auml;che und erstellen diesen direkt komplett selbst per VBA.<\/p>\n<p>Damit gehen wir dem Risiko aus dem Weg, dass der Benutzer einmal meint, er m&uuml;sste die Datenbank entschlacken und die gespeicherten Importe und Exporte l&ouml;schen.<\/p>\n<p>Au&szlig;erdem kennen wir die Struktur des XML-Dokuments und k&ouml;nnen dieses nun leicht nachbauen.<\/p>\n<p>Dazu nutzen wir wieder die entsprechenden XML-Objekte. Die dazu ben&ouml;tigte Prozedur finden wir in Listing 3. Die Prozedur erwartet wieder die gleichen Parameter. Sie erstellt ein <b>DOMDocument<\/b>-Objekt und f&uuml;gt diesem die &uuml;bliche erste Zeile hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GespeichertenExportErstellen(strSpezification<span style=\"color:blue;\"> As String<\/span>, strPath<span style=\"color:blue;\"> As String<\/span>, strAccessObject<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objSpecification<span style=\"color:blue;\"> As <\/span>ImportExportSpecification\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objNode_ImportExportSpecification<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode, objNode_ExportPDF<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_Path<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute, objAttribute_AccessObject<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_ObjectType<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute, objAttribute_AutoStart<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     <span style=\"color:blue;\">Dim <\/span>objAttribute_Quality<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute, objAttribute_UseISO19005_1<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n     objXML.appendChild objXML.createProcessingInstruction(\"xml\", \"version=''1.0''\")\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objNode_ImportExportSpecification = objXML.createNode(NODE_ELEMENT, \"ImportExportSpecification\", _\r\n         \"urn:www.microsoft.com\/office\/access\/imexspec\")\r\n     objXML.appendChild objNode_ImportExportSpecification\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_Path = objXML.createAttribute(\"Path\")\r\n     objAttribute_Path.nodeTypedValue = strPath\r\n     objNode_ImportExportSpecification.Attributes.setNamedItem objAttribute_Path\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objNode_ExportPDF = objXML.createNode(NODE_ELEMENT, \"ExportPDF\", \"urn:www.microsoft.com\/office\/access\/imexspec\")\r\n     objNode_ImportExportSpecification.appendChild objNode_ExportPDF\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_AccessObject = objXML.createAttribute(\"AccessObject\")\r\n     objAttribute_AccessObject.nodeTypedValue = strAccessObject\r\n     objNode_ExportPDF.Attributes.setNamedItem objAttribute_AccessObject\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_ObjectType = objXML.createAttribute(\"ObjectType\")\r\n     objAttribute_ObjectType.nodeTypedValue = \"Report\"\r\n     objNode_ExportPDF.Attributes.setNamedItem objAttribute_ObjectType\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_AutoStart = objXML.createAttribute(\"AutoStart\")\r\n     objAttribute_AutoStart.nodeTypedValue = \"false\"\r\n     objNode_ExportPDF.Attributes.setNamedItem objAttribute_AutoStart\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_Quality = objXML.createAttribute(\"Quality\")\r\n     objAttribute_Quality.nodeTypedValue = \"screen\"\r\n     objNode_ExportPDF.Attributes.setNamedItem objAttribute_Quality\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objAttribute_UseISO19005_1 = objXML.createAttribute(\"UseISO19005_1\")\r\n     objNode_ExportPDF.Attributes.setNamedItem objAttribute_UseISO19005_1\r\n     objAttribute_UseISO19005_1.nodeTypedValue = \"true\"\r\n     \r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     CurrentProject.ImportExportSpecifications.Item(strSpecification).Delete\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> objSpecification = CurrentProject.ImportExportSpecifications.Add(strSpecification, objXML.XML)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Gespeicherten Export vollst&auml;ndig per VBA erzeugen<\/span><\/b><\/p>\n<pre>&lt;?xml version=\"1.0\"?&gt;<\/pre>\n<p>Dann erstellt sie das <b>ImportExportSpecification<\/b>-Element und weist diesem den entsprechenden Namespace zu, bevor es dieses Element an das <b>DOMDocument <\/b>anh&auml;ngt. Danach erstellt sie das Attribut <b>Path <\/b>und weist den Pfad aus <b>strPath <\/b>zu.<\/p>\n<p>Danach wird das Element <b>ExportPDF <\/b>eingef&uuml;gt, wieder mit dem gleichen Namespace. Die folgenden S&auml;tze von jeweils drei Anweisungen erstellen das jeweilige Attribut, weisen diesem den entsprechenden Wert zu und h&auml;ngen das Attribut an das Element an.<\/p>\n<p>Danach ist das XML-Dokument vollst&auml;ndig. Wir l&ouml;schen nun bei deaktivierter Fehlerbehandlung eine eventuell vorhandene Import\/Export-Spezifikation mit dem Namen aus <b>strSpecification<\/b>. Dazu nutzen wir die <b>Delete<\/b>-Methode f&uuml;r das entsprechende <b>Item<\/b>-Element der <b>ImportExportSpecifications<\/b>-Auflistung.<\/p>\n<p>Danach erstellen wir dieses neu. Dazu rufen wir die <b>Add<\/b>-Methode der <b>ImportExportSpecifications<\/b>-Auflistung auf und &uuml;bergeben dieser als ersten Parameter den Namen der zu erstellenden Spezifikation aus der Variablen <b>strSpecification <\/b>und als zweiten den XML-Code aus <b>objXML.XML<\/b>.<\/p>\n<p>Um diese Prozedur zu testen, verwenden wir die Routine aus Listing 4. Diese definiert wieder den Bericht, den Pfad der zu erstellenden Datei und den Namen der zu erstellenden Spezifikation.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GespeichertenExportErstellen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSpezifikation<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBericht<span style=\"color:blue;\"> As String<\/span>\r\n     strBericht = \"rptArtikel\"\r\n     strPfad = CurrentProject.Path & \"\\\" & strBericht & \"_PDFA3.pdf\"\r\n     strSpezifikation = \"Export PDF\/A-3\"\r\n     DoCmd.OpenReport strBericht, acViewPreview, , \"ArtikelID &lt;= 15\"\r\n     <span style=\"color:blue;\">Call<\/span> GespeichertenExportErstellen(strSpezifikation, strPfad, strBericht)\r\n     DoCmd.RunSavedImportExport strSpezifikation\r\n     DoCmd.Close acReport, strBericht\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Testen des Erstellens eines gespeicherten Exports <\/span><\/b><\/p>\n<p>Dann &ouml;ffnet sie den gegebenenfalls zu filternden Bericht und ruft die Prozedur <b>GespeichertenExportErstellen<\/b> auf. Diese legt den gespeicherten Export vollst&auml;ndig neu an und l&ouml;scht einen gegebenenfalls bereits vorhandenen Export gleichen Namens.<\/p>\n<p>Dann f&uuml;hrt die aufrufende Prozedur den Export mit der Methode <b>RunSavedImportExport <\/b>auf und schlie&szlig;t den Bericht wieder.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die <b>DoCmd.OutputTo<\/b>-Methode in Microsoft Access bietet eine einfache M&ouml;glichkeit, Berichte als PDF-Dokumente zu exportieren, jedoch fehlen ihr gewisse Funktionen, wie das direkte Filtern von Berichten vor dem Export.<\/p>\n<p>Alternativl&ouml;sungen, wie das &Ouml;ffnen des Berichts in der Seitenansicht vor dem Export oder das Arbeiten mit gespeicherten Exportschritten, erweitern die M&ouml;glichkeiten und bieten Wege zur Erstellung von PDF\/A-3-kompatiblen Dokumenten. Dies ist besonders n&uuml;tzlich f&uuml;r rechtlich verbindliche Dokumente, beispielsweise f&uuml;r ZUGFeRD-Rechnungen.Mit etwas VBA-Programmierung lassen sich gespeicherte Exporte flexibel anpassen oder neu erstellen, was die Verwaltung und Automatisierung vereinfacht.<\/p>\n<p>Zuk&uuml;nftig k&ouml;nnte eine tiefere Integration und weitere Anpassung dieser Exporte zus&auml;tzliche M&ouml;glichkeiten er&ouml;ffnen, zum Beispiel f&uuml;r Unternehmen, die regelm&auml;&szlig;ig Dokumentationen im PDF\/A-Standard aus Access exportieren m&ouml;chten.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>PDFErstellenVBA.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/76C5FEC7-F969-455B-9606-443001A6D564\/aiu_1524.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;PDF erstellen mit Access im Detail&#8220; (www.access-im-unternehmen.de\/1523) haben wir uns bereits angesehen, wie wir PDF-Dokumente &uuml;ber die Benutzeroberfl&auml;che erstellen k&ouml;nnen. Typischerweise m&ouml;chte man einem Benutzer allerdings nicht die Aufgabe &uuml;berlassen, einen Bericht zu &ouml;ffnen und dann die entsprechenden Schaltfl&auml;chen im Ribbon aufzurufen, um den Bericht als PDF-Dokument zu speichern. Dazu stellen wir einen eigenen Button zur Verf&uuml;gung, mit dem wir den Bericht direkt als PDF speichern. Es fehlt also nur noch der passende VBA-Befehl. In diesem Beitrag schauen wir uns an, wie dieser lautet und welche Alternativen es gibt. Au&szlig;erdem werfen wir einen Blick darauf, wie wir Dokumente im PDF\/A-Format erzeugen. W&auml;hrend wir dazu &uuml;ber die Benutzerfl&auml;che lediglich eine Option im Dateiauswahl-Dialog aktivieren mussten, ist der Aufwand unter VBA bereits deutlich h&ouml;her. Aber immerhin ist dieser nur einmalig durchzuf&uuml;hren, weshalb wir gern darauf eingehen.<\/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":[662024,66062024,44000025],"tags":[],"class_list":["post-55001524","post","type-post","status-publish","format-standard","hentry","category-662024","category-66062024","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PDF per VBA erstellen im Detail - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PDF per VBA erstellen im Detail\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;PDF erstellen mit Access im Detail&quot; (www.access-im-unternehmen.de\/1523) haben wir uns bereits angesehen, wie wir PDF-Dokumente &uuml;ber die Benutzeroberfl&auml;che erstellen k&ouml;nnen. Typischerweise m&ouml;chte man einem Benutzer allerdings nicht die Aufgabe &uuml;berlassen, einen Bericht zu &ouml;ffnen und dann die entsprechenden Schaltfl&auml;chen im Ribbon aufzurufen, um den Bericht als PDF-Dokument zu speichern. Dazu stellen wir einen eigenen Button zur Verf&uuml;gung, mit dem wir den Bericht direkt als PDF speichern. Es fehlt also nur noch der passende VBA-Befehl. In diesem Beitrag schauen wir uns an, wie dieser lautet und welche Alternativen es gibt. Au&szlig;erdem werfen wir einen Blick darauf, wie wir Dokumente im PDF\/A-Format erzeugen. W&auml;hrend wir dazu &uuml;ber die Benutzerfl&auml;che lediglich eine Option im Dateiauswahl-Dialog aktivieren mussten, ist der Aufwand unter VBA bereits deutlich h&ouml;her. Aber immerhin ist dieser nur einmalig durchzuf&uuml;hren, weshalb wir gern darauf eingehen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-06T18:59:46+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"PDF per VBA erstellen im Detail\",\"datePublished\":\"2024-11-06T18:59:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/\"},\"wordCount\":3016,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5842addb4ee84cc987c68fb8d493b190\",\"articleSection\":[\"2024\",\"6\\\/2024\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/\",\"name\":\"PDF per VBA erstellen im Detail - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5842addb4ee84cc987c68fb8d493b190\",\"datePublished\":\"2024-11-06T18:59:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5842addb4ee84cc987c68fb8d493b190\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5842addb4ee84cc987c68fb8d493b190\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_per_VBA_erstellen_im_Detail\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PDF per VBA erstellen im Detail\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PDF per VBA erstellen im Detail - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/","og_locale":"de_DE","og_type":"article","og_title":"PDF per VBA erstellen im Detail","og_description":"Im Beitrag \"PDF erstellen mit Access im Detail\" (www.access-im-unternehmen.de\/1523) haben wir uns bereits angesehen, wie wir PDF-Dokumente &uuml;ber die Benutzeroberfl&auml;che erstellen k&ouml;nnen. Typischerweise m&ouml;chte man einem Benutzer allerdings nicht die Aufgabe &uuml;berlassen, einen Bericht zu &ouml;ffnen und dann die entsprechenden Schaltfl&auml;chen im Ribbon aufzurufen, um den Bericht als PDF-Dokument zu speichern. Dazu stellen wir einen eigenen Button zur Verf&uuml;gung, mit dem wir den Bericht direkt als PDF speichern. Es fehlt also nur noch der passende VBA-Befehl. In diesem Beitrag schauen wir uns an, wie dieser lautet und welche Alternativen es gibt. Au&szlig;erdem werfen wir einen Blick darauf, wie wir Dokumente im PDF\/A-Format erzeugen. W&auml;hrend wir dazu &uuml;ber die Benutzerfl&auml;che lediglich eine Option im Dateiauswahl-Dialog aktivieren mussten, ist der Aufwand unter VBA bereits deutlich h&ouml;her. Aber immerhin ist dieser nur einmalig durchzuf&uuml;hren, weshalb wir gern darauf eingehen.","og_url":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-11-06T18:59:46+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"PDF per VBA erstellen im Detail","datePublished":"2024-11-06T18:59:46+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/"},"wordCount":3016,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190","articleSection":["2024","6\/2024","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/","url":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/","name":"PDF per VBA erstellen im Detail - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190","datePublished":"2024-11-06T18:59:46+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/5842addb4ee84cc987c68fb8d493b190"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/PDF_per_VBA_erstellen_im_Detail\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"PDF per VBA erstellen im Detail"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001524"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001524\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}