Outlook-Termine nach Access

Outlook-Termine, die man über verschiedene Clients pflegt, möchte man vielleicht später einmal nach Access exportieren, um diese dort beispielsweise für die Erfassung der Projektzeiten beim Kunden heranzuziehen. Dafür gibt es verschiedene Methoden. Outlook selbst bietet einen Export an, mit dessen Ergebnis Sie arbeiten können. Oder Sie greifen direkt von Access aus per VBA auf das Objektmodell von Outlook zu, um die Termine Stück für Stück einzulesen. Dieser Beitrag zeigt, was es dabei zu beachten gibt und wie Sie auch benutzerdefinierte Felder in Terminen einlesen können.

Export per Bordmittel

Als Erstes schauen wir uns die Bordmittel zum Exportieren von Outlook-Terminen an, denn wir wollen ja keine aufwendige Access-Programmierung starten, wenn es auch einfach geht.

Den notwendigen Befehl finden Sie in Outlook 2016 im Backstage-Bereich unter Öffnen und Exportieren. Die benötigte Schaltfläche heißt Importieren/Exportieren (siehe Bild 1).

Befehl zum Exportieren von Outlook-Daten

Bild 1: Befehl zum Exportieren von Outlook-Daten

Nachdem wir diese Taste betätigt haben, finden wir den Dialog Import/Export-Assistent vor.

Dieser bietet nur einen für uns interessanten Eintrag in der Liste der Aktionen an, nämlich In Datei exportieren (siehe Bild 2).

Import- und Export-Möglichkeiten

Bild 2: Import- und Export-Möglichkeiten

Der nach der Auswahl von In Datei exportieren und dem Betätigen der Weiter-Schaltfläche angezeigte Dialog bietet wiederum zwei Möglichkeiten an:

  • Durch Trennzeichen getrennte Werte und
  • Outlook-Datendatei (.pst).

Hier wählen wir den Eintrag Durch Trennzeichen getrennte Werte aus und klicken wiederum auf Weiter (siehe Bild 3).

Export in eine Liste mit Trennzeichen

Bild 3: Export in eine Liste mit Trennzeichen

Das öffnet die nächste Seite des Dialogs und wir finden die Ordnerstruktur von Outlook vor (siehe Bild 4). Hier suchen wir nach dem Ordner Kalender und markieren diesen, bevor wir zum nächsten Schritt wechseln.

Export der Kalenderdaten

Bild 4: Export der Kalenderdaten

Hier legen wir fest, in welche Datei die Termindaten exportiert werden sollen. Dazu geben Sie entweder Pfad und Datei ein oder wählen diese mit dem Dialog aus, den Sie über die Durchsuchen…-Schaltfläche öffnen können (siehe Bild 5).

Angabe der Exportdatei

Bild 5: Angabe der Exportdatei

Danach wird es interessanter: Im nun erscheinenden Übersichtsdialog öffnen Sie über die Schaltlfäche Benutzerdefinierte Felder zuordnen einen weiteren Dialog namens Benutzerdefinierte Felder zuordnen öffnen.

Hier können Sie festlegen, welche der Felder überhaupt exportiert werden sollen und mit welcher Spaltenüberschrift diese versehen werden sollen (siehe Bild 6).

Zuordnen der Felder an die Spalten der Exportdatei

Bild 6: Zuordnen der Felder an die Spalten der Exportdatei

Haben Sie diese Liste nach Ihren Wünschen bearbeitet, schließen Sie den Dialog wieder und führen den Export mit einem Klick auf die Schaltfläche Fertigstellen aus.

Danach erscheint noch ein abschließender Dialog namens Zeitraum festlegen (siehe Bild 7). Hier können Sie den vom Export vorgeschlagenen Zeitraum anpassen. Außerdem erhalten Sie hier den Hinweis, dass von Termin- und Aufgabenserien, die in diesen Zeitraum fallen, nur die Termine dieses Zeitraums berücksichtigt werden.

Festlegen des Zeitraums

Bild 7: Festlegen des Zeitraums

Danach geht der Export endlich los und Sie können den Fortschritt im Dialog aus Bild 8 verfolgen.

Exportfortschritt

Bild 8: Exportfortschritt

Danach schauen wir uns die Export-Datei direkt in Excel an. Bild 9 zeigt nur zwei Termine an, die so aus Outlook in die .csv-Datei exportiert wurden.

Export von zwei Terminen

Bild 9: Export von zwei Terminen

Die erste Zeile enthält die Spaltenüberschriften, die zweite den ersten Termin, die folgenden Zeilen den zweiten Termin. Dieser erstreckt sich über mehrere Zeilen, weil der Inhalt des Feldes Beschreibung mit Text gefüllt ist. Dies ist der Fall, wenn ein Termin erstellt wurde, indem der Benutzer eine Aufgabe in den Kalender gezogen hat.

Analyse des Ergebnisses

Wenn wir uns das Ergebnis anschauen, finden wir ein paar Nachteile vor. Der erste ist, dass wir unter anderem Termine haben, die mehrere Zeilen in Beschlag nehmen. Der zweite ist, dass wir hier sicher nicht alle Eigenschaften vorfinden, die ein Termin hat – zumindest die benutzerdefinierten Eigenschaften wurden nicht mitexportiert.

Zusammenfassend scheint es also praktischer zu sein, direkt per VBA auf die Termine und ihre Eigenschaften zuzugreifen.

Zugriff per VBA

Um von einer Access-Datenbank auf Outlook zuzugreifen, benötigen wir einen Verweis auf die entsprechende Objektbibliothek. Diese binden wir im VBA-Editor über den Menüeintrag Extras|Verweise ein, der den Dialog Verweise öffnet. Hier wählen wir den Eintrag Microsoft Outlook 16.0 Object Library aus (für Office 2016 – sonst wählen Sie die verfügbare Version für die aktuelle Office-Installation). Das Ergebnis sieht dann im Verweise-Dialog wie in Bild 10 aus.

Verweis auf die Outlook-Bibliothek

Bild 10: Verweis auf die Outlook-Bibliothek

Outlook referenzieren

Als Erstes benötigen wir eine Objektvariable, mit der wir die geöffnete Outlook-Instanz referenzieren oder eine neue erstellen. Das realisieren wir, indem wir zunächst eine privat deklarierte Objektvariable in einem neuen Standardformular anlegen:

Private m_Outlook As Outlook.Application

Diese füllen wir mit der Funktion GetOutlook. Sie prüft, ob m_Outlook den Wert Nothing enthält. Falls ja, wird m_Outlook mit einer mit dem New-Schlüsselwort erzeugten neuen Instanz gefüllt. Danach liefert GetOutlook den Wert von m_Outlook als Funktionswert zurück. Damit braucht m_Outlook nur beim ersten Aufruf gefüllt zu werden und die Funktion kann bei folgenden Aufrufen auf die bereits existierende Instanz zugreifen:

Public Function GetOutlook() As Outlook.Application
     If m_Outlook Is Nothing Then
         Set m_Outlook = New Outlook.Application
     End If
     Set GetOutlook = m_Outlook
End Function

Das New-Schlüsselwort holt übrigens nur eine neue Outlook-Instanz, wenn keine Instanz läuft.

Dies kann zum Beispiel in dem Fall schiefgehen, wenn eine Outlook-Instanz durch den Benutzer geöffnet wurde, die obige Prozedur m_Outlook mit einem Verweis auf diese Instanz füllt, der Benutzer Outlook über die Benutzeroberfläche schließt und GetOutlook dann nochmals auf m_Outlook zugreift.

In diesem Fall löst der Zugriff auf eine der Eigenschaften des Outlook-Application-Objekts den Fehler aus Bild 11 aus, weil die Objektvariable ein ungültiges Objekt enthält.

Fehler beim Zugriff auf eine leere Objektvariable

Bild 11: Fehler beim Zugriff auf eine leere Objektvariable

Also erweitern wir die Funktion ein wenig:

Public Function GetOutlook() As Outlook.Application
     Dim strDummy As String
     If m_Outlook Is Nothing Then
         Set m_Outlook = New Outlook.Application
     End If
     On Error Resume Next
     strDummy = m_Outlook.Name
     If Not Err.Number = 0 Then
         Set m_Outlook = New Outlook.Application
     End If
     On Error GoTo 0
     Set GetOutlook = m_Outlook
End Function

Hier versuchen wir nun, bei deaktivierter Fehlerbehandlung auf die Eigenschaft Name von m_Outlook zuzugreifen. Wenn m_Outlook zu diesem Zeitpunkt nicht korrekt gefüllt, löst dies einen Fehler aus, den wir mir der folgenden If…Then-Bedingung abfragen und m_Outlook gegebenenfalls mit einer neuen Outlook-Instanz füllen.

Ordner mit Terminen referenzieren

Danach benötigen wir Zugriff auf den Ordner mit den Terminen. Wie bekommen wir diesen Dazu gibt es mehrere Möglichkeiten. Die gängigste ist, den Standardordner für die Termine aufzurufen. Das gelingt mit der folgenden Funktion:

Public Function GetDefaultCalendar() As Outlook.Folder
     Dim objMAPI As Outlook.NameSpace
     Dim objFolder As Outlook.Folder
     Set objMAPI = GetOutlook.GetNamespace("MAPI")
     Set objFolder =  objMAPI.GetDefaultFolder(olFolderCalendar)
     Set GetDefaultCalendar = objFolder
End Function

Hier holen wir erst den MAPI-Namespace über die GetNamespace-Methode des mit GetOutlook referenzierten Outlook.Application-Objekts und referenzieren diesen mit der Variablen objMAPI. Dann verwenden wir dessen Funktion GetDefaultFolder mit dem Parameter olFolderCalendar. Die Funktion gibt das erhaltene Objekt dann als Verweis des Typs Outlook.Folder an die aufrufende Anweisung zurück.

Damit können Sie nun beispielsweise den Pfad zu diesem Ordner innerhalb von Outlook mit folgender Anweisung ausgeben:

  GetDefaultCalendar.FolderPath
OutlookKalender

In einer aufrufenden Prozedur können wir den Verweis auf dieses Folder-Objekt nun auch in einer Objektvariablen speichern und dann weiter damit arbeiten:

Public Function AppointmentsLesen()
     Dim objAppointments As Outlook.Folder
     Set objAppointments = GetDefaultCalendar
     Debug.Print objAppointments.FolderPath
End Function

Ordner selbst auswählen

Sie können dem Benutzer auch die Möglichkeit geben, einen anderen Ordner als Kalenderordner auszuwählen. Das ist beispielsweise sinnvoll, wenn die zu untersuchenden Termine sich nicht im Standardordner befinden, sondern in einem anderen Termin-Ordner.

Die folgende Funktion öffnet einen entsprechenden Dialog:

Public Function GetCalenderFolder() As Outlook.Folder
     Dim objMAPI As Outlook.NameSpace
     Dim objFolder As Outlook.Folder
     Set objMAPI = GetOutlook.GetNamespace("MAPI")
     Set objFolder = objMAPI.PickFolder
     Set GetCalenderFolder = objFolder
End Function

Hier nutzen wir die Funktion PickFolder, um den Dialog zum Öffnen des Dialogs Ordner auswählen (siehe Bild 12).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar