Wenn Sie auf die Objekte von Outlook zugreifen wollen, egal, ob es sich um E-Mails, Termine, Kontakte, Aufgaben oder andere Objekte handelt, müssen Sie zuvor den Ordner referenzieren, der die jeweiligen Elemente enthält. Dazu gibt es eine Reihe verschiedener Techniken. Dieser Artikel zeigt, wie Sie den grundlegenden Zugriff auf eine Outlook-Instanz, auf das enthaltene MAPI-Namespace-Objekt sowie die von diesem verwalteten Ordner realisieren. In weiteren Artikeln nutzen wir diese Techniken als Grundlage für den Zugriff auf E-Mails, Termine, Kontakte und Co.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2003_OutlookFolder.accdb.
Verweis auf Outlook
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 den Eintrag aus Bild 1 hinzu.
Bild 1: Verweis auf die Outlook-Bibliothek
VBA-Zugriff auf Outlook
Wenn wir auf die Daten von Outlook zugreifen wollen, müssen wir zunächst eine Outlook-Instanz starten. Gegebenenfalls ist Outlook auch bereits geöffnet, weil Sie es über die Benutzeroberfläche gestartet haben. In diesem Fall können Sie auch auf die bestehende Outlook-Instanz zugreifen. Für den Zugriff auf die Outlook-Instanz erstellen wir uns eine kleine Funktion. Diese legt den Verweis auf die Outlook-Instanz direkt in einer Objektvariablen ab, sodass wir beim nächsten Zugriff auf Outlook innerhalb dieser Session nicht nochmal eine neue Outlook-Instanz starten oder eine vorhandene Instanz referenzieren müssen. Diese Funktion legen wir in einem Standardmodul des VBA-Projekts der Beispieldatenbank an. Die Funktion verwendet eine private Variable im gleichen Modul, in dem wir den Verweis speichern, nachdem wir diesen geholt haben:
Private m_Outlook As Outlook.Application
Die folgende Funktion heißt GetOutlook und soll ein Objekt des Typs Outlook.Application zurückliefern. Dazu prüft sie zunächst, ob nicht von einem vorherigen Aufruf noch eine Outlook-Instanz vorhanden ist und durch die Variable m_Outlook referenziert wird. Dazu prüfen wir, ob m_Outlook gleich Nothing ist:
Public Function GetOutlook() As Outlook.Application If m_Outlook Is Nothing Then Set m_Outlook = New Outlook.Application
Anderenfalls prüfen wir bei deaktivierter Fehlerbehandlung, ob m_Outlook tatsächlich auf eine gültige Outlook-Instanz verweist. Das finden wir ganz einfach heraus, indem wir den Inhalt der Eigenschaft Name prüfen. Warum prüfen wir den Namen, auch wenn wir schon wissen, dass m_Outlook nicht den Wert Nothing enthält Weil es sein kann, dass wir mit Access eine Referenz auf eine Outlook-Instanz holen, die der Benutzer zuvor schon geöffnet hat. Wir referenzieren dann also die bereits geöffnete Outlook-Instanz. Wenn der Benutzer diese dann schließt, bekommen wir das unter VBA nicht direkt mit. Erst, wenn wir dann prüfen, ob der Zugriff auf eine der Eigenschaften, hier Name, ohne Fehler funktioniert, können wir sicher sein, dass unsere Objektvariable auf eine noch aktive Outlook-Instanz verweist. Falls das nicht der Fall ist, erstellen wir schließlich eine neue Instanz und referenzieren diese wiederum mit m_Outlook:
Else On Error Resume Next If Len(m_Outlook.Name) = 0 Then Set m_Outlook = New Outlook.Application End If On Error GoTo 0 End If
Im letzten Schritt geben wir die in m_Outlook enthaltene Instanz als Ergebnis der Funktion zurück:
Set GetOutlook = m_Outlook End Function
Wir können nun mit der folgenden Anweisung auf die Outlook-Instanz zugreifen, die wir beispielsweise im Direktbereich des VBA-Editors absetzen:
GetOutlook.Name Outlook
Namespace-Objekt verfügbar machen
Nachdem wir einen einfachen Zugang zu einer bestehenden oder neu erstellten Outlook-Instanz geholt haben, können wir immer noch nicht auf die Outlook-Termine zugreifen. Dazu benötigen wir das NameSpace-Objekt, das wir über die Methode GetNameSpace des Outlook-Objekts holen. Auch dafür deklarieren wir eine private Variable:
Private m_MAPINameSpace As Outlook.NameSpace
Die folgende Funktion soll ein Objekt des Typs Outlook.NameSpace zurückliefern. Auch hier prüfen wir wieder, ob die Variable m_MAPINameSpace nicht vo einem vorherigen Aufruf noch eine Verweis auf das MAPI-Namespace enthält. Ist das nicht der Fall, holen wir dieses erneut, indem wir mit Get-Outlook eine Outlook-Instanz holen und dann mit GetNameSpace(“MAPI”) das MAPI-Namespace von Outlook ermitteln:
Public Function GetMAPINamespace() As Outlook.NameSpace If m_MAPINamespace Is Nothing Then Set m_MAPINamespace = _ GetOutlook.GetNamespace("MAPI") End If
Diesen legen wir dann als Funktionsergebnis fest:
Set GetMAPINamespace = m_MAPINamespace End Function
Beispiel: Termin-Ordner referenzieren
Angenommen, wir wollen den Terminordner von Outlook referenzieren. Die Ordner von Outlook erhalten wir am einfachsten über die Funktion GetDefaultFolder, für die es einige Konstanten gibt, mit denen Sie angeben, welchen Standardordner Sie holen möchten. Die folgende Vorgehensweise kennen Sie schon: Wir legen eine private Variable an, die wir dann in einer Funktion füllen und damit zur Verfügung stellen. Diesmal hat die Variable den Typ Outlook.Folder:
Private m_CalendarFolder As Outlook.Folder
Die Funktion prüft wieder, ob wir bereits einen Folder des Typs olFolderCalendar referenziert haben und referenziert diesen gegebenfalls neu. Dabei verwendet sie die Funktion GetMAPINamespace, welche die Funktion GetOutlook nutzt. Auf diese Weise haben wir tollen wiederverwendbaren Code für unseren Zweck erzeugt:
Public Function GetCalendarFolder() As Outlook.Folder If m_CalendarFolder Is Nothing Then Set m_CalendarFolder = _ GetMAPINamespace.GetDefaultFolder(olFolderCalendar) End If Set GetCalendarFolder = m_CalendarFolder End Function
Es gibt übrigens die folgenden Konstanten, um mit GetDefaultFolder auf die verschiebenen Standardordner zuzugreifen:
- olFolderCalendar (9)
- olFolderContacts (10)
- olFolderDeletedItems (3)
- olFolderDrafts (16)
- olFolderInbox (6)
- olFolderJournal (11)
- olFolderJunk (23)
- olFolderNotes (12)
- olFolderOutbox (4)
- olFolderSentMail (5)
Andere Kalender als den Standardkalender referenzieren
Gegebenenfalls verwenden Sie nicht den Standard-Kalender von Outlook, sondern einen anderen Kalender – beispielsweise einen iCloud-Kalender oder einen Exchange-Kalender. Diesen können Sie nicht mit der GetDefaultFolder-Funktion referenzieren, sondern wir greifen beispielsweise über einen Dialog auf diesen Kalender zu.
Auch dies verpacken wir wieder eine Funktion, die Sie in Listing 1 sehen. Wir verwenden die Variable m_CalendarFolder von der vorherigen Funktion. Hier prüfen wir wieder, ob m_CalendarFolder bereits gefüllt ist. Falls ja, wollen wir dem Benutzer die Wahl lassen, ob er wirklich einen neuen Ordner wählen oder den vorhandenen weiter nutzen möchte.
Public Function PickCalendarFolder() As Outlook.Folder Dim bolPickNewFolder As Boolean If Not m_CalendarFolder Is Nothing Then If MsgBox("Aktueller Kalender: '" & m_CalendarFolder.Name & "'" & vbCrLf & "Anderen Kalender auswählen", vbYesNo) _ = vbYes Then bolPickNewFolder = True End If Else bolPickNewFolder = True End If If bolPickNewFolder = True Then Set m_CalendarFolder = GetMAPINamespace.PickFolder End If Set PickCalendarFolder = m_CalendarFolder End Function
Listing 1: Prozedur zum Auswählen eines Ordners
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: