Die Synchronisation von Outlook-Terminen in eine Access-Datenbank und wieder zurück ist ein sehr gefragtes Thema. In diesem Artikel schauen wir uns zunächst an, wie Sie Termine in Outlook lesen können. Dabei gibt es einige Feinheiten, die wir unter die Lupe nehmen. Die wichtigsten Informationen eines Termins wollen wir dabei in eine Access-Tabelle übertragen. Anlässe für das Einlesen von Outlook-Terminen gibt es genug – vielleicht möchten Sie die Geburtstage in eine Access-Datenbank übertragen oder einfach alle Termine für bestimmte Auswertungen erfassen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2004_OutlooktermineEinlesen.accdb.
Verweis auf Outlook und andere Vorbereitungen
Damit wir einfach per VBA auf Outlook und sein Objektmodell zugreifen können, fügen Sie dem VBA-Projekt der Beispieldatenbank einen Verweis auf die Bibliothek Microsoft Outlook x.0 Object Library.
Dazu öffnen Sie mit Alt + F11 den VBA-Editor und wählen den Menüeintrag Extras|Verweise aus. Im nun erscheinenden Dialog Verweise fügen Sie die genannte Bibliothek hinzu.
Außerdem benötigen wir im Folgenden einige Funktionen, um auf Outlook, das Namespace-Objekt und die Folder-Objekte von Outlook zuzugreifen. Diese erläutern wir ausführlich im Artikel Outlook-Ordner im Griff.
Zugriff auf den Kalender-Ordner
Mit den im oben genannten Artikel vorgestellten Techniken greifen wir ganz einfach auf den Termine-Ordner von Outlook zu. Verwenden Sie den Standard-Ordner zum Speichern von Terminen, nutzen Sie diesen Aufruf, um den Ordner zu referenzieren. Hier geben wir die Anzahl der enthaltenen Einträge in der Items-Auflistung aus:
GetCalendarFolder.Items.Count 639
Wenn Sie nicht den Standard-Kalender-Ordner verwenden, sondern beispielsweise einen Ordner namens Calendar unter dem Element iCloud, verwenden Sie diesen Aufruf:
GetFolderByPath("iCloud\Calendar").Items.Count
Alle Termine durchlaufen
Mit der folgenden Prozedur durchlaufen wir alle Termine, die sich im aktuellen Standard-Termin-Ordner befinden.
Dabei referenzieren wir den Termin-Ordner mit der Variablen objFolder und durchlaufen die Einträge anschließend in einer For Each-Schleife über alle Elemente der Auflistung Items von objFolder. Als Laufvariable verwenden wir dabei die Variable objAppointmentItem des Typs AppointmentItem.
Innerhalb der Schleife geben wir zu jedem Termin die EntryID, also den eindeutigen Identifizierer, und den Betreff des Termins aus:
Public Sub AlleTermineDurchlaufen() Dim objAppointmentItem As Outlook.AppointmentItem Dim objFolder As Outlook.Folder Set objFolder = GetCalendarFolder For Each objAppointmentItem In objFolder.Items With objAppointmentItem Debug.Print .EntryID & " " & .Subject End With Next objAppointmentItem End Sub
Neueste Termine einlesen
Damit haben wir nun einfach alle Termine des Ordners eingelesen. Das ist meist nicht zielführend, da Sie gegebenenfalls regelmäßig Termine einlesen und dann nur die neuen Termine einlesen wollen. Dem nähern wir uns nun langsam an.
Sie können zum Beispiel nur die neuesten Termine einlesen beziehungsweise die Sortierung beim Einlesen so festlegen, dass die neuesten Termine zuerst eingelesen werden.
Die Prozedur dazu sieht wie folgt aus und deklariert ein AppointmentItem-, ein Folder– und ein Items-Objekt.
Während Sie die ersten beiden bereits kennen, ist das Items-Element neu: Mit diesem können Sie eine Sammlung von Outlook-Elementen referenzieren, also beispielsweise eine Reihe von Terminen:
Public Sub ErsteZehnEinlesen() Dim objAppointmentItem As Outlook.AppointmentItem Dim objFolder As Outlook.Folder Dim objItems As Outlook.Items Dim i As Integer
Wir holen wieder den Standard-Kalender-Ordner über die Funktion GetCalendarFolder. Wenn Sie einen anderen Ordner verwenden wollen, nutzen Sie stattdessen beispielsweise die im Artikel Outlook-Folder im Griff vorgestellten Funktionen GetFolderByPath oder GetFolder:
Set objFolder = GetCalendarFolder
Danach weisen wir alle Elemente dieses Ordners der Items-Liste objItems zu:
Set objItems = objFolder.Items
Diese bietet schließlich die Methode Sort, mit der Sie die enthaltenen Elemente nach verschiedenen Feldern und Sortierreihenfolgen sortieren können. In diesem Fall sortieren wir nach dem Feld Start, das wir als ersten Parameter angeben. Der zweite Parameter heißt Descending und wir stellen hier den Wert True ein, um die Termine in absteigender Reihenfolge nach dem Starttermin zu sortieren:
objItems.Sort "[Start]", True
Danach durchlaufen wir eine Schleife von 1 bis 10, um nur die ersten zehn Einträge auszugeben. Hier weisen wir der Variablen objAppointmentItem das Item-Element aus objItems mit dem Indexwert aus der Laufvariablen i zu:
For i = 1 To 10
Set objAppointmentItem = objItems.Item(i)
Dann geben wir die EntryID, das Start-Datum und den Betreff des Termins aus:
With objAppointmentItem Debug.Print .EntryID & ";" & .Start _ & ": " & .Subject End With Next i End Sub
Wichtige Eigenschaften von Terminen
Bevor wir tiefer einsteigen, schauen wir uns einige wichtige Eigenschaften von Terminen an. Die ersten haben Sie schon kennengelernt:
- EntryID: Eindeutiger Bezeichner eines Termins und allgemein von Outlook-Elementen
- Start: Startdatum des Termins
- Subject: Betreff des Termins
Auch die folgenden Eigenschaften sind interessant:
- AllDayEvent: Gibt an, ob es sich um einen ganztägigen Termin handelt.
- BillingInformation: Ein Feld, das keinen bestimmten Zweck hat, aber gern als flexible Eigenschaft verwendet wird – beispielsweise, um Outlook-Elemente zu markieren, die bereits in eine Datenbank eingelesen wurden.
- Body: Text des Termins
- Categories: Kategorien, denen der Termin zugeordnet wurde
- CreationTime: Erstellungsdatum des AppointmentItem-Objekts
- Duration: Dauer des Termins
- End: Ende des Termins
- GetInspector: Holt einen Verweis auf das Fenster, das zur Anzeige dieses Elements verwendet wird.
- Importance: Priorität des Termins
- IsRecurring: Gibt an, ob es sich um einen wiederkehrenden Termin handelt.
- Location: Gibt den Ort des Termins an.
- RecurrenceState: Information zu Serienterminen. Kann die folgenden Werte annehmen: olApptNotRecurring (0): kein Serientermin, olApptMaster (1): Haupttermin, olApptOccurrence (2): Termin ist ein Serientermin des Haupttermins, olApptException (3): Termin ist eine geänderter Termin einer Terminserie
- ReminderMinutesBeforeStart: Anzahl der Minuten, wann die Erinnerung vor dem Start des Termins angezeigt werden soll.
- ReminderSet: Gibt an, ob eine Erinnerung erfolgen soll.
- RTFBody: Inhalt des Termins im RTF-Format
- Saved: Gibt an, ob der Termin seit dem letzten Speichern nicht geändert wurde.
- UserProperties: Auflistung benutzerdefinierter Eigenschaften
Methoden von AppointmentItem-Objekten
Sie können von Access aus auch die Methoden von AppointmentItem-Objekten aufrufen.
Hier sind die interessantesten Methoden dieser Objekte:
- ClearRecurrencePattern: Entfernt die Serientermin-Eigenschaften und wandelt den Termin in einen Einzeltermin um.
- Close: Schließt einen geöffneten Termin.
- Copy: Erstellt eine Kopie des Termins.
- CopyTo: Erstellt eine Kopie des Termins in einem anderen Ordner, der als Folder-Objekt als Paramter angegeben wird.
- Delete: Löscht den Termin.
- Display: Zeigt den Termin im jeweiligen Inspector-Objekt an.
- GetRecurrencePattern: Liefert ein Objekt des Typs RecurrencePattern, das alle Informationen zum Serientermin enthält. Um die Serientermine kümmern wir uns in einem eigenen Artikel.
- Move: Verschiebt einen Termin in einen anderen Ordner, der als Folder-Objekt als Parameter angegeben werden muss.
- PrintOut: Druckt den Termin.
- Save: Speichert den Termin.
- SaveAs: Speichert den Termin in das mit dem ersten Parameter angegebene Verzeichnis und unter dem mit dem zweiten Parameter angegebenen Typ, standardmäßig wird das Format .msg verwendet.
- ShowCategoriesDialog: Zeigt den Dialog zur Auswahl der Kategorien für diesen Termin an.
Termine in eine Tabelle schreiben
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: