{"id":55000349,"date":"2023-02-01T00:00:00","date_gmt":"2023-03-02T20:58:48","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=349"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBAEreignisse_in_Word_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/VBAEreignisse_in_Word_programmieren\/","title":{"rendered":"VBA-Ereignisse in Word programmieren"},"content":{"rendered":"<p><b>Microsoft Word bietet f&uuml;r das Application- und f&uuml;r das Document-Objekt einige sehr interessante Ereignisse an. Diese k&ouml;nnen wir implementieren und damit auf verschiedene Benutzeraktionen wie das &Ouml;ffnen, Speichern oder Schlie&szlig;en eines Dokuments oder auch auf andere Aktionen zu reagieren. In diesem Artikel stellen wir die Ereignisse vor und zeigen, wie Du diese implementieren und mit eigenem Code f&uuml;llen kannst. Damit lernst Du, wie Du auf das &Ouml;ffnen, Schlie&szlig;en oder Anlegen von Dokumenten reagieren kannst oder wie sich Ereignisse programmieren lassen, die beim Drucken oder Speichern ausgel&ouml;st werden. Auch Aktionen wie ein Doppelklick oder ein Rechtsklick auf die Inhalte des Word-Dokuments lassen sich damit steuern. Wie das gelingt, zeigen wir in diesem Artikel.<\/b><\/p>\n<h2>Voraussetzung: Das WithEvents-Schl&uuml;sselwort<\/h2>\n<p>Wenn wir Ereignisprozeduren f&uuml;r die Ereignisse einer Word-Instanz implementieren wollen, ben&ouml;tigen wir vor allem eines: Die Deklaration einer Objektvariablen f&uuml;r die Word-Instanz, und zwar mit dem Schl&uuml;sselwort <b>WithEvents <\/b>versehen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objWord<span style=\"color:blue;\"> As <\/span>Word.Application<\/pre>\n<p>Diese Anweisung k&ouml;nnen wir nur in einem Klassenmodul platzieren, nicht jedoch in einem Standardmodul.<\/p>\n<p>Das Modul <b>ThisDocument <\/b>des VBA-Projekts eines Word-Dokuments beispielsweise ist jedoch ein Klassenmodul, in dem wir diese Anweisung unterbringen k&ouml;nnen.<\/p>\n<p>Die &Auml;nderung durch das <b>WithEvents<\/b>-Schl&uuml;sselwort ist nicht direkt sichtbar. Wenn wir allerdings auf das linke Auswahlfeld oben im Code-Fenster klicken, sehen wir nun die auf diese Weise deklarierte Variable <b>objWord<\/b>. Die Auswahl dieses Eintrags legt automatisch eine Prozedur f&uuml;r das Standard-Ereignis dieses Objekts an, in diesem Fall <b>objWord_Quit<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objWord_Quit()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach k&ouml;nnen wir aus dem rechten Auswahlfeld die &uuml;brigen Ereignisse ausw&auml;hlen und so automatisch die entsprechenden Ereignisprozeduren anlegen lassen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_349_001.png\" alt=\"Auswahl der Ereignisse des Application-Objekts\" width=\"549,6265\" height=\"492,7011\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Auswahl der Ereignisse des Application-Objekts<\/span><\/b><\/p>\n<p>Das ist praktisch, da wir uns so nicht zu merken brauchen, wie die einzelnen Ereignisprozeduren hei&szlig;en m&uuml;ssen &#8211; was vor allem dann hilfreich ist, wenn diese auch noch die Angabe von Parametern erfordern.<\/p>\n<p>Auf diese Weise legen wir gleich noch Ereignisprozeduren f&uuml;r die Ereignisse <b>Document_BeforeClose<\/b>, <b>Document_BeforePrint<\/b>, <b>Document_BeforeSave<\/b>, <b>Document_Change<\/b>, <b>DocumentOpen<\/b>, <b>NewDocument <\/b>und <b>WindowSelectionChange <\/b>an.<\/p>\n<p>F&uuml;r diese Ereignisprozeduren legen wir jeweils einen Haltepunkt an, um zu pr&uuml;fen, ob und wann diese ausgel&ouml;st werden (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_349_002.png\" alt=\"Einige Ereignisprozeduren mit Haltepunkten\" width=\"549,6265\" height=\"587,5915\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einige Ereignisprozeduren mit Haltepunkten<\/span><\/b><\/p>\n<p>Eines k&ouml;nnen wir jetzt schon sagen: Bevor wir <b>objWord <\/b>nicht auf die aktuelle Word-Instanz eingestellt haben, wird keines der Ereignisse ausgel&ouml;st. Also f&uuml;gen wir die folgende Prozedur hinzu und rufen sie mit <b>F5 <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Initialize()\r\n     <span style=\"color:blue;\">Set<\/span> objWord = Application\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach k&ouml;nnen wir beispielsweise das aktuelle Dokument speichern und l&ouml;sen damit die Prozedur <b>objWord_BeforeSave <\/b>aus. Damit k&ouml;nnen wir bereits kleinere Aufgaben erledigen &#8211; welche das sind, schauen wir uns in den folgenden Abschnitten an.<\/p>\n<h2>Vor dem Schlie&szlig;en eines Dokuments<\/h2>\n<p>Die Ereignisprozedur, die vor dem Schlie&szlig;en eines Dokuments ausgel&ouml;st wird, sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objWord_DocumentBeforeClose( _\r\n         ByVal Doc<span style=\"color:blue;\"> As <\/span>Document, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die beiden Parameter k&ouml;nnen wir so nutzen:<\/p>\n<ul>\n<li><b>Doc <\/b>liefert einen Verweis auf das zu schlie&szlig;ende Word-Dokument.<\/li>\n<li><b>Cancel <\/b>ist ein R&uuml;ckgabeparameter, mit dem wir abfragen k&ouml;nnen, ob das Dokument wirklich geschlossen werden soll.<\/li>\n<\/ul>\n<p>Listing 1 zeigt ein Beispiel f&uuml;r den Einsatz dieser Prozedur. In diesem Fall fragt die Prozedur den Benutzer, ob das Dokument tats&auml;chlich geschlossen werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objWord_DocumentBeforeClose(ByVal Doc<span style=\"color:blue;\"> As <\/span>Document, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     If <span style=\"color:blue;\">MsgBox<\/span>(\"Soll das Dokument wirklich geschlossen werden?\", vbYesNo + vbExclamation, _\r\n             \"Dokument wird geschlossen\") = vbNo Then\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur, die vor dem Schlie&szlig;en eines Dokuments ausgel&ouml;st wird<\/span><\/b><\/p>\n<h2>Beim Speichern eines Dokuments<\/h2>\n<p>Die Ereignisprozedur, die durch das Ereignis <b>BeforeSave <\/b>ausgel&ouml;st wird, ist identisch aufgebaut. Auch hier k&ouml;nnte man verschiedene Abfragen einbauen &#8211; beispielsweise, ob man den vorherigen Stand als Sicherungskopie speichern soll.<\/p>\n<p>Dazu nutzen wir die Implementierung aus Listing 2. Hier fragen wir den Benutzer, ob er den vorherigen Stand sichern m&ouml;chte &#8211; also den Stand, den die auf der Festplatte gespeicherte Word-Datei aktuell aufweist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objWord_DocumentBeforeSave(ByVal Doc<span style=\"color:blue;\"> As <\/span>Document, SaveAsUI<span style=\"color:blue;\"> As Boolean<\/span>, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     If <span style=\"color:blue;\">MsgBox<\/span>(\"Vorherigen Stand vor dem Speichern sichern?\", vbYesNo + vbExclamation, \"Dokument wird geschlossen\") = _\r\n             vbYes Then\r\n         <span style=\"color:blue;\">Set<\/span> FSO = CreateObject(\"Scripting.FileSystemObject\")\r\n         FSO.CopyFile Doc.FullName, Doc.FullName & \".bak\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000349\/\">\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\/55000349?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\/55000349\/\"\/>\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>Microsoft Word bietet f&uuml;r das Application- und f&uuml;r das Document-Objekt einige sehr interessante Ereignisse an. Diese k&ouml;nnen wir implementieren und damit auf verschiedene Benutzeraktionen wie das &Ouml;ffnen, Speichern oder Schlie&szlig;en eines Dokuments oder auch auf andere Aktionen zu reagieren. In diesem Artikel stellen wir die Ereignisse vor und zeigen, wie Du diese implementieren und mit eigenem Code f&uuml;llen kannst. Damit lernst Du, wie Du auf das &Ouml;ffnen, Schlie&szlig;en oder Anlegen von Dokumenten reagieren kannst oder wie sich Ereignisse programmieren lassen, die beim Drucken oder Speichern ausgel&ouml;st werden. Auch Aktionen wie ein Doppelklick oder ein Rechtsklick auf die Inhalte des Word-Dokuments lassen sich damit steuern. Wie das gelingt, zeigen wir in diesem Artikel.<\/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-55000349","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\/55000349","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=55000349"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000349\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000349"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}