{"id":55000417,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-24T18:01:14","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=417"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Ereignisse_fuer_Termine_implementieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Ereignisse_fuer_Termine_implementieren\/","title":{"rendered":"Outlook: Ereignisse f&uuml;r Termine implementieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/23500da582734036bdc03819f83e1d92\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn wir Aufgaben erledigen wollen, die in Zusammenhang mit dem Anlegen, Bearbeiten oder L&ouml;schen von Terminen zu tun haben, kommen wir nicht um die Programmierung der Ereignisse von Terminen herum. Die Ereignisse eines Termins selbst zu implementieren ist halbwegs intuitiv, aber wo finden wir zum Beispiel die Ereignisprozedur, die ausgel&ouml;st, wenn wir einen neuen Termin anlegen? Der Termin selbst kann dieses Ereignis noch nicht enthalten, denn es gibt ihn ja zu diesem Zeitpunkt noch nicht. Tats&auml;chlich wollen wir auch erst auf das Speichern des neuen Termins reagieren. Dazu m&uuml;ssen wir diesen aber dennoch erst einmal mit einer geeigneten Objektvariablen referenzieren. Wie das gelingt und wie wir alle notwendigen Ereignisse bei der Nutzung eines Termins implementieren k&ouml;nnen, zeigen wir in diesem Artikel.<\/b><\/p>\n<p>Outlook bietet die M&ouml;glichkeit, auf verschiedene Ereignisse zu reagieren, die mit dem Erstellen, Verschieben, L&ouml;schen oder &Auml;ndern von Terminen zu tun haben. Das ist immer dann interessant, wenn wir auf irgendeine Weise auf eines dieser Ereignisse reagieren m&uuml;ssen &#8211; beispielsweise, wenn wir die Termine mit einem Google Calender oder einem anderen Kalender synchronisieren wollen, wie wir es in <b>Termine von Outlook zum Google Calendar exportieren <\/b>(<b>www.vbentwickler.de\/418<\/b>) beschreiben.<\/p>\n<p>Um diese Funktionen optimal zu nutzen, m&uuml;ssen wir jede &Auml;nderung an einem Termin von Outlook nach Google &uuml;bertragen &#8211; und dabei handelt es sich um das Anlegen, &Auml;ndern und L&ouml;schen eines Termins.<\/p>\n<p>Die erste Aufgabe hierbei ist, &uuml;berhaupt herauszufinden, welche Ereignisse wir dazu nutzen k&ouml;nnen.<\/p>\n<p>Die erste Anlaufstelle f&uuml;r solche Informationen ist immer der Objektkatalog des VBA-Editors (zu &ouml;ffnen mit <b>F2<\/b>).<\/p>\n<p>Hier suchen wir nach dem <b>AppointmentItem<\/b>-Element und erhalten direkt einige Ereignisse &#8211; das sind die mit dem Blitz-Symbol versehenen Eintr&auml;ge in Bild 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_001.png\" alt=\"Ereignisse des Termins im Objektkatalog\" width=\"649,627\" height=\"487,9861\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ereignisse des Termins im Objektkatalog<\/span><\/b><\/p>\n<h2>Ereignisse ausprobieren<\/h2>\n<p>Zum Ann&auml;hern an brauchbare Ereignisse bietet es sich an, diese einmal zu implementieren und sie mit Haltepunkten oder der <b>Stop<\/b>-Anweisung zu versehen. Dann sehen wir beim Arbeiten mit einem <b>AppointmentItem<\/b>-Element direkt, wann welche Ereignisse ausgel&ouml;st werden.<\/p>\n<p>Um die Ereignisse zu implementieren, ben&ouml;tigen wir allerdings erst einmal eine Objektvariable, die wir mit einem Verweis auf das <b>AppointmentItem<\/b>-Element f&uuml;llen und f&uuml;r die wir die Ereignisse implementieren k&ouml;nnen. Diese deklarieren wir im Modul <b>ThisOutlookSession <\/b>wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>WithEvents objAppointmentItem _\r\n    <span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem<\/pre>\n<p>Au&szlig;erdem verwenden wir die im Artikel <b>Outlook: Kalender und Termine programmieren <\/b>(<b>www.vbentwickler.de\/415<\/b>) vorgestellte Funktion <b>GetSelectedAppointmentItem<\/b>, mit der wir den aktuellen Termin referenzieren.<\/p>\n<p>Die folgende Funktion weist der Variablen <b>objAppointmentItem <\/b>den aktuell markierten Termin zu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ReferenceSelectedAppointmentItem()\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach k&ouml;nnen wir im VBA-Editor im linken Kombinationsfeld die Variable <b>objAppointmentItem <\/b>ausw&auml;hlen und erhalten im rechten Kombinationsfeld alle verf&uuml;gbaren Ereignisse (siehe Bild 2). Klicken wir eines davon an, wird die entsprechende Ereignisprozedur zum Modul hinzugef&uuml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_002.png\" alt=\"Implementieren einer Ereignisprozedur\" width=\"649,627\" height=\"386,5736\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Implementieren einer Ereignisprozedur<\/span><\/b><\/p>\n<p>Wir haben zun&auml;chst einfach jeder dieser Ereignisprozeduren die <b>Stop<\/b>-Anweisung hinzugef&uuml;gt (siehe Bild 3). Beim &Ouml;ffnen und beim Schlie&szlig;en werden diese beiden Ereignisprozeduren ausgel&ouml;st:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_003.png\" alt=\"Implementierte Ereignisprozeduren eines AppointmentItem-Elements\" width=\"700\" height=\"333,761\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Implementierte Ereignisprozeduren eines AppointmentItem-Elements<\/span><\/b><\/p>\n<ul>\n<li><b>objAppointmentItem_Open<\/b><\/li>\n<li><b>objAppointmentItem_Close<\/b><\/li>\n<\/ul>\n<p>Bei anderen Aktionen traten jedoch gleich mehrere Ereignisse auf, daher sind wir von der <b>Stop<\/b>-Anweisung abgegangen und haben <b>Debug.Print<\/b>-Anweisungen hinzuf&uuml;gt, mit denen wir teilweise noch die Parameter ausgeben &#8211; zum Beispiel so:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_PropertyChange(ByVal _\r\n         Name<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"objAppointmentItem_PropertyChange\", Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit erhalten wir allein beim &Auml;ndern der Startzeit eines ge&ouml;ffneten Termins von 9:00 Uhr auf 9:30 Uhr wie in Bild 4 gleich sechs Ereignisse. Diese interessieren uns allerdings nicht, wenn wir beispielsweise die &Auml;nderungen an einen Google Calendar &uuml;bertragen wollen. Dann ben&ouml;tigen wir nur zu einem bestimmten Zeitpunkt, beispielsweise beim Schlie&szlig;en, die Information, ob der Termin ge&auml;ndert wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_004.png\" alt=\"Ausgabe der Ereignisse beim &Auml;ndern einer Eigenschaft\" width=\"649,627\" height=\"442,6028\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe der Ereignisse beim &Auml;ndern einer Eigenschaft<\/span><\/b><\/p>\n<p>Und das ist allein mit dem AppointmentItem-Element nur schwer zu realisieren &#8211; wir m&uuml;ssten beim &Ouml;ffnen alle Eigenschaften ermitteln und zwischenspeichern und beim Schlie&szlig;en des Termins pr&uuml;fen, ob sich seit dem &Ouml;ffnen die Werte mindestens einer Eigenschaft ge&auml;ndert haben. Zum Gl&uuml;ck gibt es noch andere M&ouml;glichkeiten, die noch einen weiteren Vorteil bieten: Wir haben oben nun einen Termin referenziert und seine Ereignisse implementiert. Wenn wir das Erfassen von &Auml;nderungen auf diese Weise umsetzen wollten, m&uuml;ssten wir zun&auml;chst jeden Termin, den der Benutzer &ouml;ffnet, referenzieren &#8211; oder gleich alle Elemente des Kalenders erfassen. Und &uuml;ber diesen Schritt kommen wir zu einer eleganteren L&ouml;sung.<\/p>\n<h2>Auflistung der AppointmentItems referenzieren<\/h2>\n<p>Dabei wollen wir nicht nur einen Termin, sondern gleich die komplette Liste der Termine im Kalender referenzieren. Dazu ben&ouml;tigen wir zun&auml;chst einen Verweis auf den Kalender-Ordner.<\/p>\n<p>Diesen holen wir wieder mit einer Funktion, die wir bereits im Artikel <b>Outlook: Kalender und Termine programmieren <\/b>(<b>www.vbentwickler.de\/415<\/b>) vorgestellt haben. Die Funktion hei&szlig;t <b>GetDefaultCalendar <\/b>und holt den Standardkalender des aktuellen Benutzers von Outlook.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir eine Variable des Typs <b>Outlook.Items<\/b>. Diese deklarieren wir im Modul <b>ThisOutlookSession <\/b>wieder mit dem Schl&uuml;sselwort <b>WithEvents<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>WithEvents objAppointmentItem _\r\n    <span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem<\/pre>\n<p>Das Referenzieren erledigen wir mit der folgenden Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ReferenceAppointmentItems()\r\n     <span style=\"color:blue;\">Dim <\/span>objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = GetDefaultCalendar\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItems = objCalendar.Items\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit haben wir eine Auflistung referenziert, die alle <b>AppointmentItem<\/b>-Elemente enth&auml;lt. Und wenn wir das Element <b>objAppointmentItems <\/b>im linken Kombinationsfeld des Codefensters ausw&auml;hlen, finden wir im rechten die folgenden drei Ereignisse vor (siehe Bild 5):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_005.png\" alt=\"Die Items-Auflistung liefert alle notwendigen Ereignisse.\" width=\"700\" height=\"231,4906\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die Items-Auflistung liefert alle notwendigen Ereignisse.<\/span><\/b><\/p>\n<ul>\n<li><b>ItemAdd<\/b>: Wird beim Hinzuf&uuml;gen eines Elements ausgel&ouml;st.<\/li>\n<li><b>ItemChange<\/b>: Wird beim &Auml;ndern eines Elements ausgel&ouml;st.<\/li>\n<li><b>ItemRemove<\/b>: Wird beim Entfernen eines Elements ausgel&ouml;st.<\/li>\n<\/ul>\n<p>Implementieren wir diese Ereignisse also in Form entsprechender Prozedur im Modul <b>ThisOutlookSession<\/b> und lassen uns erst einmal eine Meldung im Direktbereich ausgeben, wenn die Ereignisse ausgel&ouml;st werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItems_ItemAdd( _\r\n     ByVal Item<span style=\"color:blue;\"> As Object<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"ItemAdd\", Item.Subject\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>objAppointmentItems_ItemChange( _\r\n         ByVal Item<span style=\"color:blue;\"> As Object<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"ItemChange\", Item.Subject\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>objAppointmentItems_ItemRemove()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"ItemRemove\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nachdem wir die Prozedur <b>ReferenceAppointmentItems <\/b>aufgerufen haben, legen wir einen neuen Eintrag im Kalender an, &auml;ndern diesen und speichern ihn und l&ouml;schen ihn wieder. Das Ergebnis: Bei allen drei Aktionen wird die entsprechende Ereignisprozedur ausgel&ouml;st.<\/p>\n<p>Allerdings liefern nur die beiden Ereignisse <b>ItemAdd <\/b>und <b>ItemChange <\/b>einen Verweis auf das neu erstellte beziehungsweise gel&ouml;schte Element.<\/p>\n<p>Dieses k&ouml;nnten wir nutzen, um beispielsweise den Termin mit einem Google Calendar zu synchronisieren.<\/p>\n<p>Wie aber wollen wir beim L&ouml;schen eines <b>AppointmentItem<\/b>-Elements herausfinden, welches gel&ouml;scht wurde?<\/p>\n<h2>Gel&ouml;schtes Element ermitteln<\/h2>\n<p>Dazu ben&ouml;tigen wir noch eine weitere Auflistung, n&auml;mlich die des Ordners mit den Terminen. Diese haben wir grunds&auml;tzlich schon in der Prozedur <b>ReferenceAppointmentItems <\/b>schon referenziert. Wenn wir auf ihre Ereignisse reagieren wollen, m&uuml;ssen wir die Deklaration aus dieser Prozedur herausnehmen und in den allgemeinen Teil des Moduls verschieben:<\/p>\n<p><b>Public WithEvents objCalendar As Outlook.Folder<\/b><\/p>\n<p>Der Prozedur entnehmen wir die entsprechende Zeile oder kommentieren diese aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ReferenceAppointmentItems()\r\n     ''Dim objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = GetDefaultCalendar\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItems = objCalendar.Items\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schauen wir uns das <b>Folder<\/b>-Objekt im Objektkatalog an, sehen wir auch gleich das entscheidende Ereignis, n&auml;mlich <b>BeforeItemMove<\/b> (siehe Bild 6). Dieses implementieren wir wie folgt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_417_006.png\" alt=\"Das Folder-Objekt im Objektkatalog\" width=\"499,6267\" height=\"468,5296\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Folder-Objekt im Objektkatalog<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objCalendar_BeforeItemMove(_\r\n         ByVal Item<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByVal MoveTo<span style=\"color:blue;\"> As <\/span>MAPIFolder, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Item.Subject, MoveTo.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Name des Ereignisses verr&auml;t uns allerdings auch direkt: Hier geht es nicht allein um das L&ouml;schen von Elementen, sondern um das Verschieben in andere Ordner. Allerdings ist auch das L&ouml;schen eines <b>AppointmentItems <\/b>das Verschieben in einen anderen Ordner, n&auml;mlich in den Ordner <b>Gel&ouml;schte Elemente<\/b>.<\/p>\n<p>Um das L&ouml;schen eines Kalendereintrags zu erfassen, m&uuml;ssen wir also pr&uuml;fen, ob das Element verschoben wurde und ob der Zielordner der Ordner <b>Gel&ouml;schte Elemente <\/b>ist.<\/p>\n<p>Wir k&ouml;nnen anhand des Namens des Zielordners pr&uuml;fen, ob das <b>AppointmentItem<\/b>-Element gel&ouml;scht wurde. Dazu vergleichen wir die <b>Name<\/b>-Eigenschaft des mit dem Parameter <b>MoveTo <\/b>gelieferten Ordners mit der Zeichenkette <b>Gel&ouml;schte Elemente<\/b> und geben nur in diesem Fall den Text im Direktbereich aus, dass das Element gel&ouml;scht wurde:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objCalendar_BeforeItemMove(_\r\n         ByVal Item<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByVal MoveTo<span style=\"color:blue;\"> As <\/span>MAPIFolder, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>MoveTo.Name = \"Gel&ouml;schte Elemente\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Gel&ouml;scht: \" & Item.Subject, MoveTo.Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sobald die L&ouml;sung jedoch in einem Office-Paket mit einer anderen Sprache genutzt wird, funktioniert dies nicht mehr. Also vergleichen wir den Ordner mit dem Standardordner f&uuml;r die gel&ouml;schten Elemente. Um diesen Ordner zu ermitteln, verwenden wir die folgende Funktion, die wir von der Funktion <b>GetDefaultCalendar <\/b>abgeleitet haben:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetDefaultDeletedItems()<span style=\"color:blue;\"> As <\/span>Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objMAPI<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Dim <\/span>objDeletedItems<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = Application\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = objOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objDeletedItems = _\r\n         objMAPI.GetDefaultFolder(olFolderDeletedItems)\r\n     <span style=\"color:blue;\">Set<\/span> GetDefaultDeletedItems = objDeletedItems\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Danach k&ouml;nnen wir im Ereignis <b>BeforeItemMove <\/b>ermitteln, ob das in einen anderen Ordner bewegte Element gel&ouml;scht wurde:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objCalendar_BeforeItemMove(_\r\n         ByVal Item<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByVal MoveTo<span style=\"color:blue;\"> As <\/span>MAPIFolder, Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>MoveTo = GetDefaultDeletedItems<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Gel&ouml;scht: \" & Item.Subject, MoveTo.Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Du diese Prozeduren implementierst und damit experimentierst, kann es sein, dass diese scheinbar nicht funktionieren. Dann haben vermutlich einfach die Objektvariablen ihre Objekte verloren. Das kann zum Beispiel durch unbehandelte Laufzeitfehler auftreten. In diesem Fall musst Du nur die Prozedur zum F&uuml;llen der Objektvariablen erneut aufrufen &#8211; in diesem Fall die Prozedur <b>ReferenceAppointmentItems<\/b>.<\/p>\n<h2>Variablen beim Start von Outlook f&uuml;llen<\/h2>\n<p>Damit die Ereignisprozeduren beim Start von Outlook direkt scharfgeschaltet sind, f&uuml;gen wir dem Modul <b>ThisOutlookSession <\/b>das Ereignis <b>Startup <\/b>des <b>Application<\/b>-Objekts hinzu. Dies k&ouml;nnen wir wieder &uuml;ber die beiden Kombinationsfelder im Kopf des Codefensters erledigen. Hier w&auml;hlen wir links den Eintrag <b>Application <\/b>aus und rechts den Eintrag <b>Startup<\/b>. Dadurch entsteht die folgende Prozedur, der wir noch die Anweisung zum Aufrufen der Routine <b>ReferenceAppointmentItems <\/b>hinzugef&uuml;gt haben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Application_Startup()\r\n     <span style=\"color:blue;\">Call<\/span> ReferenceAppointmentItems\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf diese Weise sorgen wir daf&uuml;r, dass gleich nach dem Start von Outlook die Objekte gef&uuml;llt und somit die Ereignisprozeduren scharf geschaltet werden. <\/p>\n<h2>Beispiele nutzen<\/h2>\n<p>Wir haben die Beispiele in zwei Dateien bereitgestellt:<\/p>\n<ul>\n<li>Als Export des Moduls unter dem Namen <b>ThisOutlookSession.cls<\/b>. Diese k&ouml;nnen Sie einfach aus dem Windows Explorer in das VBA-Projekt von Outlook ziehen. Vorher musst Du das vorhandene Element gleichen Namens entfernen (nur, wenn dieses noch nicht ge&auml;ndert wurde &#8211; anderenfalls bitte die Datei im Editor &ouml;ffnen und die gew&uuml;nschten Prozeduren in die bestehende <b>ThisOutlookSession<\/b>-Klasse kopieren).<\/li>\n<li>Als VBA-Projekt unter dem Namen <b>VbaProject.OTM<\/b>. Wenn Du das komplette VBA-Projekt nutzen willst, ersetzt Du die vorhandene Datei im Verzeichnis <b>C:\\Users\\User\\AppData\\Roaming\\Microsoft\\Outlook\\ <\/b>mit dieser Datei. Auch hier gilt: Vorher pr&uuml;fen, ob nicht schon Elemente im vorhandenen VBA-Projekt vorgenommen wurden, die noch ben&ouml;tigt werden, gegebenenfalls Backup erstellen.<\/li>\n<\/ul>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir die Techniken vorgestellt, mit denen wir auf verschiedene Ereignisse beim Anlegen, Bearbeiten und L&ouml;schen von Terminen reagieren k&ouml;nnen.<\/p>\n<p>Dazu k&ouml;nnen wir Ereignisprozeduren nutzen verschiedener Elemente und Auflistungen nutzen, welche die gew&uuml;nschen Aktionen durchf&uuml;hren:<\/p>\n<ul>\n<li><b>AppointmentItem<\/b>: <b>Open <\/b>und <b>Close<\/b><\/li>\n<li><b>Folder <\/b>(des Kalenders): <b>BeforeItemMove <\/b>(in den Ordner <b>Gel&ouml;schte Elemente<\/b>, um zu ermitteln, ob ein Element gel&ouml;scht wurde)<\/li>\n<li><b>Items<\/b>: <b>Add <\/b>beim Erstellen eines Kalenders und <b>Change<\/b> beim &Auml;ndern eines Kalenders<\/li>\n<\/ul>\n<p>Ein praktisches Beispiel, das wir uns an anderer Stelle genauer ansehen, ist das &Uuml;bertragen der Termine in einen Google Calendar. Die grundlegenden Techniken dazu haben wir in einigen anderen Artikel beschrieben, aktuell in den folgenden:<\/p>\n<ul>\n<li><b>Termine von Outlook zum Google Calendar exportieren <\/b>(<b>www.vbentwickler.de\/418<\/b>)<\/li>\n<li><b>Google Calendar per Rest-API programmieren, Teil 2 <\/b>(<b>www.vbentwickler.de\/416<\/b>)<\/li>\n<li><b>Google-Authentifzierung mit OAuth2, Update <\/b>(<b>www.vbentwickler.de\/414<\/b>)<\/li>\n<\/ul>\n<p>Wie bringen wir nun alles zusammen? Der erste Schritt w&auml;re, die Funktionen aus dem Artikel <b>Termine von Outlook zum Google Calendar exportieren <\/b>(<b>www.vbentwickler.de\/418<\/b>) in die im vorliegenden Artikel beschriebenen Ereignisprozeduren einzuf&uuml;gen. So w&uuml;rden bereits beim Ausl&ouml;sen dieser Ereignisse die Termine in den Google Calendar &uuml;bertragen werden.<\/p>\n<p>Wir wollen aber noch einen Schritt weiter gehen und den Terminen Ribbon- und Kontextmen&uuml;-Eintr&auml;ge hinzuf&uuml;gen, damit der Benutzer Termine auch manuell nach Google &uuml;bertragen kann.<\/p>\n<p>Dazu ben&ouml;tigen wir ein COM-Add-In. Dieses programmieren wir wie &uuml;blich mit twinBASIC. Wie das gelingt, zeigen wir im Artikel <b>Outlook: Termine per COM-Add-In nach Google <\/b>(<b>www.vbentwickler.de\/419<\/b>).<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ThisOutlookSession.cls<\/p>\n<p>VbaProject.OTM<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F8701725-6880-4FA9-8604-5B851386A268\/vbe_417.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn wir Aufgaben erledigen wollen, die in Zusammenhang mit dem Anlegen, Bearbeiten oder L&ouml;schen von Terminen zu tun haben, kommen wir nicht um die Programmierung der Ereignisse von Terminen herum. Die Ereignisse eines Termins selbst zu implementieren ist halbwegs intuitiv, aber wo finden wir zum Beispiel die Ereignisprozedur, die ausgel&ouml;st, wenn wir einen neuen Termin anlegen? Der Termin selbst kann dieses Ereignis noch nicht enthalten, denn es gibt ihn ja zu diesem Zeitpunkt noch nicht. Tats&auml;chlich wollen wir auch erst auf das Speichern des neuen Termins reagieren. Dazu m&uuml;ssen wir diesen aber dennoch erst einmal mit einer geeigneten Objektvariablen referenzieren. Wie das gelingt und wie wir alle notwendigen Ereignisse bei der Nutzung eines Termins implementieren k&ouml;nnen, 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":[66012024,662024,44000026,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000417","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Outlook_programmieren","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000417","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=55000417"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000417\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000417"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}