Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
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 (siehe Bild 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.
Bild 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
Die Routine verwendet dabei die GetDefaultFolder-Methode mit dem Argument olFolderCalendar, die immer einen Verweis auf den Kalender-Ordner zurückgibt.
Gegebenenfalls möchten Sie auf einen Unterordner des Hauptordners zugreifen. In diesem Fall verwenden Sie beispielsweise die folgende Syntax (in einer Zeile):
Get DefaultFolder(olFolderCalendar).Folders("MeineTermine")
Termine ausgeben
Nun haben Sie das Werkzeug an der Hand, um komfortabel auf die Termine von Outlook zuzugreifen.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo