Wenn Sie Outlook mit automatischen Funktionen ausstatten, die einen Zugriff auf eine Datenbankanwendung erfordern (in unserem Fall meist auf eine Access-Datenbank), dann müssen Sie irgendwo den Pfad der Datenbankdatei hinterlegen. Dies könnte man vorübergehend statisch in einem Code-Modul erledigen, aber für professionelle Anwendungszwecke sollte dieser Pfad nicht nur geändert werden können, sondern auch an einem anderen Ort gespeichert werden.
In einigen Beiträgen in Access im Unternehmen haben wir bereits von Outlook aus auf eine Access-Datenbank zugegriffen – zum Beispiel in der Projektzeiterfassung. Hier haben wir den Pfad dann schlicht in eine Konstante eingetragen, wie in folgendem Beispiel:
Public Const cStrDB As String = "C:\Users\AndreMinhorst\Dropbox\Daten\Accessprojekte\Projektzeiterfassung\Projektzeiterfassung.accdb"
Dies funktioniert allerdings nur so lange, wie die Datenbankdatei sich auch an dem angegebenen Ort befindet. Verschieben Sie diese Datei, tritt beim Zugriff auf diese Datei ein Fehler auf. Gleiches gilt natürlich, wenn ein Leser des entsprechenden Beitrags den Code einfach in sein eigenes Outlook-Modul kopiert und diesen ausgeführt hat – die Wahrscheinlichkeit, dass die Datenbankdatei beim Leser genau im gleichen Verzeichnis liegt wie beim Autor, ist relativ gering (wenn auch nicht gleich Null). Dennoch möchte ich hier eine professionellere Technik nutzen und den Pfad zur Datenbankdatei erstens an einem anderen Ort unterbringen und diesen zweitens vor dem Zugriff prüfen, damit der Benutzer den Pfad gegebenenfalls manuell selbst aktualisieren kann.
Benutzerdefinierte Einstellung speichern
Zum Speichern einer benutzerdefinierten Einstellung (und zuerst zum Anlegen einer solchen Eigenschaft) verwenden wir einen der Ordner von Outlook, der zum Profil des aktuell angemeldeten Benutzers gehört. Dabei treffen wir in der Regel mit dem Ordner Posteingang den richtigen Ordner. Für einen solchen Ordner können Sie ein sogenanntes StorageItem-Element anlegen. Dieses Element wird automatisch erstellt, wenn Sie es erstmalig mit der Methode GetStorage eines Folder-Objekts abrufen. Dabei übergeben Sie mit dem ersten Parameter den Namen des StorageItem-Elements und mit dem zweiten die Art, wie es identifiziert werden soll. Für ein StorageItem-Objekt können Sie über die Auflistung UserProperties auf benutzerdefinierte Eigenschaften zugreifen. Wir verarbeiten diese Erkenntnisse in einer Funktion namens EigenschaftSetzen, die Sie in Listing 1 finden. Die Funktion erwartet drei Parameter:
Public Sub EigenschaftSetzen(strElement As String, strName As String, strWert As String) Dim objMAPI As Outlook.NameSpace Dim objFolder As Outlook.Folder Dim objStorageItem As Outlook.StorageItem Dim objUserProperty As Outlook.UserProperty Set objMAPI = Outlook.GetNamespace("MAPI") Set objFolder = objMAPI.GetDefaultFolder(olFolderInbox) Set objStorageItem = objFolder.GetStorage(strElement, olIdentifyBySubject) Set objUserProperty = objStorageItem.UserProperties.Add(strName, olText) objUserProperty.Value = strWert objStorageItem.Save End Sub
Listing 1: Funktion zum Erstellen und Schreiben einer benutzerdefinierten Eigenschaft
- strElement: Name des StorageItem-Elements
- strName: Name der benutzerdefinierten Eigenschaft
- strWert: Wert der benutzerdefinierten Eigenschaft
Die Funktion erstellt zunächst ein NameSpace-Objekt namens objMapi und füllt es mit dem MAPI-Namespace. Dann referenziert es mit der Variablen objFolder den standardmäßig als Posteingang definierten Ordner. Nun ruft es die GetStorage-Methode des Folder-Objekts auf und übergibt diesem den in strElement gespeicherten Namen für das StorageItem-Element.
Außerdem legt es mit dem Wert olIdentifyBySubject für den zweiten Parameter fest, dass der erste Parameter den Namen des Elements enthält. Dieser Aufruf kann keinen Fehler verursachen, da das StorageItem-Element, sofern noch nicht vorhanden, mit diesem Aufruf erstellt wird. Die folgende Anweisung nutzt dann die Add-Methode der UserProperties-Auflistung des StorageItem-Objekts, um eine neue benutzerdefinierte Eigenschaft zum StorageItem-Objekt hinzuzufügen. Dabei übergibt sie mit dem ersten Parameter den Namen der benutzerdefinierten Eigenschaft und mit dem zweiten den Datentyp, in diesem Fall olText für eine Texteigenschaft. Die neue Eigenschaft referenziert die Prozedur mit der Variablen objUserProperty. Diese Objektvariable liefert dann mit der Eigenschaft Value die Möglichkeit, den Wert festzulegen – in diesem Fall mit dem Wert des Prozedurparameters strWert. Schließlich speichert die Prozedur die neue benutzerdefinierte Variable mit der Save-Methode des StorageItem-Elements. Um einen Datenbankpfad in der benutzerdefinierten Eigenschaft Datenbankpfad im StorageItem-Element Ticketsystem zu speichern, verwenden Sie etwa den folgenden Aufruf:
EigenschaftSetzen "Ticketsystem", "Datenbankpfad", "c:\Test\Beispieldatenbank.mdb"
Benutzerdefinierte Einstellung abrufen
Wenn Sie den Pfad zur Datei, beispielsweise zu einer Access-Datenbank, auf diese Weise mit dem Outlook-Ordner gespeichert haben, wollen Sie diesen auch bei Gelegenheit, etwa beim Start von Outlook, einlesen und verwenden. Dies erledigen wir mit der Funktion EigenschaftEinlesen aus Listing 2.
Public Function EigenschaftEinlesen(strElement As String, strName As String) As String Dim objMAPI As Outlook.NameSpace Dim objFolder As Outlook.Folder Dim objStorageItem As Outlook.StorageItem Dim objUserProperty As Outlook.UserProperty Set objMAPI = Outlook.GetNamespace("MAPI") Set objFolder = objMAPI.GetDefaultFolder(olFolderInbox) Set objStorageItem = objFolder.GetStorage(strElement, olIdentifyBySubject) Set objUserProperty = objStorageItem.UserProperties.Item(strName) If objUserProperty Is Nothing Then EigenschaftEinlesen = "" Else EigenschaftEinlesen = objUserProperty.Value End If End Function
Listing 2: Funktion zum Einlesen einer benutzerdefinierten Eigenschaft
Die Funktion erwartet zwei Parameter:
- strElement: Name des StorageItem-Elements
- strName: Name der Eigenschaft
Die Funktion referenziert wieder das MAPI-Namespace-Objekt mit der Variablen objMAPI und den Posteingangsordner mit der Variablen objFolder. Dann greift sie wieder mit der GetStorage-Methode auf das StorageItem-Element zu, das den mit dem Parameter strElement übergebenen Namen besitzt. Auch hier kann wieder kein Fehler auftreten, da das Objekt, soweit noch nicht vorhanden, in diesem Moment angelegt wird. Probleme können lediglich auftauchen, wenn die Funktion über die Item-Methode mit dem Namen der Eigenschaft als Parameter auf das gesuchte Element der UserProperties-Auflistung zugreift.
Sollte die Eigenschaft nämlich noch nicht angelegt worden sein, führt das anschließende Abrufen des Eigenschaftswertes mit der Value-Eigenschaft zu einem Fehler.
Dies können wir jedoch leicht verhindern, indem wir mit objUserProperty Is Nothing prüfen, ob die benutzerdefinierte Eigenschaft bereits angelegt wurde oder nicht. Nur in ersterem Fall tragen wir den Wert dieser Eigenschaft in die Rückgabevariable der Funktion ein, sonst eine leere Zeichenfolge.
Letzteres kann auch wegfallen, da der Standardwert für die String-Variable ohnehin eine leere Zeichenkette ist, aber der übersichtlichkeit halber haben wir diese beiden Zeilen im Code gelassen. Der folgende Aufruf würde nun beispielsweise den in der benutzerdefinierten Eigenschaft Datenbankpfad im StorageItem-Objekt Ticketsystem enthaltenen Wert im Direktbereich ausgeben:
Debug.Print EigenschaftEinlesen ("Ticketsystem", "Datenbankpfad")
Pfad manuell aktualisieren
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