{"id":55001030,"date":"2016-04-01T00:00:00","date_gmt":"2020-05-22T19:02:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1030"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Benutzerdefinierte_OutlookEigenschaften","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/","title":{"rendered":"Benutzerdefinierte Outlook-Eigenschaften"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie Outlook mit automatischen Funktionen ausstatten, die einen Zugriff auf eine Datenbankanwendung erfordern (in unserem Fall meist auf eine Access-Datenbank), dann m&uuml;ssen Sie irgendwo den Pfad der Datenbankdatei hinterlegen. Dies k&ouml;nnte man vor&uuml;bergehend statisch in einem Code-Modul erledigen, aber f&uuml;r professionelle Anwendungszwecke sollte dieser Pfad nicht nur ge&auml;ndert werden k&ouml;nnen, sondern auch an einem anderen Ort gespeichert werden.<\/b><\/p>\n<p>In einigen Beitr&auml;gen in Access im Unternehmen haben wir bereits von Outlook aus auf eine Access-Datenbank zugegriffen &#8211; zum Beispiel in der Projektzeiterfassung. Hier haben wir den Pfad dann schlicht in eine Konstante eingetragen, wie in folgendem Beispiel:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cStrDB<span style=\"color:blue;\"> As String<\/span> = \"C:\\Users\\AndreMinhorst\\Dropbox\\Daten\\Accessprojekte\\Projektzeiterfassung\\Projektzeiterfassung.accdb\"<\/pre>\n<p>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&uuml;rlich, wenn ein Leser des entsprechenden Beitrags den Code einfach in sein eigenes Outlook-Modul kopiert und diesen ausgef&uuml;hrt hat &#8211; 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&ouml;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&uuml;fen, damit der Benutzer den Pfad gegebenenfalls manuell selbst aktualisieren kann.<\/p>\n<h2>Benutzerdefinierte Einstellung speichern<\/h2>\n<p>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&ouml;rt. Dabei treffen wir in der Regel mit dem Ordner <b>Posteingang <\/b>den richtigen Ordner. F&uuml;r einen solchen Ordner k&ouml;nnen Sie ein sogenanntes <b>StorageItem<\/b>-Element anlegen. Dieses Element wird automatisch erstellt, wenn Sie es erstmalig mit der Methode <b>GetStorage <\/b>eines <b>Folder<\/b>-Objekts abrufen. Dabei &uuml;bergeben Sie mit dem ersten Parameter den Namen des <b>StorageItem<\/b>-Elements und mit dem zweiten die Art, wie es identifiziert werden soll. F&uuml;r ein <b>StorageItem<\/b>-Objekt k&ouml;nnen Sie &uuml;ber die Auflistung <b>UserProperties <\/b>auf benutzerdefinierte Eigenschaften zugreifen. Wir verarbeiten diese Erkenntnisse in einer Funktion namens <b>EigenschaftSetzen<\/b>, die Sie in Listing 1 finden. Die Funktion erwartet drei Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EigenschaftSetzen(strElement<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>, strWert<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMAPI<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objStorageItem<span style=\"color:blue;\"> As <\/span>Outlook.StorageItem\r\n     <span style=\"color:blue;\">Dim <\/span>objUserProperty<span style=\"color:blue;\"> As <\/span>Outlook.UserProperty\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = Outlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objFolder = objMAPI.GetDefaultFolder(olFolderInbox)\r\n     <span style=\"color:blue;\">Set<\/span> objStorageItem = objFolder.GetStorage(strElement, olIdentifyBySubject)\r\n     <span style=\"color:blue;\">Set<\/span> objUserProperty = objStorageItem.UserProperties.Add(strName, olText)\r\n     objUserProperty.Value = strWert\r\n     objStorageItem.Save\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Funktion zum Erstellen und Schreiben einer benutzerdefinierten Eigenschaft<\/span><\/b><\/p>\n<ul>\n<li><b>strElement<\/b>: Name des StorageItem-Elements<\/li>\n<li><b>strName<\/b>: Name der benutzerdefinierten Eigenschaft<\/li>\n<li><b>strWert<\/b>: Wert der benutzerdefinierten Eigenschaft<\/li>\n<\/ul>\n<p>Die Funktion erstellt zun&auml;chst ein <b>NameSpace<\/b>-Objekt namens <b>objMapi <\/b>und f&uuml;llt es mit dem MAPI-Namespace. Dann referenziert es mit der Variablen <b>objFolder <\/b>den standardm&auml;&szlig;ig als Posteingang definierten Ordner. Nun ruft es die <b>GetStorage<\/b>-Methode des <b>Folder<\/b>-Objekts auf und &uuml;bergibt diesem den in <b>strElement <\/b>gespeicherten Namen f&uuml;r das <b>StorageItem<\/b>-Element.<\/p>\n<p>Au&szlig;erdem legt es mit dem Wert <b>olIdentifyBySubject<\/b> f&uuml;r den zweiten Parameter fest, dass der erste Parameter den Namen des Elements enth&auml;lt. Dieser Aufruf kann keinen Fehler verursachen, da das <b>StorageItem<\/b>-Element, sofern noch nicht vorhanden, mit diesem Aufruf erstellt wird. Die folgende Anweisung nutzt dann die <b>Add<\/b>-Methode der <b>UserProperties<\/b>-Auflistung des <b>StorageItem<\/b>-Objekts, um eine neue benutzerdefinierte Eigenschaft zum <b>StorageItem<\/b>-Objekt hinzuzuf&uuml;gen. Dabei &uuml;bergibt sie mit dem ersten Parameter den Namen der benutzerdefinierten Eigenschaft und mit dem zweiten den Datentyp, in diesem Fall <b>olText <\/b>f&uuml;r eine Texteigenschaft. Die neue Eigenschaft referenziert die Prozedur mit der Variablen <b>objUserProperty<\/b>. Diese Objektvariable liefert dann mit der Eigenschaft <b>Value <\/b>die M&ouml;glichkeit, den Wert festzulegen &#8211; in diesem Fall mit dem Wert des Prozedurparameters <b>strWert<\/b>. Schlie&szlig;lich speichert die Prozedur die neue benutzerdefinierte Variable mit der <b>Save<\/b>-Methode des <b>StorageItem<\/b>-Elements. Um einen Datenbankpfad in der benutzerdefinierten Eigenschaft <b>Datenbankpfad <\/b>im <b>StorageItem<\/b>-Element <b>Ticketsystem <\/b>zu speichern, verwenden Sie etwa den folgenden Aufruf:<\/p>\n<pre>EigenschaftSetzen \"Ticketsystem\", \"Datenbankpfad\",  \"c:\\Test\\Beispieldatenbank.mdb\"<\/pre>\n<h2>Benutzerdefinierte Einstellung abrufen<\/h2>\n<p>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 <b>EigenschaftEinlesen <\/b>aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EigenschaftEinlesen(strElement<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objMAPI<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objStorageItem<span style=\"color:blue;\"> As <\/span>Outlook.StorageItem\r\n     <span style=\"color:blue;\">Dim <\/span>objUserProperty<span style=\"color:blue;\"> As <\/span>Outlook.UserProperty\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = Outlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objFolder = objMAPI.GetDefaultFolder(olFolderInbox)\r\n     <span style=\"color:blue;\">Set<\/span> objStorageItem = objFolder.GetStorage(strElement, olIdentifyBySubject)\r\n     <span style=\"color:blue;\">Set<\/span> objUserProperty = objStorageItem.UserProperties.Item(strName)\r\n     <span style=\"color:blue;\">If <\/span>objUserProperty Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         EigenschaftEinlesen = \"\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         EigenschaftEinlesen = objUserProperty.Value\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Einlesen einer benutzerdefinierten Eigenschaft<\/span><\/b><\/p>\n<p>Die Funktion erwartet zwei Parameter:<\/p>\n<ul>\n<li><b>strElement<\/b>: Name des <b>StorageItem<\/b>-Elements<\/li>\n<li><b>strName<\/b>: Name der Eigenschaft<\/li>\n<\/ul>\n<p>Die Funktion referenziert wieder das MAPI-Namespace-Objekt mit der Variablen <b>objMAPI <\/b>und den Posteingangsordner mit der Variablen <b>objFolder<\/b>. Dann greift sie wieder mit der <b>GetStorage<\/b>-Methode auf das <b>StorageItem<\/b>-Element zu, das den mit dem Parameter <b>strElement <\/b>&uuml;bergebenen Namen besitzt. Auch hier kann wieder kein Fehler auftreten, da das Objekt, soweit noch nicht vorhanden, in diesem Moment angelegt wird. Probleme k&ouml;nnen lediglich auftauchen, wenn die Funktion &uuml;ber die <b>Item<\/b>-Methode mit dem Namen der Eigenschaft als Parameter auf das gesuchte Element der <b>UserProperties<\/b>-Auflistung zugreift.<\/p>\n<p>Sollte die Eigenschaft n&auml;mlich noch nicht angelegt worden sein, f&uuml;hrt das anschlie&szlig;ende Abrufen des Eigenschaftswertes mit der <b>Value<\/b>-Eigenschaft zu einem Fehler.<\/p>\n<p>Dies k&ouml;nnen wir jedoch leicht verhindern, indem wir mit <b>objUserProperty Is Nothing <\/b>pr&uuml;fen, ob die benutzerdefinierte Eigenschaft bereits angelegt wurde oder nicht. Nur in ersterem Fall tragen wir den Wert dieser Eigenschaft in die R&uuml;ckgabevariable der Funktion ein, sonst eine leere Zeichenfolge.<\/p>\n<p>Letzteres kann auch wegfallen, da der Standardwert f&uuml;r die String-Variable ohnehin eine leere Zeichenkette ist, aber der &uuml;bersichtlichkeit halber haben wir diese beiden Zeilen im Code gelassen. Der folgende Aufruf w&uuml;rde nun beispielsweise den in der benutzerdefinierten Eigenschaft <b>Datenbankpfad <\/b>im <b>StorageItem<\/b>-Objekt <b>Ticketsystem <\/b>enthaltenen Wert im Direktbereich ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> EigenschaftEinlesen (\"Ticketsystem\",  \"Datenbankpfad\")<\/pre>\n<h2>Pfad manuell aktualisieren<\/h2>\n<p>Nun wollen wir noch Beispielcode entwickeln, der pr&uuml;ft, ob die in der Variablen gespeicherte Datenbankdatei tats&auml;chlich vorhanden ist. Ist dies nicht der Fall, soll dieser gleich einen <b>Datei &ouml;ffnen<\/b>-Dialog anzeigen, mit dem der Benutzer den aktuellen Ort der Datenbankdatei ausw&auml;hlen kann. Dazu nutzen wir eine universell nutzbare Funktion namens <b>DatenbankpfadHolen<\/b>, der wir wieder die folgenden beiden Parameter &uuml;bergeben:<\/p>\n<ul>\n<li><b>strElement<\/b>: Name des <b>StorageItem<\/b>-Elements, zum Beispiel <b>Ticketsystem<\/b><\/li>\n<li><b>strName<\/b>: Name der benutzerdefinierten Eigenschaft, zum Beispiel <b>Datenbankpfad<\/b><\/li>\n<\/ul>\n<p>Die Funktion versucht zun&auml;chst, mit der Funktion <b>EigenschaftEinlesen <\/b>den aktuellen Wert der Eigenschaft aus dem <b>StorageItem<\/b>-Element zu ermitteln, und speichert diesen im Erfolgsfall in der Variablen <b>strDatenbankpfad<\/b> (s. Listing 3). Die folgende verschachtelte <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft zun&auml;chst, ob die L&auml;nge des Inhalts von <b>strDatenbankpfad <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist. Nur in diesem Fall war &uuml;berhaupt ein Wert in der benutzerdefinierten Eigenschaft gespeichert. Dann kommt die innere Bedingung zum Zuge, die mit der <b>Dir<\/b>-Funktion pr&uuml;ft, ob die angegebene Datei &uuml;berhaupt existiert. Sind beide Bedingungen wahr, erh&auml;lt die Variable <b>bolVorhanden <\/b>den Wert <b>True<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DatenbankpfadHolen(strElement<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDatenbankpfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolVorhanden<span style=\"color:blue;\"> As Boolean<\/span>\r\n     strDatenbankpfad = EigenschaftEinlesen(strElement, strName)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strDatenbankpfad) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strDatenbankpfad)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             bolVorhanden = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolVorhanden<span style=\"color:blue;\"> Then<\/span>\r\n         strDatenbankpfad = OpenFileName(\"\", \"Datenbankpfad ausw&auml;hlen\", \"Access-DB (*.mdb;*.accdb)\")\r\n         EigenschaftSetzen strElement, strName, strDatenbankpfad\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     DatenbankpfadHolen = strDatenbankpfad\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Diese Funktion liefert den in einer benutzerdefinierten Eigenschaft gespeicherten Pfad oder zeigt einen Datei &ouml;ffnen-Dialog an.<\/span><\/b><\/p>\n<p>Diesen Ausdruck wertet die folgende <b>If&#8230;Then<\/b>-Bedingung aus. Wenn <b>bolVorhanden <\/b>hier den Wert <b>False <\/b>aufweist, ruft die Routine die Funktion <b>OpenFileName <\/b>auf, die einen <b>Datei &ouml;ffnen<\/b>-Dialog anzeigt und dem Benutzer die M&ouml;glichkeit bietet, die zu verwendende Datenbankdatei neu auszuw&auml;hlen. Das Ergebnis landet in der Variablen <b>strDatenbankpfad<\/b>. Die folgende Anweisung tr&auml;gt den neuen Datenbankpfad dann mit der Funktion <b>EigenschaftSetzen <\/b>in die benutzerdefinierte Eigenschaft des angegebenen <b>StorageItem<\/b>-Objekts von Outlook ein. So muss der Benutzer den Pfad beim n&auml;chsten Start nicht erneut ausw&auml;hlen. Schlie&szlig;lich wird der Inhalt von <b>strDatenbankpfad <\/b>noch als Funktionswert der Funktion <b>DatenbankpfadHolen <\/b>zur&uuml;ckgegeben.<\/p>\n<h2>Der Datei &ouml;ffnen-Dialog<\/h2>\n<p>Um unter Access einen <b>Datei &ouml;ffnen<\/b>-Dialog zu implementieren, gibt es verschiedene M&ouml;glichkeiten. Wir haben in den meisten Beitr&auml;gen von <b>Access im Unternehmen <\/b>die Variante gew&auml;hlt, bei der die versteckte Funktion <b>GetFileName <\/b>der <b>Wizhook<\/b>-Klasse zum Einsatz kommt. Das ist nat&uuml;rlich unter Outlook nicht m&ouml;glich, da die <b>Wizhook<\/b>-Klasse ja ein Element der Access-Objektbibliothek ist.<\/p>\n<p>Allerdings werden wir ja ohnehin einige Elemente von Access im Code des Outlook-Objektmodells nutzen wollen, wenn wir schon Access von Outlook aus fernsteuern wollen &#8211; beispielsweise, um Daten in die Tabellen der angegebenen Access-Datenbank zu schreiben. Also f&uuml;gen wir den entsprechenden Verweis auf die Bibliothek <b>Microsoft Access x.0 Object Library <\/b>wie in Bild 1 zum VBA-Projekt von Outlook hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1030_001.png\" alt=\"Verweis auf die Access-Bibliothek\" width=\"424,6255\" height=\"330,2643\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf die Access-Bibliothek<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir nun auch auf die <b>Wizhook<\/b>-Klasse und somit auf die davon bereitgestellte Methode <b>GetFileName <\/b>zugreifen. Die Funktion <b>OpenFileName <\/b>aus Listing 4 implementiert diese Methode und erwartet als Parameter das Startverzeichnis, den Titel f&uuml;r den Dialog sowie die zu verwendenden Filter bei der Anzeige der m&ouml;glichen Datentypen. Hierbei beschr&auml;nken wir uns mit dem Ausdruck <b>Access-DB (*.mdb;*.accdb)<\/b> auf Dateien der Typen <b>.mdb <\/b>und <b>.accdb<\/b>. Die <b>Wizhook<\/b>-Klasse hat die Besonderheit, dass man diese durch Setzen eines bestimmten Zahlenwertes f&uuml;r die Variable <b>Key <\/b>aktivieren muss. Davon abgesehen gibt es im Vergleich zu der Version der Funktion <b>OpenFileName<\/b>, die wir in Access nutzen k&ouml;nnen, eine kleine &auml;nderung: Der erste Parameter der Methode <b>GetFileName <\/b>soll n&auml;mlich den Wert <b>0 <\/b>erhalten und nicht das Handle des Access-Fensters.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>OpenFileName(<span style=\"color:blue;\">Optional<\/span> StartDir<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> sTitle<span style=\"color:blue;\"> As String<\/span> = \"Datei ausw&auml;hlen:\", _\r\n     <span style=\"color:blue;\">Optional<\/span> sFilter<span style=\"color:blue;\"> As String<\/span> = \"Access-DB (*.mdb)|Alle Dateien (*.*)\")<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Static <\/span>sDir<span style=\"color:blue;\"> As String<\/span>\r\n     WizHook.Key = 51488399\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(StartDir) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(sDir) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             StartDir = GetSpecialFolder(FOLDERID_Documents)\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             StartDir = sDir\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> WizHook.GetFileName(0, \"Microsoft Access\", sTitle, \"&ouml;ffnen\", OpenFileName, StartDir, sFilter, _\r\n         0&, 0&, &H40, <span style=\"color:blue;\">False<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(OpenFileName) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         sDir = <span style=\"color:blue;\">Left<\/span>(OpenFileName, <span style=\"color:blue;\">InStrRev<\/span>(OpenFileName, \"\\\", , vbTextCompare))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Datei &ouml;ffnen-Dialog, der mit entsprechendem Verweis auch von Outlook aus funktioniert<\/span><\/b><\/p>\n<p>Es gibt noch eine weitere wichtige &auml;nderung, denn wir k&ouml;nnen, wenn der Benutzer kein Startverzeichnis &uuml;bergeben hat, nicht auf <b>CurrentProject.Path <\/b>als Startverzeichnis zur&uuml;ckgreifen. Stattdessen wollen wir den <b>Eigene Dokumente<\/b>-Ordner des aktuellen Benutzers verwenden. Dazu nutzen wir die Funktion <b>GetSpecialFolder<\/b> mit dem Parameter <b>FOLDERID_Documents<\/b>. Die Funktion erl&auml;utern wir im Beitrag <b>Standardverzeichnisse per VBA <\/b>(<b>www.access-im-unternehmen.de\/1031<\/b>).<\/p>\n<p>Davon abgesehen liefert der Dialog, der wie in Bild 2 aussieht, den kompletten Dateipfad der ausgew&auml;hlten Datei zur&uuml;ck, den die aufrufende Routine dann auch gleich in der entsprechenden benutzerdefinierten Eigenschaft in Outlok speichert. Gegebenenfalls stellen Sie der Anzeige des <b>Datei &ouml;ffnen<\/b>-Dialogs noch ein Meldungsfenster voran, damit der Benutzer wei&szlig;, warum er nun den Speicherort einer Access-Datenbank ausw&auml;hlen soll.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1030_002.png\" alt=\"Datei &ouml;ffnen-Dialog zur Auswahl der Datenbankdatei\" width=\"599,4715\" height=\"403,7616\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Datei &ouml;ffnen-Dialog zur Auswahl der Datenbankdatei<\/span><\/b><\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OutlookCode.txt<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{D66F4291-D044-4A6D-BCD5-3517716DF0BE}\/aiu_1030.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Outlook mit automatischen Funktionen ausstatten, die einen Zugriff auf eine Datenbankanwendung erfordern (in unserem Fall meist auf eine Access-Datenbank), dann m&uuml;ssen Sie irgendwo den Pfad der Datenbankdatei hinterlegen. Dies k&ouml;nnte man vor&uuml;bergehend statisch in einem Code-Modul erledigen, aber f&uuml;r professionelle Anwendungszwecke sollte dieser Pfad nicht nur ge&auml;ndert werden k&ouml;nnen, sondern auch an einem anderen Ort gespeichert werden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022016,662016,44000026],"tags":[],"class_list":["post-55001030","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Benutzerdefinierte Outlook-Eigenschaften - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benutzerdefinierte Outlook-Eigenschaften\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Outlook mit automatischen Funktionen ausstatten, die einen Zugriff auf eine Datenbankanwendung erfordern (in unserem Fall meist auf eine Access-Datenbank), dann m&uuml;ssen Sie irgendwo den Pfad der Datenbankdatei hinterlegen. Dies k&ouml;nnte man vor&uuml;bergehend statisch in einem Code-Modul erledigen, aber f&uuml;r professionelle Anwendungszwecke sollte dieser Pfad nicht nur ge&auml;ndert werden k&ouml;nnen, sondern auch an einem anderen Ort gespeichert werden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:02:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Benutzerdefinierte Outlook-Eigenschaften\",\"datePublished\":\"2020-05-22T19:02:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/\"},\"wordCount\":1626,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/6d9a5d44c09a4ab5a4edd8cd0a64a790\",\"articleSection\":[\"2\\\/2016\",\"2016\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/\",\"name\":\"Benutzerdefinierte Outlook-Eigenschaften - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/6d9a5d44c09a4ab5a4edd8cd0a64a790\",\"datePublished\":\"2020-05-22T19:02:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/6d9a5d44c09a4ab5a4edd8cd0a64a790\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/6d9a5d44c09a4ab5a4edd8cd0a64a790\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_OutlookEigenschaften\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Benutzerdefinierte Outlook-Eigenschaften\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Benutzerdefinierte Outlook-Eigenschaften - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/","og_locale":"de_DE","og_type":"article","og_title":"Benutzerdefinierte Outlook-Eigenschaften","og_description":"Wenn Sie Outlook mit automatischen Funktionen ausstatten, die einen Zugriff auf eine Datenbankanwendung erfordern (in unserem Fall meist auf eine Access-Datenbank), dann m&uuml;ssen Sie irgendwo den Pfad der Datenbankdatei hinterlegen. Dies k&ouml;nnte man vor&uuml;bergehend statisch in einem Code-Modul erledigen, aber f&uuml;r professionelle Anwendungszwecke sollte dieser Pfad nicht nur ge&auml;ndert werden k&ouml;nnen, sondern auch an einem anderen Ort gespeichert werden.","og_url":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:02:05+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Benutzerdefinierte Outlook-Eigenschaften","datePublished":"2020-05-22T19:02:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/"},"wordCount":1626,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790","articleSection":["2\/2016","2016","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/","url":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/","name":"Benutzerdefinierte Outlook-Eigenschaften - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790","datePublished":"2020-05-22T19:02:05+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/6d9a5d44c09a4ab5a4edd8cd0a64a790"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_OutlookEigenschaften\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Benutzerdefinierte Outlook-Eigenschaften"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001030"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001030\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}