Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Greifen Sie auf einfache Weise auf Outlook-Objekte zu und synchronisieren Sie Termine zwischen Access und Outlook.

Techniken

Outlook, VBA

Voraussetzungen

Access 2000 und höher, Outlook 2000 und höher

Beispieldatei

OutlookTermine.mdb

Shortlink

439

Outlook-Termine im Griff

André Minhorst, Duisburg

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

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.

Am einfachsten demonstriert dies die folgende Routine, die alle vorhandenen Termine ausgibt:

Public Sub TermineAusgeben()

Dim objAppointment As Outlook.AppointmentItem

For Each objAppointment In _
GetAppointmentFolder.Items

Debug.Print objAppointment.Start, _
objAppointment.Subject

Next objAppointment

End Sub

Die Routine durchläuft in einer For Each-Schleife alle Elemente des Kalender-Ordners und gibt die Werte der Eigenschaften Start und Subject aus, was den beiden Feldern Beginnt um: und Betreff entspricht. Alle weiteren Eigenschaften lassen sich recht einfach per IntelliSense ermitteln. Beachten Sie, dass Outlook zunächst alle ganztägigen Termine (AllDayEvent = True) und erst dann die anderen Termine ausgibt und dann aufsteigend nach dem Datum sortiert.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.