{"id":55000303,"date":"2022-04-01T00:00:00","date_gmt":"2023-03-02T17:06:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=303"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"OfficeEreignisse_mit_VBA_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/OfficeEreignisse_mit_VBA_programmieren\/","title":{"rendered":"Office-Ereignisse mit VBA programmieren"},"content":{"rendered":"<p><b>Visual Basic for Applications, kurz VBA, ist eine Ableitung der Programmiersprache Visual Basic. Im Gegensatz zu diesem, das mit Visual Basic 6 vor einigen Jahren seine letzte Version erlebt hat, erfreut sich VBA immer noch reger Beliebtheit. Das liegt vor allem an seinem Hauptzweck: der Programmierung und der Steuerung von automatisierten Abl&auml;ufen in den Office-Anwendungen, zum Beispiel Access, Excel, Outlook, PowerPoint oder Word. Der Kern dieser Automatisierungen sind sogenannte Ereignisse, also Prozeduren, die an einer bestimmten Stelle unter einem vordefinierten Namen hinzugef&uuml;gt und dann durch das jeweilige Ereignis automatisch ausgel&ouml;st werden &#8211; beispielsweise dem &Ouml;ffnen eines Dokuments oder dem Anklicken einer Schaltfl&auml;che. Dieser Artikel zeigt, welche M&ouml;glichkeiten die einzelnen Office-Anwendungen zum Einrichten von Ereignisprozeduren bieten und was bei der Automatisierung grundlegend zu beachten ist.<\/b><\/p>\n<h2>&Ouml;ffnen des VBA-Editors<\/h2>\n<p>Der dazu verwendete VBA-Editor steht zum Beispiel in den oben genannten Anwendungen wie Access, Excel, Outlook, PowerPoint und Word standardm&auml;&szlig;ig zur Verf&uuml;gung und l&auml;sst sich schnell mit der Tastenkombination <b>Alt + F11 <\/b>&ouml;ffnen. Unter Access gibt es sogar noch eine weitere Tastenkombination, um vom Hauptfenster der Anwendung zum VBA-Editor zu gelangen, n&auml;mlich <b>Strg + G<\/b>. Dies aktiviert direkt den Direktbereich des VBA-Editors.<\/p>\n<h2>VBA-Editor f&uuml;r eine Excel-Datei<\/h2>\n<p>Der VBA-Editor sieht f&uuml;r alle Office-Anwendungen &auml;hnlich aus. Bild 1 zeigt den VBA-Editor f&uuml;r eine frisch erstellte Excel-Datei.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_001.png\" alt=\"Der VBA-Editor\" width=\"700\" height=\"422,9007\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der VBA-Editor<\/span><\/b><\/p>\n<p>Der Unterschied bei der Darstellung des VBA-Editors f&uuml;r die verschiedenen Office-Anwendungen liegt im Wesentlichen im Aufbau der VBA-Projekte der jeweiligen Datei im Projekt-Explorer, den wir mit dem Men&uuml;eintrag <b>Ansicht|Projekt-Explorer <\/b>oder der Tastenkombination <b>Strg + R <\/b>&ouml;ffnen.<\/p>\n<p>In der Abbildung sehen wir beispielsweise das VBA-Projekt f&uuml;r eine Excel-Datei. Das Projekt erh&auml;lt unter Excel standardm&auml;&szlig;ig den Namen <b>VBAProject<\/b>, in Klammern sehen wir dahinter den Namen, unter dem wir die Exceldatei gespeichert haben, in diesem Fall <b>Excelbeispiel<\/b>.<\/p>\n<p>Im VBA-Projekt einer neuen, leeren Excel-Datei finden wir zwei Elemente. Bei diesen handelt es sich um Klassenmodule, die wir wie folgt nutzen k&ouml;nnen:<\/p>\n<ul>\n<li><b>DieseArbeitsmappe<\/b>: Dabei handelt es sich um das Klassenmodul f&uuml;r ein Objekt namens <b>Workbook<\/b>, welches das Excel-Dokument selbst repr&auml;sentiert, das wiederum eine oder mehrere Tabellen enth&auml;lt. F&uuml;r das <b>Workbook<\/b>-Objekt k&ouml;nnen wir verschiedene Ereignisse definieren, die zu verschiedenen Zeitpunkten ausgel&ouml;st werden &#8211; zum Beispiel beim &Ouml;ffnen des Excel-Dokuments, beim Aktivieren von Tabellen oder auch vor dem Schlie&szlig;en des Dokuments.<\/li>\n<li><b>Tabelle1 (Tabelle1)<\/b>: Dies ist ein Klassenmodul f&uuml;r die standardm&auml;&szlig;ig angelegte Tabelle namens <b>Tabelle1<\/b>. Dieses bietet ebenfalls verschiedene M&ouml;glichkeiten zum Definieren von Ereignisprozeduren an. Diese werden beispielsweise beim &Auml;ndern der Auswahl in der Excel-Tabelle ausgel&ouml;st oder beim Aktivieren der aktuellen Tabelle.<\/li>\n<\/ul>\n<p>Standardm&auml;&szlig;ig zeigt Excel das Element <b>DieseArbeitsmappe <\/b>beim &Ouml;ffnen des VBA-Editors f&uuml;r eine neue Excel-Datei an.<\/p>\n<h2>Ereignis beim &Ouml;ffnen eines Excel-Workbooks<\/h2>\n<p>Wir wollen uns an einem Beispiel ansehen, wie ein Ereignis eines Excel-Workbooks funktioniert. Dazu klicken wir doppelt auf den Eintrag <b>DieseArbeitsmappe <\/b>des Projekts des aktuell ge&ouml;ffneten Excel-Workbooks und &ouml;ffnen so das Klassenmodul <b>DieseArbeitsmappe<\/b>.<\/p>\n<p>Hier w&auml;hlen wir nun mit dem linken Kombinationsfeld im Codefenster den Eintrag <b>Workbook <\/b>aus, was automatisch im rechten Kombinationsfeld das standardm&auml;&szlig;ig festgelegte Ereignis f&uuml;r diese Klasse selektiert und die Ereignisprozedur <b>Workbook_Open <\/b>zum Codefenster hinzuf&uuml;gt. Diese erg&auml;nzen wir um die folgende Anweisung:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Workbook_Open()\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Workbook_Open\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im VBA-Editor sieht das nun wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_009.png\" alt=\"Ereignisprozedur f&uuml;r ein Excel-Workbook\" width=\"424,6267\" height=\"213,8556\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ereignisprozedur f&uuml;r ein Excel-Workbook<\/span><\/b><\/p>\n<p>Damit wir dieses Ereignis ausl&ouml;sen k&ouml;nnen, m&uuml;ssen wir das Workbook schlie&szlig;en und erneut &ouml;ffnen. Beim Schlie&szlig;en erscheint allerdings direkt eine Meldung, die besagt, dass wir das VBA-Projekt nicht mit der Arbeitsmappe speichern k&ouml;nnen (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_010.png\" alt=\"Meldung beim Versuch, ein Excel-Dokument mit VBA-Code zu speichern\" width=\"700\" height=\"141,9695\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Meldung beim Versuch, ein Excel-Dokument mit VBA-Code zu speichern<\/span><\/b><\/p>\n<p>Das liegt allerdings nur an dem aktuellen Format, das durch die Dateiendung <b>.xlsx <\/b>repr&auml;sentiert wird. Also klicken wir, wie in der Meldung vorgeschlagen, auf die Schaltfl&auml;che <b>Nein <\/b>und w&auml;hlen im anschlie&szlig;end erscheinenden <b>Speichern unter<\/b>-Dialog den Datentyp <b>Excel-Arbeitsmappe mit Makros (*.xlsm)<\/b> aus (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_008.png\" alt=\"Auswahl eines Dateityps, der das Speichern des VBA-Projekts erlaubt\" width=\"624,6265\" height=\"398,5007\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Auswahl eines Dateityps, der das Speichern des VBA-Projekts erlaubt<\/span><\/b><\/p>\n<p>Schlie&szlig;en wir die Datei nun und &ouml;ffnen diese anschlie&szlig;end erneut, zeigt Excel eine Sicherheitswarnung an (siehe Bild 5). Hier klicken wir auf Inhalt aktivieren, damit der VBA-Code im enthaltenen VBA-Projekt ausgef&uuml;hrt werden kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_011.png\" alt=\"Sicherheitswarnung beim &Ouml;ffnen eines Excel-Workbooks mit VBA-Projekt\" width=\"424,6267\" height=\"241,6384\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Sicherheitswarnung beim &Ouml;ffnen eines Excel-Workbooks mit VBA-Projekt<\/span><\/b><\/p>\n<p>Danach erscheint dann die von uns weiter oben programmierte Meldungsbox mit dem Namen der ausl&ouml;senden Ereignisprozedur (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_012.png\" alt=\"Meldung durch eine VBA-Prozedur beim &Ouml;ffnen eines Excel-Workbooks\" width=\"349,6267\" height=\"217,5455\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Meldung durch eine VBA-Prozedur beim &Ouml;ffnen eines Excel-Workbooks<\/span><\/b><\/p>\n<h2>Achtung, Code-Verlust!<\/h2>\n<p>Wichtig ist, dass wir die Datei &#8211; genau wie bei Word oder PowerPoint &#8211; nicht in einem Dateiformat ohne Makros speichern, also wie gehabt als <b>.xlsx<\/b>, <b>.docx <\/b>oder <b>.pptx<\/b>, und das Dokument dann schlie&szlig;en. Wenn wir bereits Code zum VBA-Projekt des Dokuments hinzugef&uuml;gt haben und das Dokument dann nicht als <b>.xlsm<\/b>, <b>.docm <\/b>oder <b>.pptm <\/b>speichern, wird das VBA-Projekt einfach verworfen.<\/p>\n<h2>Direkt zugreifbare Klassen<\/h2>\n<p>Wenn Du schon einmal mit Klassen programmiert hast, wei&szlig;t Du, dass diese &uuml;blicherweise deklariert und instanziert werden m&uuml;ssen.<\/p>\n<p>Das ist bei der Klasse <b>Workbook<\/b>-Klasse und auch bei der anschlie&szlig;end vorgestellten <b>Work-sheet<\/b>-Klasse nicht n&ouml;tig &#8211; diese sind bereits impli-zit initialisiert und Du kannst sie direkt nutzen.<\/p>\n<h2>Ereignis f&uuml;r die Workbook-Klasse<\/h2>\n<p>Auf die gleiche Weise k&ouml;nnen wir die &uuml;brigen Ereignisprozeduren der <b>Workbook<\/b>-Klasse implementieren sowie die Ereignisse der einzelnen Worksheets beziehungsweise Tabellen.<\/p>\n<p>Das Standardereignis der <b>Worksheet<\/b>-Klasse lautet &uuml;brigens <b>SelectionChange<\/b>. Auch dieses wollen wir noch ausprobieren. Die daf&uuml;r angelegte Ereignisprozedur liefert mit einem Parameter namens <b>Target <\/b>ein Objekt des Typs <b>Range<\/b>, mit dem wir den markierten Bereich ermitteln k&ouml;nnen.<\/p>\n<p>Das <b>Range<\/b>-Objekt liefert mit der Eigenschaft <b>Address <\/b>die Angabe der Adresse des markierten Bereichs.<\/p>\n<p>Diesen wollen wir uns nach jeder Auswahl im Worksheet <b>Tabelle 1<\/b> in einem Meldungsfenster ausgeben lassen und hinterlegen zu diesem Zweck die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Worksheet_SelectionChange(ByVal Target _\r\n        <span style=\"color:blue;\"> As <\/span>Range)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Aktuell markierter Bereich: \" & Target.Address\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit erhalten wir nach jeder neuen Auswahl im Tabellenblatt eine Meldung wie die aus Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_303_013.png\" alt=\"Meldung mit der Ausgabe des aktuell markierten Bereichs\" width=\"424,6267\" height=\"322,0599\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Meldung mit der Ausgabe des aktuell markierten Bereichs<\/span><\/b><\/p>\n<p>Nat&uuml;rlich k&ouml;nnen wir im VBA-Projekt eines Excel-Workbooks noch viel mehr Dinge erledigen als nur Ereignisse implementieren &#8211; dazu in sp&auml;teren Artikeln mehr.<\/p>\n<h2>Word-Dokumente<\/h2>\n<p>Wenn wir ein neues Word-Dokument anlegen und den VBA-Editor von Word &ouml;ffnen, sehen wir gleich zwei Projekte:<\/p>\n<ul>\n<li><b>Normal<\/b>: VBA-Projekt der Standardvorlage von Word<\/li>\n<li><b>Project (Dateiname)<\/b>: VBA-Projekt der aktuell ge&ouml;ffneten Word-Datei<\/li>\n<\/ul>\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\/55000303\/\">\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\/55000303?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\/55000303\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"2ce33e69ce\"\/>\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>Visual Basic for Applications, kurz VBA, ist eine Ableitung der Programmiersprache Visual Basic. Im Gegensatz zu diesem, das mit Visual Basic 6 vor einigen Jahren seine letzte Version erlebt hat, erfreut sich VBA immer noch reger Beliebtheit. Das liegt vor allem an seinem Hauptzweck: der Programmierung und der Steuerung von automatisierten Abl&auml;ufen in den Office-Anwendungen, zum Beispiel Access, Excel, Outlook, PowerPoint oder Word. Der Kern dieser Automatisierungen sind sogenannte Ereignisse, also Prozeduren, die an einer bestimmten Stelle unter einem vordefinierten Namen hinzugef&uuml;gt und dann durch das jeweilige Ereignis automatisch ausgel&ouml;st werden &#8211; beispielsweise dem &Ouml;ffnen eines Dokuments oder dem Anklicken einer Schaltfl&auml;che. Dieser Artikel zeigt, welche M&ouml;glichkeiten die einzelnen Office-Anwendungen zum Einrichten von Ereignisprozeduren bieten und was bei der Automatisierung grundlegend zu beachten ist.<\/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":[66022022,662022,44000027,44000025,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000303","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-Excel_programmieren","category-VBAProgrammierung","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000303","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=55000303"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000303\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000303"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}