Outlook: Ereignisse für Termine implementieren

Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!

Wenn wir Aufgaben erledigen wollen, die in Zusammenhang mit dem Anlegen, Bearbeiten oder Lö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ö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ächlich wollen wir auch erst auf das Speichern des neuen Termins reagieren. Dazu mü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önnen, zeigen wir in diesem Artikel.

Outlook bietet die Möglichkeit, auf verschiedene Ereignisse zu reagieren, die mit dem Erstellen, Verschieben, Löschen oder Ändern von Terminen zu tun haben. Das ist immer dann interessant, wenn wir auf irgendeine Weise auf eines dieser Ereignisse reagieren müssen – beispielsweise, wenn wir die Termine mit einem Google Calender oder einem anderen Kalender synchronisieren wollen, wie wir es in Termine von Outlook zum Google Calendar exportieren (www.vbentwickler.de/418) beschreiben.

Um diese Funktionen optimal zu nutzen, müssen wir jede Änderung an einem Termin von Outlook nach Google übertragen – und dabei handelt es sich um das Anlegen, Ändern und Löschen eines Termins.

Die erste Aufgabe hierbei ist, überhaupt herauszufinden, welche Ereignisse wir dazu nutzen können.

Die erste Anlaufstelle für solche Informationen ist immer der Objektkatalog des VBA-Editors (zu öffnen mit F2).

Hier suchen wir nach dem AppointmentItem-Element und erhalten direkt einige Ereignisse – das sind die mit dem Blitz-Symbol versehenen Einträge in Bild 1.

Ereignisse des Termins im Objektkatalog

Bild 1: Ereignisse des Termins im Objektkatalog

Ereignisse ausprobieren

Zum Annähern an brauchbare Ereignisse bietet es sich an, diese einmal zu implementieren und sie mit Haltepunkten oder der Stop-Anweisung zu versehen. Dann sehen wir beim Arbeiten mit einem AppointmentItem-Element direkt, wann welche Ereignisse ausgelöst werden.

Um die Ereignisse zu implementieren, benötigen wir allerdings erst einmal eine Objektvariable, die wir mit einem Verweis auf das AppointmentItem-Element füllen und für die wir die Ereignisse implementieren können. Diese deklarieren wir im Modul ThisOutlookSession wie folgt:

Public WithEvents objAppointmentItem _
     As Outlook.AppointmentItem

Außerdem verwenden wir die im Artikel Outlook: Kalender und Termine programmieren (www.vbentwickler.de/415) vorgestellte Funktion GetSelectedAppointmentItem, mit der wir den aktuellen Termin referenzieren.

Die folgende Funktion weist der Variablen objAppointmentItem den aktuell markierten Termin zu:

Public Sub ReferenceSelectedAppointmentItem()
     Set objAppointmentItem = GetSelectedAppointmentItem
End Sub

Danach können wir im VBA-Editor im linken Kombinationsfeld die Variable objAppointmentItem auswählen und erhalten im rechten Kombinationsfeld alle verfügbaren Ereignisse (siehe Bild 2). Klicken wir eines davon an, wird die entsprechende Ereignisprozedur zum Modul hinzugefügt.

Implementieren einer Ereignisprozedur

Bild 2: Implementieren einer Ereignisprozedur

Wir haben zunächst einfach jeder dieser Ereignisprozeduren die Stop-Anweisung hinzugefügt (siehe Bild 3). Beim Öffnen und beim Schließen werden diese beiden Ereignisprozeduren ausgelöst:

Implementierte Ereignisprozeduren eines AppointmentItem-Elements

Bild 3: Implementierte Ereignisprozeduren eines AppointmentItem-Elements

  • objAppointmentItem_Open
  • objAppointmentItem_Close

Bei anderen Aktionen traten jedoch gleich mehrere Ereignisse auf, daher sind wir von der Stop-Anweisung abgegangen und haben Debug.Print-Anweisungen hinzufügt, mit denen wir teilweise noch die Parameter ausgeben – zum Beispiel so:

Private Sub objAppointmentItem_PropertyChange(ByVal _
         Name As String)
     Debug.Print "objAppointmentItem_PropertyChange", Name
End Sub

Damit erhalten wir allein beim Ändern der Startzeit eines geö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 Änderungen an einen Google Calendar übertragen wollen. Dann benötigen wir nur zu einem bestimmten Zeitpunkt, beispielsweise beim Schließen, die Information, ob der Termin geändert wurde.

Ausgabe der Ereignisse beim Ändern einer Eigenschaft

Bild 4: Ausgabe der Ereignisse beim Ändern einer Eigenschaft

Und das ist allein mit dem AppointmentItem-Element nur schwer zu realisieren – wir müssten beim Öffnen alle Eigenschaften ermitteln und zwischenspeichern und beim Schließen des Termins prüfen, ob sich seit dem Öffnen die Werte mindestens einer Eigenschaft geändert haben. Zum Glück gibt es noch andere Möglichkeiten, die noch einen weiteren Vorteil bieten: Wir haben oben nun einen Termin referenziert und seine Ereignisse implementiert. Wenn wir das Erfassen von Änderungen auf diese Weise umsetzen wollten, müssten wir zunächst jeden Termin, den der Benutzer öffnet, referenzieren – oder gleich alle Elemente des Kalenders erfassen. Und über diesen Schritt kommen wir zu einer eleganteren Lösung.

Auflistung der AppointmentItems referenzieren

Dabei wollen wir nicht nur einen Termin, sondern gleich die komplette Liste der Termine im Kalender referenzieren. Dazu benötigen wir zunächst einen Verweis auf den Kalender-Ordner.

Diesen holen wir wieder mit einer Funktion, die wir bereits im Artikel Outlook: Kalender und Termine programmieren (www.vbentwickler.de/415) vorgestellt haben. Die Funktion heißt GetDefaultCalendar und holt den Standardkalender des aktuellen Benutzers von Outlook.

Außerdem benötigen wir eine Variable des Typs Outlook.Items. Diese deklarieren wir im Modul ThisOutlookSession wieder mit dem Schlüsselwort WithEvents:

Public WithEvents objAppointmentItem _
     As Outlook.AppointmentItem

Das Referenzieren erledigen wir mit der folgenden Prozedur:

Public Sub ReferenceAppointmentItems()
     Dim objCalendar As Outlook.Folder
     Set objCalendar = GetDefaultCalendar
     Set objAppointmentItems = objCalendar.Items
End Sub

Damit haben wir eine Auflistung referenziert, die alle AppointmentItem-Elemente enthält. Und wenn wir das Element objAppointmentItems im linken Kombinationsfeld des Codefensters auswählen, finden wir im rechten die folgenden drei Ereignisse vor (siehe Bild 5):

Die Items-Auflistung liefert alle notwendigen Ereignisse.

Bild 5: Die Items-Auflistung liefert alle notwendigen Ereignisse.

  • ItemAdd: Wird beim Hinzufügen eines Elements ausgelöst.
  • ItemChange: Wird beim Ändern eines Elements ausgelöst.
  • ItemRemove: Wird beim Entfernen eines Elements ausgelöst.

Implementieren wir diese Ereignisse also in Form entsprechender Prozedur im Modul ThisOutlookSession und lassen uns erst einmal eine Meldung im Direktbereich ausgeben, wenn die Ereignisse ausgelöst werden:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar