Outlook-Folder im Griff

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.

Verweis auf die Outlook-Bibliothek

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:

Schreibe einen Kommentar