{"id":55000425,"date":"2024-04-01T00:00:00","date_gmt":"2024-04-23T12:50:12","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=425"},"modified":"2024-04-23T11:13:31","modified_gmt":"2024-04-23T11:13:31","slug":"ereignisse_in_klassen_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/ereignisse_in_klassen_programmieren\/","title":{"rendered":"Ereignisse in Klassen programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/dc3a2f2bd5134eaea02e2db98f84d0c6\" width=\"1\" height=\"1\" alt=\"\"><b>Eines der wichtigsten Features vieler eingebauter Klassen in den Office-Anwendungen sind die Ereignisse. Damit k&ouml;nnen wir Ereignisprozeduren implementieren, mit denen wir beispielsweise auf das Anklicken von Schaltfl&auml;chen, dem &Ouml;ffnen oder Schlie&szlig;en von Dokumenten oder dem Wechseln eines Tabellenblatts in einem Excel-Arbeitsblatt reagieren k&ouml;nnen. Wenn man selbst Klassen programmiert, findet sich fr&uuml;her oder sp&auml;ter ein Anlass, dieser ein eigenes Ereignis hinzuzuf&uuml;gen, dass durch eine bestimmte Aktion ausgel&ouml;st wird. Dieser Artikel zeigt, wir wie solche Ereignisse programmieren und ausl&ouml;sen und wie wir diese in Form von Ereignisprozeduren in den Klassen implementieren, welche das entsprechende Objekt instanziiert haben.<\/b><\/p>\n<h2>Ereignisse in Klassenmodulen<\/h2>\n<p>Wer schon einmal eine Ereignisprozedur beispielsweise f&uuml;r das Anklicken einer Schaltfl&auml;che, das &Ouml;ffnen eines Word-Dokuments, das Markieren eines Ranges in Excel et cetera programmiert hat, kennt zumindest schon einmal die Verbraucherseite von Ereignissen.<\/p>\n<p>Hier k&ouml;nnen wir zum Beispiel in Excel in der Klasse <b>Tabelle1 <\/b>eines Excel-Dokuments im Codefenster im linken Kombinationsfeld den Eintrag <b>Worksheet <\/b>ausw&auml;hlen, was im rechten Kombinationsfeld automatisch die Standardmethode <b>SelectionChange <\/b>selektiert. Dadurch wird automatisch die Ereignisprozedur <b>Worksheet_SelectionChange <\/b>angelegt, mit der wir in diesem Fall die Adresse des neu ausgew&auml;hlten Bereichs im Direktbereich des VBA-Editors ausgeben (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_001.png\" alt=\"Ereignisprozedur beim &Auml;ndern der Markierung in einem Excel-Arbeitsblatt\" width=\"599.6265\" height=\"193.9417\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ereignisprozedur beim &Auml;ndern der Markierung in einem Excel-Arbeitsblatt<\/span><\/b><\/p>\n<p>Nun schauen wir uns die andere Seite an, auf der wir Ereignisse definieren, die wir dann wiederum als Verbraucher nutzen k&ouml;nnen. Wozu aber &uuml;berhaupt Ereignisse? Weil wir benutzerdefiniert auf bestimmte Ereignisse reagieren k&ouml;nnen wollen. Stellen wir uns beispielsweise vor, wir wollen den Benutzer unserer Klasse <b>clsAdresse <\/b>dar&uuml;ber informieren, wenn die Methode <b>Leeren <\/b>erfolgreich aufgerufen wurde. Dann k&ouml;nnen wir das einfach erledigen, indem wir der Methode <b>Leeren<\/b> eine entsprechende Meldung hinzuf&uuml;gen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Leeren()\n     ...\n     m_Land = \"\"\n     <span style=\"color:blue;\">MsgBox<\/span> \"Die Eigenschaften der Adresse wurden geleert.\", _\n         vbOKOnly + vbExclamation, \"Adresse geleert\"\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Rufen wir die Methode nun von einer anderen Prozedur aus auf, erscheint diese Meldung (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_013.png\" alt=\"Meldung beim Aufruf einer Methode\" width=\"649.627\" height=\"300.7363\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Meldung beim Aufruf einer Methode<\/span><\/b><\/p>\n<p>Nun stellen wir uns vor, wir wollen die Meldung dieser Klasse nicht innerhalb der Klasse verdrahten, sondern dem Entwickler, der diese Klasse in seinem Code verwendet (meist wir selbst), die M&ouml;glichkeiten geben wollen, individuell auf dieses Ereignis zu reagieren.<\/p>\n<p>Das ist ein Beispieleinsatzzweck f&uuml;r die Bereitstellung eines Ereignisses. Und das gelingt in zwei Schritten:<\/p>\n<ul>\n<li>Als Erstes definieren wir das Ereignis mit dem Schl&uuml;sselwort <b>Event<\/b>, dem Namen des Ereignisses und gegebenenfalls den zu verwendenden Parametern.<\/li>\n<li>Als zweites f&uuml;gen wir in diesem Beispiel der Methode Leeren Code hinzu, der dieses Ereignis ausl&ouml;st. Dabei verwenden wir das Schl&uuml;sselwort <b>RaiseEvent <\/b>und &uuml;bergeben die Werte f&uuml;r die Parameter, welche das Verbraucher des Ereignisses erhalten soll.<\/li>\n<\/ul>\n<p>In der Klasse f&uuml;gen wir oben die Deklaration des Ereignisses ein:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event NachDemLeeren()<\/pre>\n<p>Der Prozedur <b>Leeren <\/b>f&uuml;gen wir am Ende den Befehl <b>RaiseEvent <\/b>hinzu und geben den Namen des Ereignisses als Parameter an:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Leeren()\n     ...\n     RaiseEvent NachDemLeeren\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dieses wird, wie in Bild 3 dargestellt, per IntelliSense angeboten. Dadurch geschieht nun erst einmal nichts.  Wir k&ouml;nnen die obige Prozedur <b>AdressblockLeeren <\/b>starten und die Methode <b>Leeren <\/b>aufrufen, aber wir erhalten keinen sichtbaren Effekt. Das ist logisch, denn wir haben das Ereignis noch nicht implementiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_014.png\" alt=\"Deklarieren und Ausl&ouml;sen eines Ereignisses\" width=\"424.6267\" height=\"259.9277\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Deklarieren und Ausl&ouml;sen eines Ereignisses<\/span><\/b><\/p>\n<h2>Keine Ereignisprozeduren ohne das Schl&uuml;sselwort WithEvents<\/h2>\n<p>Der Schritt ist auch in dieser Konstellation nicht m&ouml;glich, denn um die Ereignisse einer Klasse zu implementieren, m&uuml;ssen die Klasse, die das Ereignis enth&auml;lt, mit einem bestimmten Schl&uuml;sselwort deklarieren. Dieses hei&szlig;t <b>WithEvents<\/b>. Es gibt noch weitere Bedingungen: Diese Deklaration kann nicht innerhalb einer Prozedur erfolgen, sondern muss im Kopf des Moduls hinterlegt werden. Au&szlig;erdem k&ouml;nnen wir das Schl&uuml;sselwort <b>WithEvents <\/b>nicht innerhalb von Standardmodulen verwenden, sondern nur in Klassenmodulen. Versuchen wir dies dennoch, erhalten wir direkt einen Kompilierfehler wie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_015.png\" alt=\"Fehler beim Versuch, WithEvents in einem Standardmodul zu verwenden\" width=\"549.6265\" height=\"212.2578\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim Versuch, WithEvents in einem Standardmodul zu verwenden<\/span><\/b><\/p>\n<p>Warum aber ben&ouml;tigen wir dieses Schl&uuml;sselwort &uuml;berhaupt? Wenn wir in Word auf die Ereignisse des <b>Document<\/b>-Objekts zugreifen oder in Access auf ein <b>Form<\/b>&#8211; oder <b>Button<\/b>-Element, k&ouml;nnen wir das auch einfach ohne <b>WithEvents<\/b>-Schl&uuml;sselwort erledigen.<\/p>\n<p>Das ist dann allerdings reiner Zufall: Bei Word waren wir dann vermutlich im Klassenmodul zum Word-Dokument und in Access im Klassenmodul des Formulars, in dem sich auch die Schaltfl&auml;che befand, deren Ereignisse wir implementiert haben. Da es sich um das Klassenmodul des Objekts selbst handelt, stehen dort alle Ereignisse standardm&auml;&szlig;ig zur Verf&uuml;gung.<\/p>\n<p>W&uuml;rden wir jedoch die Ereignisse dieses Word-Dokuments oder Access-Formulars von einem anderen Klassenmodul aus implementieren wollen, m&uuml;ssten wir dazu auch erst einmal eine Objektvariable anlegen, die wir mit dem Schl&uuml;sselwort <b>WithEvents<\/b> deklarieren. Und wir m&uuml;ssten diese auch noch mit einem Verweis auf das entsprechende Objekt versehen.<\/p>\n<p>Genauso ist es bei der Klasse <b>clsAdresse<\/b>: Diese verwenden wir von einer anderen Klasse aus, also m&uuml;ssen wir die Objektvariable mit dem Schl&uuml;sselwort <b>WithEvents <\/b>versehen &#8211; und das gelingt wiederum nur in Klassenmodulen. Welche Art von Klassenmodul wir hier verwenden, spielt allerdings keine Rolle. Wir k&ouml;nnen die Klasse sowohl innerhalb des Klassenmoduls eines eingebauten Elements wie einem Word-Dokument, einem Excel-Workbook oder einem Access-Formular deklarieren, aber auch in einem anderen alleinstehenden Klassenmodul.<\/p>\n<p>Damit Du die Beispiele dieses Artikels in allen Office-Anwendungen ausprobieren kannst, erstellen wir zu diesem Zweck ein neues Klassenmodul namens <b>clsAdressenVerwalten<\/b>.<\/p>\n<p>Diese f&uuml;gen wir die Deklaration der Objektvariablen ein, der wie die Instanz der Klasse <b>clsAdresse <\/b>zuweisen wollen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objAdresse<span style=\"color:blue;\"> As <\/span>clsAdresse<\/pre>\n<p>Au&szlig;erdem f&uuml;gen wir eine Methode hinzu, die das Objekt erstellt und seine Eigenschaften f&uuml;llt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AdresseErstellen()\n     <span style=\"color:blue;\">Set<\/span> objAdresse = <span style=\"color:blue;\">New<\/span> clsAdresse\n     <span style=\"color:blue;\">With<\/span> objAdresse\n         .Anrede = \"Herr\"\n         .Vorname = \"Andr&eacute;\"\n         .Nachname = \"Minhorst\"\n         .Strasse = \"Borkhofer Str. 17\"\n         .PLZ = \"47137\"\n         .Ort = \"Duisburg\"\n         .Land = \"Deutschland\"\n     End <span style=\"color:blue;\">With<\/span>\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich f&uuml;gen wir den Aufruf der Methode <b>Leeren <\/b>der Adresse hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AdresseLeeren()\n     objAdresse.Leeren\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Um die Klasse <b>clsAdressenVerwalten <\/b>wiederum zu instanziieren, legen wir in einem Standardmodul die Deklaration der Objektvariablen zu dieser Klasse an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objAdressenVerwalten<span style=\"color:blue;\"> As <\/span>clsAdressenVerwalten<\/pre>\n<p>Diese instanziieren wir. Au&szlig;erdem rufen wir nacheinander die Methoden <b>AdresseErstellen <\/b>und <b>AdresseLeeren <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AdressenSteuern()\n     <span style=\"color:blue;\">Set<\/span> objAdressenVerwalten = <span style=\"color:blue;\">New<\/span> clsAdressenVerwalten\n     objAdressenVerwalten.AdresseErstellen\n     objAdressenVerwalten.AdresseLeeren\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit geschieht nun allerdings nichts Sichtbares. Was wir erreichen wollten, ist die Implementierung des Ereignisses <b>NachDemLeeren <\/b>der Klasse <b>clsAdresse<\/b>. Dazu zeigen wir nun das Codefenster zur Klasse <b>clsAdressenVerwalten <\/b>an. Da wir hier die Objektvariable <b>objAdresse <\/b>mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert haben, k&ouml;nnen wir nun Ereignisprozeduren auf Basis der f&uuml;r diese Klasse definieren Ereignisse implementieren.<\/p>\n<p>Das gelingt wie folgt:<\/p>\n<ul>\n<li>Wir w&auml;hlen im linken Kombinationsfeld des Klassenmoduls <b>clsAdressenVerwalten <\/b>den Eintrag <b>objAdresse <\/b>aus.<\/li>\n<li>Im rechten Kombinationsfeld wird nun automatisch das einzige verf&uuml;gbare Ereignis ausgew&auml;hlt.<\/li>\n<li>Dies legt wiederum eine neue Ereignisprozedur auf Basis der in der Klasse <b>clsAdresse <\/b>angegebenen Deklaration an.<\/li>\n<\/ul>\n<p>Diesen Ablauf k&ouml;nnen wir uns in Bild 5 ansehen. Wir finden nun eine Ereignisprozedur vor, die wir mit einer Anweisung f&uuml;llen k&ouml;nnen &#8211; beispielsweise der Anzeige einer Meldung:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_016.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r ein benutzerdefiniertes Ereignis\" width=\"649.627\" height=\"418.4037\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Anlegen einer Ereignisprozedur f&uuml;r ein benutzerdefiniertes Ereignis<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAdresse_NachDemLeeren()\n     <span style=\"color:blue;\">MsgBox<\/span> \"Adresse geleert\"\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit steht es nun offen, das Ereignis <b>NachDemLeeren <\/b>von der aufrufenden Instanz aus mit den gew&uuml;nschten Anweisungen zu f&uuml;llen.<\/p>\n<h2>Vorteil von Ereignisprozeduren bei benutzerdefinieren Ereignissen<\/h2>\n<p>Der gro&szlig;e Vorteil dieser Vorgehensweise ist der Gleiche wie bei den Ereignissen eingebauter Elemente der jeweiligen Office-Anwendung. Wir k&ouml;nnen je nach Anwendungszweck individuell festlegen, was beim Ausl&ouml;sen eines der Ereignisse geschehen soll. Damit machen wir unsere Klasse viel flexibler, als wenn wir diesen Code direkt in der Klasse einf&uuml;gen. Wir k&ouml;nnen die Ereignisse der Klasse nun mit verschiedenen Anweisungen versehen, die je nach Anwendungsfall ausgef&uuml;hrt werden sollen.<\/p>\n<h2>Ereignisse mit Parametern<\/h2>\n<p>Als N&auml;chstes wollen wir ein Ereignis mit verschiedenen Parametern hinzuf&uuml;gen. Dazu bietet sich der Zeitpunkt an, an dem wir schon die Methode zum Leeren der Adresse in der Klasse <b>clsAdresse <\/b>aufgerufen haben, aber das Leeren noch nicht stattgefunden hat.<\/p>\n<p>Wir wollen mit diesem Ereignis erstens einige der Werte der zu leerenden Adresse bereitstellen (wir k&ouml;nnten das auch mit allen Werten tun, aber wir wollen die &Uuml;bersichtlichkeit bewahren). Zweitens wollen wir einen Parameter nutzen, um das Leeren gegebenenfalls abzubrechen. Dabei handelt es sich um einen sogenannten R&uuml;ckgabeparameter.<\/p>\n<p>Die Deklaration des Ereignisses sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event VorDemLeeren(strAnrede<span style=\"color:blue;\"> As String<\/span>, _\n     strVorname<span style=\"color:blue;\"> As String<\/span>, strNachname<span style=\"color:blue;\"> As String<\/span>, _\n     bolCancel<span style=\"color:blue;\"> As Boolean<\/span>)<\/pre>\n<p>Der &Uuml;bersichtlichkeit halber f&uuml;gen wir alle Deklarationen von Ereignissen hinter der Deklaration ein und vor den &uuml;brigen Elementen wie Methoden oder Funktionen.<\/p>\n<h2>Aufruf des Ereignisses mit Parametern integrieren<\/h2>\n<p>Wo integrieren wir den Aufruf dieses Ereignisses nun? Auch wenn dieses <b>VorDemLeeren <\/b>hei&szlig;t, geh&ouml;rt es in die Methode <b>Leeren<\/b>. Dort f&uuml;gen wir den Aufruf gleich zu Beginn ein, also bevor das eigentliche Leeren der Eigenschaften der Klasse beginnt. Mit den ersten drei Parametern wollen wir die aktuellen Werte f&uuml;r die Anrede, den Vornamen und den Nachnamen an die Implementierung des Ereignisses in der instanziierenden Klasse &uuml;bergeben. Der vierte Parameter &uuml;bergibt die Variable <b>bolCancel<\/b>, die wir zuvor deklarieren. Dieser <b>Boolean<\/b>-Parameter enth&auml;lt standardm&auml;&szlig;ig den Wert <b>False<\/b>.<\/p>\n<p>Wenn der Benutzer diesen Parameter in der Implementierung des Ereignisses nicht auf <b>True <\/b>einstellt, beh&auml;lt dieser den Wert <b>False<\/b>. Das ist wichtig zu wissen, denn wir untersuchen diesen Wert direkt im Anschluss an das Ausl&ouml;sen des Ereignisses <b>VorDemLeeren <\/b>mit <b>RaiseEvent<\/b>. Wenn <b>bolCancel <\/b>dann den Wert <b>True <\/b>aufweist, soll das Leeren der Adresse abgebrochen werden. Dazu f&uuml;gen wir hinter das Ausl&ouml;sen des Ereignisses <b>VorDemLeeren <\/b>mit der Anweisung <b>RaiseEvent <\/b>eine <b>If&#8230;Then<\/b>-Bedingung ein, die pr&uuml;ft, ob <b>bolCancel <\/b>den Wert <b>True <\/b>hat. Ist das der Fall, wird die Prozedur mit <b>Exit Sub <\/b>verlassen (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Leeren()\n     <span style=\"color:blue;\">Dim <\/span>bolCancel<span style=\"color:blue;\"> As Boolean<\/span>\n     RaiseEvent VorDemLeeren(m_Anrede, m_Vorname, m_Nachname, bolCancel)\n     <span style=\"color:blue;\">If <\/span>bolCancel = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\n         <span style=\"color:blue;\">Exit Sub<\/span>\n     <span style=\"color:blue;\">End If<\/span>\n     m_Firma = \"\"\n     m_Anrede = \"\"\n     m_Vorname = \"\"\n     m_Nachname = \"\"\n     m_Strasse = \"\"\n     m_PLZ = \"\"\n     m_Ort = \"\"\n     m_Land = \"\"\n     RaiseEvent NachDemLeeren\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Integration des Ereignisses, das vor dem Leeren der Klasse ausgel&ouml;st werden soll<\/span><\/b><\/p>\n<h2>Ereignis mit Parametern implementieren<\/h2>\n<p>Zum Implementieren dieses neuen Ereignisses w&auml;hlen wir wieder das Objekt <b>objAdresse <\/b>aus dem linken Kombinationsfeld des Codefensters der Klasse <b>clsAdressenVerwalten <\/b>aus. Im rechten Kombinationsfeld finden wir nun einen weiteren Eintrag namens <b>VorDemLeeren<\/b>, den wir ebenfalls selektieren. Damit f&uuml;gen wir eine neue Ereignisprozedur zur Klasse <b>clsAdressenVerwalten <\/b>hinzu, die wie in Bild 6 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_425_017.png\" alt=\"Anlegen einer weiteren Ereignisprozedur, diesmal mit Parametern\" width=\"649.627\" height=\"427.5404\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen einer weiteren Ereignisprozedur, diesmal mit Parametern<\/span><\/b><\/p>\n<p>Diese enth&auml;lt alle in der Definition in der Klasse <b>clsAdresse <\/b>festgelegten Parameter. Diese Prozedur f&uuml;llen wir nun wie in Listing 2. Hier nutzen wir gleich alle Parameter. Die ersten drei, <b>strAnrede<\/b>, <b>strVorname <\/b>und <b>strNachname<\/b>, integrieren wir in den Text einer <b>MsgBox<\/b>-Funktion, in der wir den Benutzer fragen, ob die Adresse mit diesen Daten gel&ouml;scht werden soll. Klickt der Benutzer auf <b>Ja<\/b>, wird <b>bolCancel <\/b>auf <b>False <\/b>gesetzt und die Adresse wird geleert. In diesem Fall erscheint anschlie&szlig;end auch noch die Meldung aus der Ereignisprozedur <b>objAdresse_NachDemLeeren<\/b>, dass die Adresse geleert wurde. Klickt er auf <b>Nein<\/b>, erh&auml;lt <b>bolCancel <\/b>den Wert <b>True <\/b>und die Adresse wird beibehalten.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAdresse_VorDemLeeren(strAnrede<span style=\"color:blue;\"> As String<\/span>, strVorname<span style=\"color:blue;\"> As String<\/span>, strNachname<span style=\"color:blue;\"> As String<\/span>, _\n         bolCancel<span style=\"color:blue;\"> As Boolean<\/span>)\n     If <span style=\"color:blue;\">MsgBox<\/span>(\"Adresse ''\" & strAnrede & \" \" & strVorname & \" \" & strNachname & \"'' leeren?\", vbYesNo + vbExclamation, _\n         \"Adresse leeren?\") = vbYes Then\n         bolCancel = <span style=\"color:blue;\">False<\/span>\n     <span style=\"color:blue;\">Else<\/span>\n         bolCancel = <span style=\"color:blue;\">True<\/span>\n     <span style=\"color:blue;\">End If<\/span>\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Implementierung des Ereignisses VorDemLeeren des Objekts objAdresse<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir die Programmierung von Ereignissen in Klassen besprochen. In weiteren Artikeln schauen wir uns konkrete Anwendungsf&auml;lle an.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eines der wichtigsten Features vieler eingebauter Klassen in den Office-Anwendungen sind die Ereignisse. Damit k&ouml;nnen wir Ereignisprozeduren implementieren, mit denen wir beispielsweise auf das Anklicken von Schaltfl&auml;chen, dem &Ouml;ffnen oder Schlie&szlig;en von Dokumenten oder dem Wechseln eines Tabellenblatts in einem Excel-Arbeitsblatt reagieren k&ouml;nnen. Wenn man selbst Klassen programmiert, findet sich fr&uuml;her oder sp&auml;ter ein Anlass, dieser ein eigenes Ereignis hinzuzuf&uuml;gen, dass durch eine bestimmte Aktion ausgel&ouml;st wird. Dieser Artikel zeigt, wir wie solche Ereignisse programmieren und ausl&ouml;sen und wie wir diese in Form von Ereignisprozeduren in den Klassen implementieren, welche das entsprechende Objekt instanziiert haben.<\/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":[66022024,662024,44000025],"tags":[],"yst_prominent_words":[66062029],"class_list":["post-55000425","post","type-post","status-publish","format-standard","hentry","category-66022024","category-662024","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000425","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=55000425"}],"version-history":[{"count":1,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000425\/revisions"}],"predecessor-version":[{"id":88072079,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000425\/revisions\/88072079"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000425"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}