Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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.
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.
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:
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.
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):
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: