Outlook-Termine im Griff

Es gibt eine Menge Gründe, von Access aus auf die in Outlook eingetragenen Termine zuzugreifen. So könnte man Liefertermine aus der Bestellverwaltung nach Outlook exportieren oder die Termine aus Outlook in eine Access-Datenbank importieren, um dort schneller nach den enthaltenen Informationen zu suchen. Vielleicht mag man ja auch einfach einen Terminkalender in einem ganz individuellen Format ausdrucken, was in Outlook selbst nicht möglich ist. In diesem Beitrag erfahren Sie, wie Sie Termine zwischen Outlook und Access hin- und herschieben.

Verknüpfung mit Outlook

Die einfachste Möglichkeit, von Access aus auf die Termine von Outlook zuzugreifen, ist – so sollte man meinen – die Verknüpfung mit den passenden Daten von Outlook. Immerhin bietet der Verknüpfen-Dialog unter Datei/Externe Daten/Tabellen verknüpfen… die Möglichkeit, Outlook() als Datentyp auszuwählen und im nächsten Dialog (s. Abb. 1) den Kalender-Ordner auszuwählen. Der Inhalt der verknüpften Tabelle entspricht allerdings keinesfalls den Erwartungen: Die Tabelle enthält lediglich die Felder, die ein Termin mit einer E-Mail gemein hat. Damit wäre die Sackgasse für diesen Beitrag bereits gefunden, es folgt der zweite Anlauf per VBA.

pic001.tif

Abb. 1: Auswahl des Inhalts der zu verknüpfenden Tabelle

Zugriff per VBA

Outlook bietet wie alle Office-Anwendungen eine mächtige VBA-Schnittstelle, mit der sich praktisch alles automatisieren lässt. In diesem Fall ist es interessant, auf eine Auflistung oder ein ähnliches Konstrukt mit den Terminen als Inhalt zuzugreifen. Dazu benötigen Sie erstmal einen Objektverweis auf eine Outlook-Instanz, die Sie üblicherweise mit folgender Anweisung erstellen – natürlich nicht, ohne vorher eine passende Variable deklariert zu haben:

Dim objOutlook As Outlook.Application
Set objOutlook = _
CreateObject("Outlook.Application")

Bei anderen Office-Anwendungen wie Word oder Excel würden Sie zunächst versuchen, mit GetObject eine bestehende Instanz der Anwendung zu erhalten, dies ist bei Outlook allerdings nicht erforderlich: Outlook ist im Gegebensatz zu den anderen Anwendungen eine MultiUse-Anwendung, das heißt, dass es ohnehin nur jeweils eine Instanz pro Rechner gibt. Da dies im ungünstigen Fall – wenn nämlich kein Outlook auf dem Rechner installiert ist – zu einem Fehler führt, packen Sie diese Anweisung in eine Fehlerbehandlung ein und reagieren im Fehlerfall mit der Ausgabe einer entsprechenden Meldung:

Dim objOutlook As Outlook.Application
On Error Resume Next
Set objOutlook = _
CreateObject("Outlook.Application") If Err.Number = 429 Then MsgBox "Outlook ist nicht installiert." Exit Function End If

Globaler Instanzbau

Diese Zeilen kann man in jede Routine einbauen, die eine Outlook-Instanz benötigt, muss man aber nicht. Man kann die enthaltene Funktion auch in eine Property Get-Prozedur ausklammern und kann dann anwendungsweit auf die so erzeugte Eigenschaft zugreifen.

Diese Prozedur legen Sie am besten in einem separaten Modul an, in dem Sie weitere ähnliche Konstrukte unterbringen können. Im vorliegenden Fall sehen die Code sparenden Zeilen wie in Listing 1 aus.

Listing 1: Speichern und bereitstellen eines Outlook-Verweises als globale Eigenschaft

Private mOutlook As Outlook.Application
Public Property Get GetOutlook() As Outlook.Application
     If mOutlook Is Nothing Then
         On Error Resume Next
         Set mOutlook = CreateObject("Outlook.Application")
         If Err.Number = 429 Then
             MsgBox "Outlook ist nicht installiert."
             Exit Function
         End If
      End If
     Set GetOutlook = mOutlook
End Property

Die Variable mOutlook hält modulintern einen Verweis auf die Outlook-Instanz vor, soweit diese vorhanden ist. Die Property Get-Routine kann man wie eine Funktion aufrufen. Sie prüft, ob mOutlook einen gültigen Objektverweis enthält, und legt ihn, wenn dies nicht der Fall ist, mit den oben vorgestellten Zeilen an und weist ihn der Variablen mOutlook zu. Schließlich gibt die Property Get-Prozedur diesen Verweis zurück. Testen Sie dies, indem Sie einfach einmal den folgenden Aufruf im Direktfenster absetzen:

Debug.Print GetOutlook.Name

Erstens stellen Sie fest, dass GetOutlook bereits mit IntelliSense die verfügbaren Methoden und Eigenschaften des Outlook-Objekts liefert, und zweitens, dass der Aufruf einwandfrei funktioniert. Von jetzt an verwenden Sie also GetOutlook, wenn Sie einen Verweis auf eine Outlook-Instanz benötigen.

Namespace holen

Wenn Sie auf die unterschiedlichen in Outlook beziehungsweise in der .pst-Datei gespeicherten Objekte zugreifen möchten, brauchen Sie ein so genanntes NameSpace-Objekt. Dabei handelt es sich um ein abstraktes Objekt, das die für den Zugriff auf die Auflistungen und Elemente notwendigen Methoden und Eigenschaften zur Verfügung stellt. Der gewünschte Bereich heißt in diesem Fall MAPI und die Methode des Outlook-Objektmodells zum Holen eines solchen NameSpace heißt GetNamespace.

Auch für den vereinfachten Zugriff auf das NameSpace-Objekt schreiben Sie sich eine vereinfachende Property Get-Routine. Stellen Sie dazu in dem gleichen Modul, in dem sich auch die Routine zum Bereitstellen der Outlook-Instanz befindet, zunächst eine passende private Variable bereit (ohne Zeilenumbruch):

Private mNamespace As Outlook.NameSpace

Die Routine zum Holen des NameSpace-Objekts baut auf der zum Erzeugen der Outlook-Instanz auf und sieht wie folgt aus:

Public Property Get GetMAPINamespace() _
As Outlook.NameSpace If mNamespace Is Nothing Then Set objNamespace = _
GetOutlook.GetNamespace("MAPI") End If Set GetNamespace = mNamespace End Property

Da Sie mit dem NameSpace-Objekt direkt noch nicht viel anfangen können, setzen wir noch eines obendrauf und bauen eine Routine, mit der Sie einen Objektverweis auf den Kalender-Ordner von Outlook erzeugen können.

Das Spiel geht von vorne los und beginnt mit dem Anlegen einer Variablen:

Private mAppointmentFolder As Outlook.MAPIFolder

Und natürlich brauchen Sie auch noch eine Property Get-Routine, die prüft, ob es schon einen Verweis gibt, und gegebenenfalls einen neuen anlegt – wobei sie wie schon zuvor auf die GetMAPINameSpace-Eigenschaft und darüber auf die GetOutlook-Eigenschaft zugreift (s. Listing 2).

Listing 2: Speichern und bereitstellen des Outlook-Ordners mit den Terminen

Private mAppointmentFolder As Outlook.MAPIFolder 
Public Property Get GetAppointmentFolder() As Outlook.MAPIFolder
     If mAppointmentFolder Is Nothing Then
         Set mAppointmentFolder = GetMAPINamespace.GetDefaultFolder(olFolderCalendar)
     End If
     Set GetAppointmentFolder = mAppointmentFolder
End Property

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar