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).
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).
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).
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.
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).
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).
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.
Bild 7: Festlegen des Zeitraums
Danach geht der Export endlich los und Sie können den Fortschritt im Dialog aus Bild 8 verfolgen.
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.
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.
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.
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