{"id":55000348,"date":"2023-02-01T00:00:00","date_gmt":"2023-03-02T20:58:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=348"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Word_mit_VBA_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Word_mit_VBA_programmieren\/","title":{"rendered":"Word mit VBA programmieren"},"content":{"rendered":"<p><b>Genau wie in Outlook oder Excel gibt es auch in Word ausreichende M&ouml;glichkeiten, um sich wiederholende Vorg&auml;nge zu automatisieren oder zu vereinfachen. Dazu ben&ouml;tigen wir die Programmiersprache VBA und das Objektmodell zur Programmierung von Word und den darin angezeigten Dokumenten. Im vorliegenden Beitrag schauen wir uns zun&auml;chst einmal an, wie wir von au&szlig;en, also beispielsweise von einer anderen Anwendung aus, eine Word-Instanz initialisieren und diese nutzen k&ouml;nnen. Bei den weiteren Beispielen starten wir jedoch direkt vom VBA-Projekt des aktuell ge&ouml;ffneten Word-Dokuments aus.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>Die meisten der nachfolgend beschriebenen Techniken kannst Du sowohl von einem externen VBA-Projekt, also beispielsweise von Excel, Access oder Outlook oder auch von einer anderen Word-Instanz aus aufrufen.<\/p>\n<p>Wenn Du jedoch eine andere Anwendung als Word nutzt, ben&ouml;tigst Du f&uuml;r den Early Binding-Zugriff, der die Nutzung von IntelliSense erm&ouml;glicht, einen Verweis auf die Bibliothek <b>Microsoft Word 16.0 Object Library<\/b>. Um diesen im jeweiligen VBA-Projekt einzurichten, aktivierst Du den VBA-Editor mit <b>Alt + F11<\/b>, w&auml;hlst den Men&uuml;eintrag <b>Extras|Verweise <\/b>und f&uuml;gst dort den genannten Eintrag hinzu.<\/p>\n<p>Wenn Du im VBA-Projekt eines Word-Dokuments programmierst, musst Du diesen Verweis nicht hinzuf&uuml;gen, da er standardm&auml;&szlig;ig bereits enthalten ist.<\/p>\n<h2>Word-Instanz erstellen<\/h2>\n<p>Word ist wie Excel und im Gegensatz zu Outlook eine Anwendung, von der wir mehrere Instanzen erstellen k&ouml;nnen. Wenn Outlook bereits ge&ouml;ffnet ist und wir versuchen, mit <b>Set objOutlook = New Outlook.Application <\/b>eine neue Instanz von Outlook zu erstellen, erhalten wir lediglich einen Verweis auf die aktuell ge&ouml;ffnete Instanz. Wenn wir hingegen wie folgt eine Word-Objektvariable definieren und dieser mit dem Schl&uuml;sselwort <b>New <\/b>eine neue Instanz zuweisen, erhalten wir tats&auml;chlich eine weitere Instanz von Word.<\/p>\n<p>Diese machen wir schlie&szlig;lich auch noch sichtbar:<\/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\nobjWord.Visible = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Von wo aus f&uuml;hren wir diesen Code nun aus, um eine neue Word-Instanz anzulegen? Dazu k&ouml;nnen wir einfach ein neues Word-Dokument &ouml;ffnen und mit <b>Alt + F11 <\/b>den VBA-Editor &ouml;ffnen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_348_001.png\" alt=\"Der VBA-Editor mit einem Word-Projekt\" width=\"649,627\" height=\"383,6832\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der VBA-Editor mit einem Word-Projekt<\/span><\/b><\/p>\n<p>Hier sehen wir gleich zwei VBA-Projekte:<\/p>\n<ul>\n<li><b>Normal<\/b>: Dies ist das VBA-Projekt der <b>Normal<\/b>-Dokumentvorlage.<\/li>\n<li><b>Projekt (WordProgrammieren)<\/b>: Dies ist das VBA-Projekt des aktuellen Word-Dokuments.<\/li>\n<\/ul>\n<p>Wenn wir VBA-Prozeduren anlegen, m&uuml;ssen wir also zun&auml;chst entscheiden, mit welchem der beiden VBA-Projekte wir arbeiten wollen. Die Entscheidung ist einfach: Soll die Prozedur immer verf&uuml;gbar sein, also wann immer wir ein Dokument auf Basis der Vorlage <b>Normal.dotm <\/b>erstellen, oder soll diese mit dem Dokument gespeichert und auch weitergegeben werden?<\/p>\n<p>Wenn wir die Prozedur im VBA-Projekt der <b>Normal<\/b>-Standardvorlage speichern, ist sie beispielsweise nicht mehr verf&uuml;gbar, wenn wir das Dokument weitergeben. Wenn wir also ein Dokument mit einem Automatismus ausstatten wollen, der beim &Ouml;ffnen des Dokuments ausgel&ouml;st werden und Informationen vom Benutzer abfragen soll, m&uuml;ssen wir diesen im VBA-Projekt des Dokuments speichern.<\/p>\n<h2>Dokument zum Speichern des VBA-Projekts vorbereiten<\/h2>\n<p>Genau wie bei Excel-Dokumenten gibt es auch unter Word ein spezielles Dokumentformat, das die Speicherung von VBA-Code erlaubt. Dieses hat genau wie bei Excel eine entsprechende Dateiendung, in diesem Fall <b>.docm <\/b>statt <b>.docx<\/b>. Es reicht allerdings nicht aus, einfach die Dateiendung anzupassen. Du musst das Dokument im Format <b>Word Dokument mit Makros (*.docm) <\/b>speichern (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_348_002.png\" alt=\"Speichern des Dokuments mit VBA-Projekt\" width=\"700\" height=\"268,8054\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Speichern des Dokuments mit VBA-Projekt<\/span><\/b><\/p>\n<p>Word weist explizit darauf hin, wenn Du bereits ein VBA-Projekt mit Code angelegt hast und das Dokument schlie&szlig;en willst, ohne es als <b>.docm<\/b> zu speichern.<\/p>\n<p>Beachte diesen Hinweis dringend, denn sonst verlierst Du unter Umst&auml;nden den bereits geschriebenen Code beim Schlie&szlig;en des Dokuments.<\/p>\n<h2>Mit einer Word-Instanz arbeiten<\/h2>\n<p>Weiter oben haben wir bereits gezeigt, wie wir eine Word-Instanz erstellen und mit der <b>Visible<\/b>-Eigenschaft sichtbar machen. Das Einblenden dieser Instanz ist nur notwendig, wenn Du dem Benutzer das Ergebnis der durchgef&uuml;hrten Anweisungen pr&auml;sentieren m&ouml;chtest &#8211; alle Schritte, die wir nachfolgend vorstellen, k&ouml;nnen auch ohne die Anzeige von Word durchgef&uuml;hrt werden (mit Ausnahme der Abfrage von Informationen nat&uuml;rlich). <\/p>\n<p>Wichtig ist, dass Du einmal erstellte Instanzen auch wieder schlie&szlig;t &#8211; gerade, wenn Du gleich die Beispiele dieses Artikels ausprobierst. Anderenfalls kann es sein, dass Du nach einer Weile eine Reihe nicht sichtbarer Instanzen laufen hast.<\/p>\n<p>Wenn Du beispielsweise mit der folgenden Prozedur aus einem VBA-Projekt eines Word-Dokuments heraus eine neue Instanz erstellst und die aufrufende Word-Instanz schlie&szlig;t, bleibt die neu aufgerufene Instanz n&auml;mlich erhalten &#8211; auch, wenn diese nicht sichtbar ist. Wir sollten diese also nach dem Durchf&uuml;hren der gew&uuml;nschten Schritte auch wieder schlie&szlig;en:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WordInstanzErzeugen()\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     objWord.Visible = <span style=\"color:blue;\">True<\/span>\r\n     ''... weitere Schritte\r\n     objWord.Quit\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf diese Weise verschwindet die angezeigte Instanz allerdings je nach den weiteren enthaltenen Schritten schnell wieder, sodass diese Vorgehensweise eher f&uuml;r Abl&auml;ufe geeignet ist, deren Ergebnis der Benutzer nicht zu sehen braucht.<\/p>\n<h2>Ein Word-Dokument erstellen<\/h2>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000348\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000348?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000348\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"b3cc5bc9f1\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Genau wie in Outlook oder Excel gibt es auch in Word ausreichende M&ouml;glichkeiten, um sich wiederholende Vorg&auml;nge zu automatisieren oder zu vereinfachen. Dazu ben&ouml;tigen wir die Programmiersprache VBA und das Objektmodell zur Programmierung von Word und den darin angezeigten Dokumenten. Im vorliegenden Beitrag schauen wir uns zun&auml;chst einmal an, wie wir von au&szlig;en, also beispielsweise von einer anderen Anwendung aus, eine Word-Instanz initialisieren und diese nutzen k&ouml;nnen. Bei den weiteren Beispielen starten wir jedoch direkt vom VBA-Projekt des aktuell ge&ouml;ffneten Word-Dokuments aus.<\/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":[66012023,662023,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000348","post","type-post","status-publish","format-standard","hentry","category-66012023","category-662023","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000348"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000348\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000348"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}