Im Beitrag “Outlook-Folder in Access anzeigen” haben wir gezeigt, wie Sie das Outlook View Control in ein Formular integrieren, um damit die Ordner von Outlook anzuzeigen. Im vorliegenden Beitrag bauen wir auf den dort vorgestellten Techniken auf und gehen genauer auf den Umgang mit dem E-Mail-Ordnern ein. Dabei wollen wir Details wie den Betreff, den Inhalt oder den Empfänger oder Absender der aktuell markierten E-Mail in entsprechenden Steuerelementen anzeigen. Außerdem wollen wir die Anzeige der Outlook-Ordner in ein TreeView-Steuerelement verlagern.
Das Outlook View Control ist eine tolle Erweiterung, wenn Sie beispielsweise die Outlook-Ordner zur Anzeige von E-Mails wie Posteingang, Postausgang, Gesendete Elemente oder auch benutzerdefinierte Ordner in einer Access-Anwendung anzeigen wollen.
Das Outlook View Control können Sie jedoch nicht einfach zu einem Access-Formular hinzufügen, sondern Sie müssen es in ein Frame-Steuerelement einbetten. Wie das gelingt, zeigen wir im Beitrag Outlook-Folder in Access anzeigen (www.access-im-unternehmen.de/****).
In diesem Beitrag haben wir gezeigt, wie Sie die Outlook-Ordner in ein Listenfeld einlesen und ihre Inhalte durch Anklicken des jeweiligen Listeneintrags im Outlook View Control anzeigen.
Da die Anzeige in einem Listenfeld wenig professionell aussieht, haben wir in einem weiteren Beitrag namens TreeView für Outlook-Ordner ein TreeView-Steuerelement zum Formular hinzugefügt, das alle Ordner mit E-Mails anzeigt (www.access-im-unternehmen.de/****). Der Zwischenstand nach diesem Beitrag sieht wie in Bild 1 aus.
Bild 1: Outlook-Ordner und der Inhalt eines E-Mail-Ordners
Damit kommen wir zum Ziel des vorliegenden Beitrags. Hier wollen wir die übrigen Elemente, die für den Umgang mit E-Mails notwendig sind, hinzufügen. Dazu gehören die folgenden:
- Gewählten Ordner aus dem TreeView-Steuerelement im Outlook View Control anzeigen
- Zuletzt angezeigten Ordner speichern und wiederherstellen
- Inhalt der aktuell markierten E-Mail anzeigen (Absender, Empfänger, Betreff, Inhalt, Eingangsdatum)
- Empfangen von E-Mails
- Erstellen einer neuen E-Mail im Outlook-Inspektor
- Öffnen einer E-Mail mit dem dazugehörigen Outlook-Inspektor
- Löschen von E-Mails
Gewählten Ordner im Outlook View Control anzeigen
Das Formluar frmEMailDetails enthält das TreeView-Steuerelement namens ctlTreeView sowie ein Frame-Objekt und ein ViewCtl-Objekt. Das ViewCtl-Objekt ist in das Frame-Objekt eingebettet.
Das Frame– und das ViewCtl-Objekt deklarieren wir im Kopf des Klassenmoduls des Formulars wie folgt:
Private objFrame As Frame Private WithEvents objView As ViewCtl
In der beim Laden des Formulars ausgelösten Prozedur Form_Load ini-tialisieren wir das TreeView-Steuerelement (siehe Beitrag TreeView für Outlook-Ordner) und weisen den beiden Variablen die Elemente zu:
Private Sub Form_Load() InitializeTreeView Set objFrame = Me!ctlFrame.Object Set objView = objFrame.Controls(0) End Sub
Nun wollen wir dafür sorgen, dass der vom Benutzer im TreeView-Steuerelement angeklickte Ordner im Outlook View Control angezeigt wird. Dazu legen wir eine Ereignisprozedur an, die beim Anklicken eines der Elemente des TreeView-Steuerelements ausgelöst wird:
Private Sub ctlTreeView_NodeClick(ByVal Node As Object) Dim objNode As MSComctlLib.Node Set objNode = Node objView.Folder = objNode.Key End Sub
Das wir das mit dem Parameter Node übergebene Node-Objekt noch einer Variablen des Typs MSComctlLib.Node zuweisen, liegt daran, dass wir so die IntelliSense-Funktion für diese Variable nutzen können. So können wir den in der Key-Eigenschaft des Node-Elements gespeicherten Outlook-Pfad wie zum Beispiel \\Outlook\Posteingang nutzen und diesen der Folder-Eigenschaft des Outlook View Control-Steuerelements zuweisen.
Zuletzt gewählten Ordner speichern und beim Öffnen wiederherstellen
Nun, da das Outlook View Control den Outlook-Ordner anzeigt, den der Benutzer im TreeView-Steuerelement ausgewählt hat, wollen wir diesen auch speichern, damit dieser beim nächsten Öffnen auch wieder angezeigt werden kann. Dazu legen wir eine Optionen-Tabelle namens tblOptions an. Diese soll lediglich zwei Felder enthalten – ein Primärschlüsselfeld namens OptionID und ein Textfeld namens CurrentMailfolder. Den Entwurf dieser Tabelle zeigen wir in Bild 2.
Bild 2: Tabelle zum Speichern von Optionen
Wann speichern wir den zuletzt gewählten Outlook-Ordner in der Optionen-Tabelle Am sichersten ist es, diesen nach jeder Auswahl erneut zu speichern. Wir können den Speichervorgang also direkt in die oben vorgestellte Ereignisprozedur integrieren, die beim Anklicken eines der Node-Elemente im TreeView-Steuerelement ausgelöst wird. Diese erweitern wir um den Aufruf einer Prozedur namens SaveCurrentMailfolder, der wir den Pfad zum angeklickten Ordner als Parameter übergeben:
Private Sub ctlTreeView_NodeClick(ByVal Node As Object) ... SaveCurrentMailFolder objNode.Key End Sub
Die Prozedur SaveCurrentMailfolder finden Sie in Listing 1. Sie nimmt mit dem Parameter strFolder den zuletzt aufgerufenen Ordner entgegen. Dann führt sie eine UPDATE-Abfrage aus, die das Feld CurrentMailfolder der Tabelle tblOptions auf den übergebenen Wert einstellt. Es kann sein, dass die Tabelle leer ist, weil Sie diese beispielsweise vor dem Weitergeben an einen Benutzer geleert haben. In diesem Fall liefert die folgende Abfrage der von der UPDATE-Abfrage betroffenen Datensätze den Wert 0. In dem dann ausgelösten Zweig der If…Then-Bedingung legen wir diesen Datensatz dann einfach neu an und weisen dem Feld CurrentMailfolder den Wert aus strFolder zu.
Private Sub SaveCurrentMailfolder(strFolder As String) Dim db As DAO.Database Set db = CurrentDb db.Execute "UPDATE tblOptions SET CurrentMailfolder = ''" & strFolder & "''", dbFailOnError If db.RecordsAffected = 0 Then db.Execute "INSERT INTO tblOptions(CurrentMailfolder) VALUES(''" & strFolder & "'')", dbFailOnError End If End Sub
Listing 1: Prozedur zum Speichern des aktuell gewählten Mail-Ordners
Nach dem Speichern des Wertes sieht die Tabelle tblOptions beispielsweise wie in Bild 3 aus.
Bild 3: Zuletzt verwendeter Ordner in der Tabelle tblOptions
Zuletzt gewählten Ordner beim Öffnen markieren und anzeigen
Die so gespeicherte Information wollen wir natürlich beim nächsten Öffnen des Formulars nutzen, indem wir den entsprechenden Eintrag im TreeView-Steuerelement selektieren und im Outlook View Control den passenden Ordner anzeigen. Dazu legen wir eine neue Prozedur namens SetCurrentMailfolder an, den wir in der Prozedur Form_Load beim Laden des Formulars aufrufen:
Private Sub Form_Load() ... SetCurrentMailfolder End Sub
Diese Prozedur liefert Listing 2. Die Prozedur ermittelt zunächst den Wert des Feldes CurrentMailFolder aus der Tabelle tblOptions und schreibt diesen in die Variable strFolder. Wenn noch kein Eintrag in dieser Tabelle vorliegt oder das Feld leer ist, sorgt die Nz-Funktion dafür, dass strFolder mit einer leeren Zeichenkette gefüllt wird.
Private Sub SetCurrentMailfolder() Dim strFolder As String Dim objTreeView As MSComctlLib.TreeView strFolder = Nz(DLookup("CurrentMailfolder", "tblOptions"), "") If Len(strFolder) = 0 Then strFolder = GetDefaultFolder(olFolderInbox) End If objView.Folder = strFolder Set objTreeView = ctlTreeView.Object objTreeView.SelectedItem = objTreeView.Nodes(strFolder) Me!ctlTreeView.SetFocus End Sub
Listing 2: Prozedur zum Auswählen des zuletzt betrachteten E-Mail-Ordners
Die folgende If…Then-Bedingung prüft, ob strFolder eine leere Zeichenkette enthält und somit kein zuletzt geöffneter E-Mail-Ordner in der Tabelle tblOptions vorliegt. In diesem Fall füllt sie strFolder mit dem Ergebnis der Funktion GetDefaultFolder. Diese finden Sie in Listing 3.
Private Function GetDefaultFolder(intFolder As Outlook.OlDefaultFolders) As String Dim objOutlook As Outlook.Application Dim objNamespace As Outlook.Namespace Dim objFolder As Outlook.Folder Set objOutlook = New Outlook.Application Set objNamespace = objOutlook.GetNamespace("MAPI") Set objFolder = objNamespace.GetDefaultFolder(intFolder) GetDefaultFolder = objFolder.FolderPath End Function
Listing 3: Funktion zum Ermitteln eines Standardordners
GetDefaultFolder erwartet eine der Konstanten der Auflistung Outlook.OlDefaultFolders als Parameter. Es gibt bereits eine Methode namens GetDefaultFolder, die zum Namespace-Objekt gehört. Um dieses zu referenzieren, benötigen wir zuvor noch ein Outlook.Application-Objekt. Die von uns definierte Funktion GetDefaultFolder vereinfacht den Zugriff auf einen der Standardordner von Outlook, indem es das Erstellen einer Instanz von Outlook.Application und das Zuweisen des MAPI-Namespace an die Variable objNamespace kapselt und das Folder-Objekt ermittelt, das dem Parameter intFolder entspricht, also beispielsweise olFolderInbox für den Posteingang. Die Funktion GetDefaultFolder gibt schließlich den Pfad zu dem angegebenen Ordner zurück.
Dadurch, dass wir den Parameter mit dem Typ Outlook.OlDefaultFolders deklarieren, können wir beim Aufruf per IntelliSense aus der Liste der verfügbaren Werte auswählen (siehe Bild 4).
Bild 4: Auswahl des gewünschten Standardordners per IntelliSense
Diesen nimmt die Prozedur SetCurrentMailFolder entgegen und speichert ihn in der Variablen strFolder. Damit stellt sie nun zunächst die Folder-Eigenschaft des Outlook View Controls ein. Danach referenziert sie das TreeView-Steuerelement mit der Variablen objTreeView und stellt die Eigenschaft SelectedItem auf das Node-Element ein, dass die Nodes-Auflistung für den als Parameter verwenden Wert aus strFolder (zum Beispiel \\Outlook\Posteingang) liefert.
Schließlich wird der Fokus auf das TreeView-Steuerelement verschoben, damit der Benutzer direkt den selektierten Ordner erkennen kann.
Müssen wir die übergeordneten Ordner aufklappen, damit der markierte Eintrag sichtbar wird Es kann ja auch sein, dass der Benutzer einen Ordner auswählt und dann alle Ordner einklappt, sodass der gewählte Ordner nicht mehr im TreeView-Steuerelement sichtbar ist. Hier besteht kein Grund zur Sorge: Das TreeView-Steuerelement klappt automatisch alle Elemente bis zum aktuell selektierten Element auf.
Ich bekomme andauernd den Laufzeitfehler 91 und 462.
Muss da noch speziell was konfiguriert werden?
(Windows 10×64, Office 365, Datenbank plain kopiert und gestartet).
Gegebenenfalls müssen Sie in diesem Fall das Outlook View Control auf Ihrem System erneut einfügen wie im Artikel https://access-im-unternehmen.de/OutlookFolder_in_Access_anzeigen/ beschrieben.