{"id":55000891,"date":"2013-08-01T00:00:00","date_gmt":"2020-05-22T21:29:14","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=891"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Word_automatisieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/","title":{"rendered":"Word automatisieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Word bietet als Textverarbeitung ganz andere M&ouml;glichkeiten als Access-Berichte, wenn es um die Ausgabe von Texten geht. Nat&uuml;rlich liegen die Schwerpunkte bei Word auch ganz anders &#8211; so ist es grunds&auml;tzlich daf&uuml;r ausgelegt, seine Texte nacheinander zu erfassen und nicht, wie etwa ein Access-Bericht, in einer durch die verschiedenen Berichtsbereiche vorgegebenen Struktur. Wir schauen uns in diesem Beitrag an, wie Sie Texte von Access nach Word bewegen und umgekehrt.<\/b><\/p>\n<p>Im Gegensatz etwa zu Outlook ist Word eine Anwendung, von der man mehrere Instanzen erzeugen kann. Diese Erkenntnis ist wichtig, wenn Sie entscheiden, ob Sie f&uuml;r den VBA-gesteuerten Zugriff auf Word eine bestehende Instanz verwenden oder eine neue Instanz erstellen m&ouml;chten. Dazu m&uuml;ssen Sie nat&uuml;rlich erst einmal herausfinden, ob auf dem Rechner bereits eine Word-Instanz ge&ouml;ffnet ist.<\/p>\n<p>Da man grunds&auml;tzlich sagen kann, dass eine eigene Instanz einfacher zu handhaben ist, legen wir uns gleich darauf fest, jeweils eine eigene Instanz zu erzeugen. So k&ouml;nnen Sie diese Instanz bei der Erzeugung referenzieren und, wenn Sie diese nicht mehr ben&ouml;tigen, auch wieder beenden.<\/p>\n<p>Wenn Sie von Access aus eine bestehende Instanz nutzen, m&uuml;ssten Sie sich diese gegebenenfalls mit einer anderen Anwendung teilen, die darauf zugreift, oder auch mit dem Benutzer, der gerade vor dem Rechner sitzt. Um eventuelle Seiteneffekte zu vermeiden, rufen wir f&uuml;r die Automation von Access aus lieber gleich eine eigene Instanz auf. Der einzige offensichtliche Nachteil ist, dass dies mehr Ressourcen ben&ouml;tigt als eine einzige Instanz.<\/p>\n<p><b>Early Binding oder Late Binding<\/b><\/p>\n<p>Die immerw&auml;hrende Frage, ob Sie mit Early oder Late Binding arbeiten, kann man nur unter Betrachung des jeweiligen Kontext beurteilen. Wer eine Automation einer Office-Anwendung programmieren m&ouml;chte, die unter allen g&auml;ngigen Anwendungen l&auml;uft, sollte dies ohne Verwendung eines Verweises und dementsprechend mit Late Binding erledigen. Auf diese Weise verhindern Sie Probleme, die sonst beim Antreffen der falschen Version des Verweises auftreten.<\/p>\n<p>Allerdings nehmen Sie sich damit auch die M&ouml;glichkeit, auf die Ereignisse zu reagieren, die vom Word-Objekt oder vom <b>Document<\/b>-Objekt ausgel&ouml;st werden. Interessant ist dies beispielsweise, wenn Sie beobachten wollen, ob der Benutzer ein Dokument &ouml;ffnet oder schlie&szlig;t oder dieses speichert.<\/p>\n<p>Sollten Sie solche Funktionen nutzen wollen, arbeiten Sie mit Early Binding, also unter Verwendung eines fest integrierten Verweises auf die jeweils aktuelle Version der Word-Objektbibliothek.<\/p>\n<p>Diesen stellen Sie im <b>Verweise<\/b>-Dialog ein, den Sie &uuml;ber den Men&uuml;punkt <b>Extras|Verweise <\/b>des VBA-Editors (<b>Strg + G<\/b>) &ouml;ffnen &#8211; s. Bild 1. Anschlie&szlig;end k&ouml;nnen Sie mit der folgenden Anweisung eine Word-Instanz erstellen und mit einer entsprechenden Objektvariablen referenzieren:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_001.png\" alt=\"Verweis auf die Word-Bibliothek\" width=\"395\" height=\"305,3426\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf die Word-Bibliothek<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application\r\n<span style=\"color:blue;\">Set<\/span> objWord = <span style=\"color:blue;\">New<\/span> Word.Application\r\nSleep 3000\r\nobjWord.Quit\r\n<span style=\"color:blue;\">Set<\/span> objWord = Nothing<\/pre>\n<p>Dies erstellt eine Word-Instanz und schlie&szlig;t diese nach drei Sekunden wieder. Die gleiche Variante sieht beim Late Binding so aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As Object<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As Object<\/span>\r\n<span style=\"color:blue;\">Set<\/span> objWord = _\r\n     CreateObject(\"Word.Application\")\r\n<span style=\"color:blue;\">Set<\/span> objDocument = objWord.Documents.Add<\/pre>\n<p>Um das Word-Fenster anzuzeigen und in den Vordergrund zu holen, sind ein paar Zeilen mehr n&ouml;tig. Wir erzeugen zus&auml;tzlich ein neues, leeres Word-Dokument, machen die Word-Instanz mit der <b>Visible<\/b>-Eigenschaft sichtbar und holen das Anwendungsfenster mit der <b>AppActivate<\/b>-Methode nach vorn:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application\r\n<span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n<span style=\"color:blue;\">Set<\/span> objWord = <span style=\"color:blue;\">New<\/span> Word.Application\r\n<span style=\"color:blue;\">Set<\/span> objDocument = objWord.Documents.Add\r\nobjWord.Visible = <span style=\"color:blue;\">True<\/span>\r\nAppActivate objDocument.Name\r\nSleep 3000\r\nobjWord.Quit\r\n<span style=\"color:blue;\">Set<\/span> objWord = Nothing<\/pre>\n<p>Auch diese Instanz soll nach drei Sekunden wieder verschwinden. Sie k&ouml;nnen auch ohne explizites Erzeugen eines Word-Objekts ein Dokument in Word erzeugen oder &ouml;ffnen. Das geht schlicht so:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n<span style=\"color:blue;\">Set<\/span> objDocument = <span style=\"color:blue;\">New<\/span> Word.Document\r\nobjDocument.Parent.Visible = <span style=\"color:blue;\">True<\/span>\r\nAppActivate objDocument.Name\r\nSleep 3000\r\nobjDocument.Close<\/pre>\n<p>Nach dem Schlie&szlig;en bleibt die Word-Instanz allerdings bestehen. Sie m&uuml;ssen diese dann manuell schlie&szlig;en oder per Code &uuml;ber die Parent-Eigenschaft des Word-Dokuments:<\/p>\n<pre>objDocument.Parent.Quit<\/pre>\n<p>Dazu muss das Dokument nat&uuml;rlich noch ge&ouml;ffnet sein. Wenn das Dokument vom Erzeugen beziehungsweise &ouml;ffnen bis zum Schlie&szlig;en noch bearbeitet wird, erscheint beim Versuch, Word zu schlie&szlig;en, ein Dialog, der fragt, ob das Dokument gespeichert werden soll (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_002.png\" alt=\"R&uuml;ckfrage vor dem Schlie&szlig;en eines Dokuments\" width=\"570\" height=\"465,9696\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: R&uuml;ckfrage vor dem Schlie&szlig;en eines Dokuments<\/span><\/b><\/p>\n<p>Dies k&ouml;nnen Sie verhindern, indem Sie festlegen, was beim Schlie&szlig;en geschehen soll: Soll Word das Dokument ohne R&uuml;ckfrage speichern Oder die &auml;nderungen verwerfen Dies legen Sie mit einem der folgenden Werte f&uuml;r den ersten Parameter der <b>Close<\/b>-Methode des <b>Document<\/b>-Objekts fest:<\/p>\n<ul>\n<li><b>wdDoNotSaveChanges<\/b>: Schlie&szlig;t das Dokument, ohne zu speichern.<\/li>\n<li><b>wdPromptToSaveChanges<\/b>: Fragt den Benutzer, ob das Dokument gespeichert werden soll (Standardwert).<\/li>\n<li><b>wdSaveChanges<\/b>: Speichert die &auml;nderungen.<\/li>\n<\/ul>\n<p>Wenn Sie das Speichern-Verhalten auf diese Weise beeinflussen m&ouml;chten, m&uuml;ssen Sie die Word-Instanz allerdings explizit instanzieren.<\/p>\n<p>Anderenfalls k&ouml;nnten Sie diese nach dem Schlie&szlig;en des <b>Document<\/b>-Objekts nicht mehr refenzieren und m&uuml;ssten Word manuell schlie&szlig;en (sofern sichtbar) oder &uuml;ber den Task-Manager terminieren (wenn das Word-Fenster nicht eingeblendet wurde).<\/p>\n<p>Wenn Sie selbst das Dokument per VBA mit Text f&uuml;llen oder vorhandenen Text bearbeiten, werden Sie die &auml;nderungen vor dem Schlie&szlig;en speichern wollen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application\r\n<span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n<span style=\"color:blue;\">Set<\/span> objWord = <span style=\"color:blue;\">New<\/span> Word.Application\r\n<span style=\"color:blue;\">Set<\/span> objDocument = objWord.Documents.Add\r\nobjWord.Visible = <span style=\"color:blue;\">True<\/span>\r\nAppActivate objDocument.Name\r\nobjDocument.Range = \"Hallo\"\r\nSleep 3000\r\nobjDocument.Close, \r\nobjWord.Quit\r\n<span style=\"color:blue;\">Set<\/span> objWord = Nothing<\/pre>\n<p>Haben Sie ein neues Dokument erstellt, wurde dies allerdings zuvor noch nicht gespeichert &#8211; ein Versuch, das Dokument zu schlie&szlig;en und automatisch zu speichern, schl&auml;gt fehl, da Word noch keinen Speicherort kennt. In diesem Fall speichern Sie es zuvor manuell unter dem gew&uuml;nschten Namen. Dabei geben Sie optimalerweise direkt das gew&uuml;nschte Format an, hier als Word-Dokument:<\/p>\n<pre>objDocument.SaveAs2 CurrentProject.Path \r\n& \"\\word.doc\", wdFormatDocument<\/pre>\n<p>Dies verwendet das &auml;ltere <b>.doc<\/b>-Format. Wenn Sie das neue XML-Format verwenden m&ouml;chten (Dateiendung <b>.docx<\/b>), verwenden Sie diese Anweisung:<\/p>\n<pre>objDocument.SaveAs2 CurrentProject.Path \r\n& \"\\word.docx\", wdFormatXMLDocument<\/pre>\n<p>Beide Anweisungen speichern das Dokument im Verzeichnis der aktuellen Access-Datenbank.<\/p>\n<p><b>Bestehendes Dokument &ouml;ffnen<\/b><\/p>\n<p>Sie k&ouml;nnen auch auf ein bereits bestehendes Dokument zugreifen. Dazu verwenden Sie die <b>Open<\/b>-Methode der <b>Documents<\/b>-Auflistung des Word-Objekts:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDocument = objWord.Documents.Open(CurrentProject.Path & \"\\word.doc\")<\/pre>\n<p>Auch dies gelingt mit Late Binding &#8211; in diesem Fall ohne vorherige Instanzierung eines Word-Objekts:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDocument = GetObject( CurrentProject.Path & \"\\word.doc\")<\/pre>\n<p>Sie m&uuml;ssen also einfach nur den Namen des zu &ouml;ffnenden Dokuments als Parameter der <b>GetObject<\/b>-Methode angeben.<\/p>\n<p><b>Text einf&uuml;gen<\/b><\/p>\n<p>Nachdem Sie ein Word-Dokument erstellt oder ge&ouml;ffnet haben, m&ouml;chten Sie Text einf&uuml;gen.<\/p>\n<p>Dies gelingt am einfachsten, indem Sie dem mit der <b>Range<\/b>-Eigenschaft geliefernten Objekt des Word-Dokuments einen Text zuweisen:<\/p>\n<pre>objDocument.Range.Text = \"Range-Objekt gef&uuml;llt\"<\/pre>\n<p>Was aber ist dieses <b>Range<\/b>-Objekt &uuml;berhaupt<\/p>\n<p>Ein <b>Range<\/b>-Objekt markiert verschiedene Bereiche eines Dokuments. Das <b>Range<\/b>-Objekt des <b>Document<\/b>-Objekts etwa markiert den kompletten Inhalt. Wenn Sie der <b>Text<\/b>-Eigenschaft dieses <b>Range<\/b>-Objekts einen Text zuweisen, wird der komplette Bereich mit dem angegebenen Text &uuml;berschrieben.<\/p>\n<p>Sie k&ouml;nnen dies einfach experimentell pr&uuml;fen, indem Sie eine Objektvariable f&uuml;r ein <b>Document<\/b>-Objekt im Kopf eines Standardmoduls deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objDoc<span style=\"color:blue;\"> As <\/span>Word.Document<\/pre>\n<p>Dieses f&uuml;llen Sie dann mit der folgenden Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TextExperimente()\r\n     <span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application\r\n     <span style=\"color:blue;\">Set<\/span> objWord = <span style=\"color:blue;\">New<\/span> Word.Application\r\n     <span style=\"color:blue;\">Set<\/span> objDoc = objWord.Documents.Add\r\n     objWord.Visible = <span style=\"color:blue;\">True<\/span>\r\n     AppActivate objDoc.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Dokument bleibt ge&ouml;ffnet und Sie k&ouml;nnen &uuml;ber das Direktfenster mit der Variablen <b>objDoc <\/b>auf das Dokument zugreifen.<\/p>\n<p>Wenn Sie dort beispielsweise die folgende Zeile eingeben, wird der entsprechende Text angelegt (s. Bild 3):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_003.png\" alt=\"Einf&uuml;gen von Texten &uuml;ber den Direktbereich\" width=\"700\" height=\"315,4945\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Einf&uuml;gen von Texten &uuml;ber den Direktbereich<\/span><\/b><\/p>\n<pre>objDoc.Range.Text = \"Text aus dem Direktbereich\"<\/pre>\n<p>Um zu erkennen, welchen Bereich die <b>Range<\/b>-Eigenschaft jeweils zur&uuml;ckgibt, k&ouml;nnen Sie den Bereich per VBA markieren:<\/p>\n<pre>objDoc.Range.Select<\/pre>\n<p>Die Markierung ist nicht direkt sichtbar, also aktivieren Sie entweder manuell das Word-Fenster oder Sie aktivieren dieses mit dieser Anweisung:<\/p>\n<pre>AppActivate objDoc.Name<\/pre>\n<p>Tippen Sie einmal einige Abs&auml;tze in das Dokument und wiederholen das Markieren des <b>Range<\/b>-Objekts von <b>objDoc<\/b>, erkennen sie, dass dieses Range-Objekt immer den kompletten Dokumentinhalt betrifft.<\/p>\n<p>Beim Experimentieren werden Fehler auftreten, was dazu f&uuml;hrt, dass die Objektvariable <b>objDoc<\/b> ihren Inhalt verliert.<\/p>\n<p>Mit der folgenden kleinen Prozedur f&uuml;llen Sie diese wieder &#8211; vorausgesetzt, w&auml;hrend der Experimente gibt es nur eine Word-Instanz mit nur einem Dokument (s. Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AktuellesDokumentReferenzieren()\r\n     <span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application\r\n     <span style=\"color:blue;\">Set<\/span> objWord = GetObject(, \"Word.Application\")\r\n     <span style=\"color:blue;\">Set<\/span> objDoc = objWord.Documents(1)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Referenzieren des aktuellen Dokuments<\/span><\/b><\/p>\n<p><b>Dokumentinhalt einlesen<\/b><\/p>\n<p>Andersherum k&ouml;nnen Sie den Inhalt eines <b>Range<\/b>-Objekts auch &uuml;ber das Direktfenster auslesen. Dazu geben Sie beispielsweise mit der <b>Debug.Print<\/b>-Anweisung den Inhalt der Eigenschaft <b>Text<\/b> des aktuellen <b>Range<\/b>-Objekts aus.<\/p>\n<p><b>Abs&auml;tze<\/b><\/p>\n<p>Ein Absatz in einem Word-Dokument ist ein Text, der mit dem Zeilenumbruch abgeschlossen wird, also dem Zeichen, das Sie unter VBA mit <b>vbCr <\/b>beziehungsweise <b>Chr(13)<\/b> darstellen k&ouml;nnen. Die durch dieses Zeichen voneinander getrennten Abs&auml;tze k&ouml;nnen Sie mit der <b>Paragraphs<\/b>-Auflistung erfassen und mit einer Objektvariablen des Typs <b>Paragraph <\/b>referenzieren. In Bild 4 haben wir beispielsweise den Inhalt des zweiten Absatzes im Direktfenster ausgegeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_004.png\" alt=\"Zugriff auf einen Absatz per Paragraphs-Auflistung\" width=\"570\" height=\"367,0515\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Zugriff auf einen Absatz per Paragraphs-Auflistung<\/span><\/b><\/p>\n<p>Wollen Sie den Text eines Absatzes ver&auml;ndern, k&ouml;nnen Sie diesen gezielt referenzieren und anpassen &#8211; und zwar so:<\/p>\n<pre>objdoc.Paragraphs(2).Range.Text = \"Neuer Text in Absatz 2\"<\/pre>\n<p>Das Ergebnis f&auml;llt allerdings nicht wie gew&uuml;nscht aus: Der Text des zweiten Absatzes wird zwar ersetzt, aber der zweite Absatz verschmilzt mit dem dritten Absatz. Der Grund ist einfach: Sie haben einen Absatz, dessen Text mit einem Zeilenumbruch abgeschlossen wurde, durch einen Text ohne Zeilenumbruch ersetzt. Die folgende Anweisung ersetzt den Absatz schlie&szlig;lich wie gew&uuml;nscht:<\/p>\n<pre>objDoc.Paragraphs(2).Range.Text = \"Neuer Text in Absatz 2\" & <span style=\"color:blue;\">vbCr<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Nun wird genau der gew&uuml;nschte Absatz ersetzt.<\/p>\n<p><b>Abs&auml;tze durchlaufen<\/b><\/p>\n<p>Wenn Sie in <b>objDoc <\/b>eine Referenz auf ein ge&ouml;ffnetes Word-Dokument gespeichert haben, k&ouml;nnen Sie die Abs&auml;tze des Dokuments &uuml;ber die Auflistung <b>Paragraphs <\/b>durchlaufen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>p<span style=\"color:blue;\"> As <\/span>Word.Paragraph\r\nFor Each p In objDoc.Paragraphs\r\n     <span style=\"color:blue;\">Debug.Print<\/span> p.Range.Text\r\n<span style=\"color:blue;\">Next<\/span> p<\/pre>\n<p>Dies gibt alle Abs&auml;tze im Direktfenster aus, wobei jeweils eine Zeile frei bleibt &#8211; dies deshalb, weil <b>Debug.Print <\/b>ohnehin immer eine neue Zeile beginnt und jede Zeile mit <b>vbCr <\/b>einen eigenen Zeilenumbruch mitbringt. Die <b>Paragraphs<\/b>-Auflistung bringt auch die M&ouml;glichkeit mit, die Anzahl auszugeben:<\/p>\n<pre>objDoc.Paragraphs.Count<\/pre>\n<p>Dies ist wichtig, wenn Sie einmal alle oder bestimmte Abs&auml;tze l&ouml;schen m&ouml;chten. In diesem Fall k&ouml;nnen Sie die <b>Paragraphs<\/b>-Auflistung nicht mit <b>For Each <\/b>durchlaufen, sondern r&uuml;ckw&auml;rts mit der <b>For&#8230;Next<\/b>-Schleife:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>p<span style=\"color:blue;\"> As <\/span>Word.Paragraph\r\n<span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = objDoc.Paragraphs.Count  To 1 Step -1\r\n     <span style=\"color:blue;\">Set<\/span> p = objDoc.Paragraphs(i)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> p.Range.Text\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Wollen Sie den Absatz nicht ausgeben, sondern l&ouml;schen, verwenden Sie diese Zeile:<\/p>\n<pre>p.Range.Delete<\/pre>\n<p>Sie l&ouml;schen also nicht das <b>Paragraph<\/b>-Objekt, sondern das dadurch markierte <b>Range<\/b>-Objekt.<\/p>\n<p><b>Absatz hinzuf&uuml;gen<\/b><\/p>\n<p>Dass Sie einen Absatz nicht &uuml;ber die <b>Range<\/b>-Eigenschaft des Dokuments hinzuf&uuml;gen k&ouml;nnen, wurde bereits weiter oben deutlich &#8211; dieses Objekt markiert n&auml;mlich das komplette Dokument.<\/p>\n<p>Wenn wir beispielsweise einen Absatz hinter dem letzten bestehenden Absatz einf&uuml;gen m&ouml;chten, m&uuml;ssen wir  ein <b>Range<\/b>-Objekt definieren, das bis zum Ende des Ziels reicht und dann den gew&uuml;nschten Text mit der Methode <b>InsertAfter <\/b>einf&uuml;gen.<\/p>\n<p>In einem ersten, naiven Ansatz probieren wir es so:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>p<span style=\"color:blue;\"> As <\/span>Word.Paragraph\r\n<span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>rng<span style=\"color:blue;\"> As <\/span>Word.Range\r\ni = objDoc.Paragraphs.Count\r\n<span style=\"color:blue;\">Set<\/span> rng = objDoc.Paragraphs(i)\r\nrng.InsertAfter \"Test\"<\/pre>\n<p>Das hei&szlig;t, wir ermitteln den Index des letzten Absatzes, erstellen ein <b>Range<\/b>-Objekt auf Basis dieses Absatzes und f&uuml;gen dann mit der Methode <b>Insert-After <\/b>einen neuen Text ein.<\/p>\n<p>Damit h&auml;ngen wir allerdings keinen neuen Absatz an, sondern nur ein paar Zeichen an den letzten Absatz. Au&szlig;erdem gibt es eine elegantere Methode, um den letzten Absatz zu ermitteln. Zusammen sieht die verbesserte Variante so aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>rng<span style=\"color:blue;\"> As <\/span>Word.Range\r\n<span style=\"color:blue;\">Set<\/span> rng = objDoc.Paragraphs.Last.Range\r\nrng.InsertAfter <span style=\"color:blue;\">vbCr<\/span> & \"Test\"<\/pre>\n<p>Wir referenzieren den letzten Absatz direkt mit dem <b>Range<\/b> des mit der Eigenschaft <b>Last <\/b>ermittelten letzten Absatzes. Schlie&szlig;lich stellen wir dem neuen Text einen Zeilenumbruch voran, wodurch der Text gleich in einem neuen Absatz landet.<\/p>\n<p><b>Daten aus Tabelle in Dokument schreiben<\/b><\/p>\n<p>Nutzen wir die bisherigen Erkenntnisse doch, um den Inhalt einer Access-Tabelle in ein Word-Dokument zu schreiben &#8211; und zwar Zeile f&uuml;r Zeile.<\/p>\n<p>In diesem Beispiel wollen wir wie in Bild 5 den Inhalt der Felder <b>ArtikelID <\/b>und <b>Artikelname <\/b>der Tabelle <b>tblArtikel <\/b>in je eine Zeile eines neu zu erstellenden Word-Dokuments eintragen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_005.png\" alt=\"Per VBA eingetragene Abs&auml;tze\" width=\"395\" height=\"406,4825\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Per VBA eingetragene Abs&auml;tze<\/span><\/b><\/p>\n<p>Dies gelingt in einer einfachen Schleife, wobei mit jedem Durchlauf der letzte Absatz als <b>Range<\/b>-Objekt referenziert wird und die gew&uuml;nschten Werte dahinter eingef&uuml;gt werden.<\/p>\n<p>Da wir in diesem Fall gleich mit dem ersten Absatz beginnen, h&auml;ngen wir den Zeilenumbruch (<b>vbCr<\/b>) hinten an den anzuf&uuml;genden Ausdruck an (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Artikelliste()\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>rng<span style=\"color:blue;\"> As <\/span>Word.Range\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = <span style=\"color:blue;\">New<\/span> Word.Document\r\n     AppActivate objDocument.Name\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT ArtikelID, Artikelname FROM tblArtikel\", _\r\n         dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Set<\/span> rng = objDocument.Paragraphs.Last.Range\r\n         rng.InsertAfter rst!ArtikelID & vbTab & rst!Artikelname & <span style=\"color:blue;\">vbCr<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Einf&uuml;gen der Datens&auml;tze einer Tabelle in ein Word-Dokument<\/span><\/b><\/p>\n<p><b>Zeichenformat festlegen<\/b><\/p>\n<p>Nun m&ouml;chten wir vielleicht jeweils die <b>ArtikelID <\/b>fett drucken oder den Artikelnamen kursiv. Gerade die Hervorhebung einzelner Textelemente ist ja ein gro&szlig;er Vorteil von Word gegen&uuml;ber her-k&ouml;mmlichen Textfeldern in Access-Berichten.<\/p>\n<p>Dazu liefert das <b>Range<\/b>-Objekt einige interessante Eigen-schaften &#8211; mehr dazu weiter unten.<\/p>\n<p><b>Mit Textmarken arbeiten<\/b><\/p>\n<p>Normalerweise versteht man unter dem Arbeiten mit Textmarken, dass diese in einer Dokumentvorlage festgelegt und dann sp&auml;ter etwa per VBA mit konkreten Inhalten gef&uuml;llt werden.<\/p>\n<p>In unserem Fall sollen die Textmarken etwas flexibler eingesetzt werden &#8211; beispielsweise, um einen Text nachtr&auml;glich zu formatieren.<\/p>\n<p>Dazu w&uuml;rde man beim Schreiben des Textes die einzelnen Elemente direkt mit entsprechenden Bookmarks versehen, um nachher &uuml;ber diese auf die Textbereiche zugreifen zu k&ouml;nnen.<\/p>\n<p>Um hiermit einigerma&szlig;en sinn-voll zu experimen-tieren, soll-ten Sie zun&auml;chst die Anzeige von Textmarken aktivieren.<\/p>\n<p>Dazu &ouml;ffnen Sie die Word-Optionen, wechseln dort zum Bereich <b>Erweitert<\/b> und aktivieren unter <b>Dokumentinhalt anzeigen <\/b>die Option <b>Textmarken anzeigen <\/b>(s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_006.png\" alt=\"Aktivierung der Anzeige von Textmarken\" width=\"570\" height=\"301,8864\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Aktivierung der Anzeige von Textmarken<\/span><\/b><\/p>\n<p><b>Offene und geschlossene Textmarken<\/b><\/p>\n<p>Bevor wir loslegen, m&uuml;ssen wir uns um die verschiedenen Arten von Textmarken k&uuml;mmern.<\/p>\n<p>Eine offene Textmarke ist lediglich eine Markierung an einer Stelle im Dokument, eine geschlossene Textmarke ist die Markierung eines oder mehrerer Zeichen oder Elemente im Text.<\/p>\n<p>Das bedeutet, dass Sie eine offene Textmarke lediglich dazu nutzen k&ouml;nnen, eine Aktion an einer bestimmten Stelle durchzuf&uuml;hren &#8211; also etwa einen Text einzuf&uuml;gen. Eine geschlossene Textmarke k&ouml;nnen Sie dazu ebenfalls verwenden. Wenn Sie einer offenen Textmarke einen Text zuweisen, wird diese Textmarke allerdings zerst&ouml;rt. Sie k&ouml;nnen allerdings auch eine Reihe Dinge mit dem Inhalt einer Textmarke erledigen &#8211; beispielsweise einfach den Inhalt auslesen oder diesen nach Wunsch formatieren. Aber auch f&uuml;r das Ersetzen des Inhalts einer Textmarke gibt es einen Workaround.<\/p>\n<p>Schauen wir uns zun&auml;chst an, wie Sie &uuml;berhaupt Textmarken anlegen. Eine offene Textmarke erstellen Sie beispielsweise mit der folgenden Anweisung:<\/p>\n<pre>objDocument.Bookmarks.Add \"TMOffen\"<\/pre>\n<p>Dies f&uuml;gt eine Textmarke namens <b>TMOffen <\/b>zum aktuellen Dokument hinzu.<\/p>\n<p>Wenn Sie nichts anderes angeben, wird die Textmarke immer zu Beginn des aktuellen <b>Range<\/b>-Objekts des Bereichs hinzuf&uuml;gt, dessen Bookmarks-Auflistung aufgerufen wird. Im folgenden Beispiel ist dies die <b>Bookmarks<\/b>-Auflistung des Dokuments:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rng = objDocument.Range\r\nrng.InsertAfter \"Text vor Textmarke\"\r\nobjDocument.Bookmarks.Add \"TMOffen\"\r\nrng.InsertAfter \"Text nach Textmarke\"<\/pre>\n<p>Das Ergebnis sieht wie in Bild 7 aus. Wenn die Textmarke an der richtigen Stelle landen soll, ben&ouml;tigen Sie erstens ein <b>Range<\/b>-Objekt, das an der entsprechenden Stelle beginnt, und Sie m&uuml;ssen die <b>Bookmarks<\/b>-Auflistung f&uuml;r dieses <b>Range<\/b>-Objekt verwenden. Das sieht so aus und liefert das Ergebnis aus Bild 8:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_007.png\" alt=\"Hinzuf&uuml;gen einer Textmarke zum Range-Objekt des Dokuments\" width=\"395\" height=\"174,791\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Hinzuf&uuml;gen einer Textmarke zum Range-Objekt des Dokuments<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_008.png\" alt=\"Einf&uuml;gen einer Textmarke zu Beginn eines zuvor definierten Bereichs\" width=\"395\" height=\"175,4767\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Einf&uuml;gen einer Textmarke zu Beginn eines zuvor definierten Bereichs<\/span><\/b><\/p>\n<pre>rng.InsertAfter \"Text vor Textmarke\"\r\nrng.Start = rng.End\r\nobjDocument.Bookmarks.Add \"TMOffen\"\r\nrng.InsertAfter \"Text nach Textmarke\"<\/pre>\n<p><b>Geschlossene Textmarke anlegen<\/b><\/p>\n<p>Eine geschlossene Textmarke legen Sie prinzipiell genauso an wie eine offene &#8211; mit dem kleinen Unterschied, dass Sie der <b>Add<\/b>-Methode der <b>Bookmarks<\/b>-Auflistung noch einen Range-Bereich als zweiten Parameter mitgeben. Dieser definiert dann den Bereich, der durch die Textmarke erfasst werden soll.<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rng = objDocument.Range\r\nrng.InsertAfter \"Text vor Textmarke\"\r\nrng.Bookmarks.Add \"TMGeschlossen\", rng\r\nrng.InsertAfter \"Text nach Textmarke\"<\/pre>\n<p>Die Textmarke wird durch zwei eckige Klammern repr&auml;sentiert (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_009.png\" alt=\"Einf&uuml;gen einer geschlossenen Textmarke\" width=\"395\" height=\"173,6032\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Einf&uuml;gen einer geschlossenen Textmarke<\/span><\/b><\/p>\n<p><b>Geschlossene Textmarke mit Text f&uuml;llen<\/b><\/p>\n<p>Wie bereits erw&auml;hnt, k&ouml;nnen Sie den mit einer Textmarke erfassten Text nicht auf folgende einfache Weise ersetzen:<\/p>\n<pre>rng.Bookmarks.Add \"TMGeschlossen\", rng\r\nrng.Bookmarks(\"TMGeschlossen\").Range.Text = \"bla\"<\/pre>\n<p>Die Textmarke wird bei diesem Versuch einfach gel&ouml;scht. Dieses Problem l&auml;sst sich umgehen, wenn Sie das <b>Range<\/b>-Objekt der Textmarke mit einer <b>Range<\/b>-Objektvariablen referenzieren, deren Text wie gew&uuml;nscht anpassen und dann eine neue Textmarke gleichen Namens auf Basis dieses <b>Range<\/b>-Objekts erstellen (s. Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_007.png\" alt=\"Textmarke l&ouml;schen und neu erstellen\" width=\"395\" height=\"174,791\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Textmarke l&ouml;schen und neu erstellen<\/span><\/b><\/p>\n<p><b>ArtikelID und Artikelname nachtr&auml;glich formatieren<\/b><\/p>\n<p>Nun ist das Ziel, f&uuml;r alle Elemente der Tabelle <b>tblArtikel<\/b>, die wir mit der Prozedur von weiter oben in ein neues Word-Dokument eingef&uuml;gt haben, jeweils eine Textmarke anzulegen.<\/p>\n<p>Die f&uuml;r die <b>ArtikelID <\/b>sollen <b>ID1<\/b>, <b>ID2 <\/b>und so weiter hei&szlig;en, die f&uuml;r die Artikelnamen <b>Artikelname1<\/b>, <b>Artikelname2 <\/b>und so weiter. Das gelingt, indem Sie die Prozedur wie folgt anpassen. Zun&auml;chst f&uuml;gen Sie eine Variable namens <b>bkm <\/b>zum Speichern des aktuellen <b>Bookmark<\/b>-Objekts hinzu:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bkm<span style=\"color:blue;\"> As <\/span>Word.Bookmark<\/pre>\n<p>Vor dem Eintritt in die <b>Do While<\/b>-Schleife stellen wir das <b>Range<\/b>-Objekt auf den <b>Range <\/b>des frisch erstellten Dokuments ein:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rng = objDocument.Range<\/pre>\n<p>Innerhalb der Schleife geht es dann rund &#8211; die folgenden Zeilen stellen nur die Anweisungen innerhalb der <b>Do While<\/b>-Schleife dar. Die erste Anweisung stellt die Startposition des <b>Range<\/b>-Objekts auf die bis dahin g&uuml;ltige Endposition ein:<\/p>\n<pre>rng.Start = rng.End<\/pre>\n<p>Dahinter f&uuml;gt die Prozedur dann zun&auml;chst die <b>ArtikelID <\/b>ein:<\/p>\n<pre>rng.InsertAfter rst!ArtikelID<\/pre>\n<p>Das <b>Range<\/b>-Objekt umfasst nun genau diese <b>ArtikelID<\/b>. Dieser Bereich soll, hier am Beispiel des Wertes <b>1 <\/b>f&uuml;r die <b>ArtikelID<\/b>, nun in einem <b>Bookmark<\/b>-Objekt namens <b>ID1 <\/b>gespeichert werden:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> bkm = objDocument.Bookmarks.Add(\"ID\" & rst!ArtikelID, rng)<\/pre>\n<p>Als Abstandhalter zwischen <b>ArtikelID <\/b>und <b>Artikelname <\/b>soll ein Tabulatorzeichen eingef&uuml;gt werden:<\/p>\n<pre>rng.InsertAfter vbTab<\/pre>\n<p>Das <b>Range<\/b>-Objekt wird um dieses Zeichen erweitert. Wir wollen nun ein <b>Range<\/b>-Element definieren, das nur den im Anschluss hinzugef&uuml;gten Artikelnamen enth&auml;lt. Dazu verschieben wir den Start des mit <b>rng <\/b>definierten Bereichs auf dessen Ende:<\/p>\n<pre>rng.Start = rng.End<\/pre>\n<p>Dann f&uuml;gen wir den Artikelnamen ein und erstellen ein neues <b>Bookmark<\/b>-Element, dass von der aktuellen Position (also hinter dem Tabulator-Zeichen) bis zum Ende des Artikelnamens reicht:<\/p>\n<pre>rng.InsertAfter rst!Artikelname\r\nobjDocument.Bookmarks.Add \"Artikelname\" _\r\n     & rst!ArtikelID, rng<\/pre>\n<p>Hinter diesem Bereich f&uuml;gen wir dann noch einen Zeilenumbruch ein und fahren mit dem n&auml;chsten Datensatz innerhalb der <b>Do While<\/b>-Schleife fort.<\/p>\n<pre>rng.InsertAfter <span style=\"color:blue;\">vbCr<\/span>\r\nrst.Move<span style=\"color:blue;\">Next<\/span><\/pre>\n<p>Das Ergebnis sieht nun wie in Bild 10 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_010.png\" alt=\"Textmarken pro Feld\" width=\"570\" height=\"392,0909\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Textmarken pro Feld<\/span><\/b><\/p>\n<p>Innerhalb einer kleinen weiteren Schleife &uuml;ber alle Datens&auml;tze k&ouml;nnten Sie nun alle <b>ArtikelID<\/b>-Werte fett formatieren und alle Artikelnamen kursiv (s. Listing 3).<\/p>\n<pre>rst.MoveFirst\r\n<span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n     objDocument.Bookmarks(\"ID\" _\r\n         & rst!Artikelid).Range.Font.Bold = <span style=\"color:blue;\">True<\/span>\r\n     objDocument.Bookmarks(\"Artikelname\" _\r\n         & st!Artikelid).Range.Font.Italic = <span style=\"color:blue;\">True<\/span>\r\n     rst.Move<span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">Loop<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Formatieren des Inhalts von Textmarken<\/span><\/b><\/p>\n<p>Das Ergebnis sieht dann wie in Bild 12 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_011.png\" alt=\"Formatierte Bookmark-Inhalte\" width=\"570\" height=\"351,9199\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Formatierte Bookmark-Inhalte<\/span><\/b><\/p>\n<p><b>Textformatierungen<\/b><\/p>\n<p>Die Textformatierungen, die Sie hier festlegen k&ouml;nnen, sind die &uuml;blichen. Hier sind die notwendigen Eigenschaften:<\/p>\n<ul>\n<li><b>.Font.Bold<\/b>: Fett<\/li>\n<li><b>.Font.Italic<\/b>: Kursiv<\/li>\n<li><b>.Font.Name<\/b>: Name der Schriftart<\/li>\n<li><b>.Font.Size<\/b>: Gr&ouml;&szlig;e der Schriftart<\/li>\n<\/ul>\n<p><b>Zeichenformate<\/b><\/p>\n<p>Sie k&ouml;nnen nat&uuml;rlich auch Zeichenformate definieren, um W&ouml;rter oder auch Textabschnitte immer mit dem gleichen Format zu versehen. Sie k&ouml;nnten also etwa ein Zeichenformat anlegen, das die betroffenen Zeichen fett markiert und dessen Bezeichnung <b>Hervorgehoben <\/b>hei&szlig;t.<\/p>\n<p>Wenn Sie nun entscheiden, dass sich eine fette Markierung nicht eignet und Sie lieber eine kursive Hervorhebung w&uuml;nschen, brauchen Sie nur das Zeichenformat anzupassen und nicht jede einzelne Formatierung. Ein solches Zeichenformat f&uuml;r ein Dokument legen Sie mit der Prozedur aus Listing 4 an.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Zeichenformat()\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>rng<span style=\"color:blue;\"> As <\/span>Word.Range\r\n     <span style=\"color:blue;\">Dim <\/span>objStyle<span style=\"color:blue;\"> As <\/span>Word.Style\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = <span style=\"color:blue;\">New<\/span> Word.Document\r\n     objDocument.Parent.Visible = <span style=\"color:blue;\">True<\/span>\r\n     AppActivate objDocument.Name\r\n     <span style=\"color:blue;\">Set<\/span> objStyle = objDocument.Styles.Add(\"MeineHervorhebung\", _\r\n         wdStyleTypeCharacter)\r\n     <span style=\"color:blue;\">With<\/span> objStyle\r\n         .Font.Bold = <span style=\"color:blue;\">True<\/span>\r\n         .QuickStyle = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     objDocument.Range.Text = \"Ein Satz mit einem hervorgehobenen Wort.\"\r\n     <span style=\"color:blue;\">Set<\/span> rng = objDocument.Range.Words.Item(5)\r\n     rng.Style = \"MeineHervorhebung\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Erstellen eines neuen Zeichenformats<\/span><\/b><\/p>\n<p>Die Prozedur erstellt ein neues Objekt des Typs <b>Style <\/b>namens <b>MeineHervorhebung <\/b>und stellt die Eigenschaft <b>Type <\/b>beim Anlegen auf <b>wdStyleTypeCharacter <\/b>an. Weiter unten besprechen wir noch die Styles auf Basis des Typs <b>wdStyleTypeParagraph<\/b> &#8211; diese dienen der Formatierung von Abs&auml;tzen (Absatzformat). Nach dem Erzeugen des <b>Style<\/b>-Objekts legt die Prozedur den Wert <b>True <\/b>f&uuml;r die Eigenschaft <b>Font.Bold <\/b>fest. Das bedeutet, dass damit ausgezeichnete Elemente fett dargestellt werden (s. Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_012.png\" alt=\"Zuweisen einer Zeichenformatierung an ein einzelnes Wort\" width=\"570\" height=\"175,6025\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Zuweisen einer Zeichenformatierung an ein einzelnes Wort<\/span><\/b><\/p>\n<p>Die Eigenschaft <b>Quickstyle <\/b>legt fest, dass die Formatvorlage in den Schnellvorlagen angezeigt wird. Die folgenden Zeilen zeigen gleich noch ein Beispiel f&uuml;r die Anwendung einer solchen Zeichenvorlage.<\/p>\n<p>Dabei schreibt die Prozedur einen Satz in ein neues Dokument und definiert ein <b>Range<\/b>-Objekt, das genau das f&uuml;nfte Wort des Dokuments markiert. Die anschlie&szlig;ende Zuweisung des Wertes <b>MeineHervorhebung <\/b>an die Eigenschaft <b>Style <\/b>des <b>Range<\/b>-Objekts sorgt f&uuml;r die entsprechende Formatierung.<\/p>\n<p>Wenn Sie nun die Eigenschaften dieser Zeichenformatvorlage &auml;ndern und beispielsweise die fette durch die kursive Schreibweise ersetzen, wirkt sich dies auf alle entsprechend formatierten Bereiche aus.<\/p>\n<p>Wenn <b>objDoc <\/b>einen Verweis auf das aktuelle Dokument enth&auml;lt, k&ouml;nnen Sie eine Zeichenformatvorlage schnell mit wenigen Zeilen &auml;ndern:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> objDoc.Styles(\"MeineHervorhebung\")\r\n     .Font.Bold = <span style=\"color:blue;\">False<\/span>\r\n     .Font.Italic = <span style=\"color:blue;\">True<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p><b>Absatzformat festlegen<\/b><\/p>\n<p>Das gleiche Verfahren funktioniert bei Absatzformatvorlagen. Hier erstellen Sie eine Vorlage allerdings mit dem Wert <b>wdStyleTypeParagraph<\/b>. Au&szlig;erdem gibt es f&uuml;r Absatzformat nat&uuml;rlich einige Eigenschaften mehr &#8211; zum Beispiel zum Festlegen spezieller Absatzeigenschaften wie Einr&uuml;ckungen, Abst&auml;nde zu vorherigen und folgenden Abs&auml;tzen, Nummerierungen et cetera. Schlie&szlig;lich weisen die Zeilen aus Listing 5 dem zweiten von drei Abs&auml;tzen das zuvor erstellte Absatzformat zu. Das Ergebnis sehen Sie in Bild 14.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_013.png\" alt=\"Zuweisen einer Absatzformatierung\" width=\"570\" height=\"289,6978\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Zuweisen einer Absatzformatierung<\/span><\/b><\/p>\n<p><b>Tabellen erstellen<\/b><\/p>\n<p>Wenn Sie Daten von Access nach Word schreiben, kann das Anlegen und F&uuml;llen einer Tabelle sinnvoll sein. Die Prozedur aus Listing 6 zeigt, wie dies gelingt. Die Prozedur durchl&auml;uft ein Recordset auf Basis der Tabelle <b>tblArtikel<\/b>. Vor dem ers-ten Durchlauf erstellt die Prozedur eine Tabelle mit zwei Zeilen und zwei Spalten. Die erste Zeile nimmt die Spalten&uuml;berschriften auf, hier <b>ID <\/b>und <b>Artikelname<\/b>. Die &uuml;berschriften werden fett formatiert.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ExportInTabelle()\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>rng<span style=\"color:blue;\"> As <\/span>Word.Range\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>tbl<span style=\"color:blue;\"> As <\/span>Word.Table\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = <span style=\"color:blue;\">New<\/span> Word.Document\r\n     objDocument.Parent.Visible = <span style=\"color:blue;\">True<\/span>\r\n     AppActivate objDocument.Name\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT ArtikelID, Artikelname FROM tblArtikel\", dbOpenSnapshot)\r\n     <span style=\"color:blue;\">Set<\/span> rng = objDocument.Range\r\n     <span style=\"color:blue;\">Set<\/span> tbl = rng.Tables.Add(rng, 2, 2)\r\n     tbl.Cell(1, 1).Range = \"ID\"\r\n     tbl.Cell(1, 2).Range = \"Artikelname\"\r\n     tbl.Rows(1).Range.Font.Bold = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         tbl.Rows.Add\r\n         tbl.Cell(rst.AbsolutePosition + 2, 1).Range = rst!ArtikelID\r\n         tbl.Cell(rst.AbsolutePosition + 2, 2).Range = rst!Artikelname\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     tbl.Columns(1).AutoFit\r\n     tbl.Columns(2).AutoFit\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: &uuml;bertragen von Tabelleninhalten von Access nach Word<\/span><\/b><\/p>\n<p>Die zweite Zeile bleibt leer. Warum Weil beim nachfolgenden Anlegen neuer Zeilen mit der <b>Add<\/b>-Methode der <b>Rows<\/b>-Auflistung jeweils die Formatierungen der vorhergehenden Zeile &uuml;bernommen werden. Da die Zeilen mit den eigentlichen Daten aber normal und nicht fett dargestellt werden sollen, haben wir eine Pufferzeile ohne Formatierungen dazwischengeschaltet.<\/p>\n<p>Beim Durchlaufen der Schleife f&uuml;gt die Prozedur jeweils eine neue Zeile pro Datensatz hinzu und tr&auml;gt die Werte der Felder <b>ArtikelID <\/b>und <b>Artikelname <\/b>in die mit den entsprechenden Koordinaten versehenen <b>Cell<\/b>-Objekte ein.<\/p>\n<p>Die <b>Autofit<\/b>-Methode sorgt schlie&szlig;lich daf&uuml;r, dass beide Zeilen in der optimalen Spaltenbreite angezeigt werden. Das Ergebnis sieht schlie&szlig;lich wie in Bild 15 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_891_014.png\" alt=\"Frisch erstellte Tabelle\" width=\"347,5\" height=\"332,9976\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Frisch erstellte Tabelle<\/span><\/b><\/p>\n<p><b>Suchen und Ersetzen<\/b><\/p>\n<p>Die Funktionen zum Suchen und Ersetzen von Texten mit bestimmten Inhalten oder Formatierungen in Word sind sehr umfangreich &#8211; so umfangreich, dass man eigentlich einen kompletten Beitrag dar&uuml;ber schreiben k&ouml;nnte. Wir wollen es bei einem interessanten Beispiel belassen, das zeigt, wie Sie den Inhalt eines Word-Dokuments f&uuml;r den Einsatz in einer Anwendung vorbereiten, die Daten im HTML-Format speichert oder anzeigt. Dies ist ja etwa in Memofeldern im Richtext-Format der Fall. Die folgende Prozedur erstellt ein <b>Find<\/b>-Objekt auf Basis des aktuellen Word-Dokuments.<\/p>\n<p>Die Kriterien lauten:  Der Text soll mit einem Zeichenformat namens <b>MeineHervorhebung <\/b>formatiert sein, sonst gibt es keine Vorgaben &#8211; als zu suchenden Text geben wir eine leere Zeichenkette an.<\/p>\n<p>Die Eigenschaft <b>Text<\/b> des <b>Replacement<\/b>-Objekts gibt an, durch welchen Text gefundene Zeichenketten ersetzt werden sollen. Hier soll nicht etwa die Zeichenkette ^&#038; eingef&uuml;gt werden, sondern diese ist ein Ausdruck, der genau dem gefundenen Ausdruck entspricht.<\/p>\n<p>Wenn die Suche also das mit <b>MeineHervorhebung <\/b>ausgezeichnete Wort <b>Beispieltext <\/b>findet, dann liefert ^&#038; genau den gefundenen Text. Der Wert <b>wdReplaceAll <\/b>f&uuml;r den Parameter <b>Replace <\/b>gibt an, dass alle gefundenen Vorkommen ersetzt werden sollen.<\/p>\n<p>Im Beispiel aus Listing 7 werden die hervorgehobenen Textelemente mit den HTML-Tags <b><b> <\/b>und <b><\/b> <\/b>markiert, sodass diese im Browser fett angezeigt werden.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ZeichenformatierungSuchenUndErsetzen()\r\n     ''Variablen deklarieren und Word instanzieren\r\n     <span style=\"color:blue;\">Dim <\/span>objFind<span style=\"color:blue;\"> As <\/span>Word.Find\r\n     <span style=\"color:blue;\">Set<\/span> objFind = objDoc.Parent.Selection.Find\r\n     <span style=\"color:blue;\">With<\/span> objFind\r\n         .Style = \"MeineHervorhebung\"\r\n         .Text = \"\"\r\n         .Replacement.Text = \"&lt;b&gt;^&&lt;\/b&gt;\"\r\n         .Execute Replace:=wdReplaceAll\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Suchen und Ersetzen nach einem bestimmten Zeichenformat<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Programmierung von Word per VBA er&ouml;ffnet fast unbegrenzte M&ouml;glichkeiten. Der vorliegende  Beitrag bietet einen Einstieg und zeigt, wie Sie mit einigen wichtigen Elementen wie den Abs&auml;tzen (<b>Paragraphs<\/b>), Bereichen (<b>Ranges<\/b>) oder Textmarken (<b>Bookmarks<\/b>) umgehen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>WordAutomatisieren.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{5ED8F25B-999C-41D2-B2DD-565A2F43D0BB}\/aiu_891.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Word bietet als Textverarbeitung ganz andere M&ouml;glichkeiten als Access-Berichte, wenn es um die Ausgabe von Texten geht. Nat&uuml;rlich liegen die Schwerpunkte bei Word auch ganz anders &#8211; so ist es grunds&auml;tzlich daf&uuml;r ausgelegt, seine Texte nacheinander zu erfassen und nicht, wie etwa ein Access-Bericht, in einer durch die verschiedenen Berichtsbereiche vorgegebenen Struktur. Wir schauen uns in diesem Beitrag an, wie Sie Texte von Access nach Word bewegen und umgekehrt.<\/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":[662013,66042013,44000026],"tags":[],"class_list":["post-55000891","post","type-post","status-publish","format-standard","hentry","category-662013","category-66042013","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Word automatisieren - 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\/Word_automatisieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Word automatisieren\" \/>\n<meta property=\"og:description\" content=\"Word bietet als Textverarbeitung ganz andere M&ouml;glichkeiten als Access-Berichte, wenn es um die Ausgabe von Texten geht. Nat&uuml;rlich liegen die Schwerpunkte bei Word auch ganz anders - so ist es grunds&auml;tzlich daf&uuml;r ausgelegt, seine Texte nacheinander zu erfassen und nicht, wie etwa ein Access-Bericht, in einer durch die verschiedenen Berichtsbereiche vorgegebenen Struktur. Wir schauen uns in diesem Beitrag an, wie Sie Texte von Access nach Word bewegen und umgekehrt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:29:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b\" \/>\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=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Word automatisieren\",\"datePublished\":\"2020-05-22T21:29:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/\"},\"wordCount\":3788,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5e8fed7a9284df491dc2676aba5ea1b\",\"articleSection\":[\"2013\",\"4\\\/2013\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/\",\"name\":\"Word automatisieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5e8fed7a9284df491dc2676aba5ea1b\",\"datePublished\":\"2020-05-22T21:29:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5e8fed7a9284df491dc2676aba5ea1b\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5e8fed7a9284df491dc2676aba5ea1b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Word_automatisieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Word automatisieren\"}]},{\"@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":"Word automatisieren - 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\/Word_automatisieren\/","og_locale":"de_DE","og_type":"article","og_title":"Word automatisieren","og_description":"Word bietet als Textverarbeitung ganz andere M&ouml;glichkeiten als Access-Berichte, wenn es um die Ausgabe von Texten geht. Nat&uuml;rlich liegen die Schwerpunkte bei Word auch ganz anders - so ist es grunds&auml;tzlich daf&uuml;r ausgelegt, seine Texte nacheinander zu erfassen und nicht, wie etwa ein Access-Bericht, in einer durch die verschiedenen Berichtsbereiche vorgegebenen Struktur. Wir schauen uns in diesem Beitrag an, wie Sie Texte von Access nach Word bewegen und umgekehrt.","og_url":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:29:14+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Word automatisieren","datePublished":"2020-05-22T21:29:14+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/"},"wordCount":3788,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b","articleSection":["2013","4\/2013","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/","url":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/","name":"Word automatisieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b","datePublished":"2020-05-22T21:29:14+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Word_automatisieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5e8fed7a9284df491dc2676aba5ea1b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Word_automatisieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Word automatisieren"}]},{"@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\/55000891","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=55000891"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000891\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}