{"id":55001222,"date":"2020-02-01T00:00:00","date_gmt":"2020-07-10T09:39:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1222"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"OutlookTermine_nach_Access","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/","title":{"rendered":"Outlook-Termine nach Access"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Outlook-Termine, die man &uuml;ber verschiedene Clients pflegt, m&ouml;chte man vielleicht sp&auml;ter einmal nach Access exportieren, um diese dort beispielsweise f&uuml;r die Erfassung der Projektzeiten beim Kunden heranzuziehen. Daf&uuml;r gibt es verschiedene Methoden. Outlook selbst bietet einen Export an, mit dessen Ergebnis Sie arbeiten k&ouml;nnen. Oder Sie greifen direkt von Access aus per VBA auf das Objektmodell von Outlook zu, um die Termine St&uuml;ck f&uuml;r St&uuml;ck einzulesen. Dieser Beitrag zeigt, was es dabei zu beachten gibt und wie Sie auch benutzerdefinierte Felder in Terminen einlesen k&ouml;nnen.<\/b><\/p>\n<p><b>Export per Bordmittel<\/b><\/p>\n<p>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.<\/p>\n<p>Den notwendigen Befehl finden Sie in Outlook 2016 im Backstage-Bereich unter <b>&Ouml;ffnen und Exportieren<\/b>. Die ben&ouml;tigte Schaltfl&auml;che hei&szlig;t <b>Importieren\/Exportieren <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_001.png\" alt=\"Befehl zum Exportieren von Outlook-Daten\" width=\"499,6607\" height=\"467,8195\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Befehl zum Exportieren von Outlook-Daten<\/span><\/b><\/p>\n<p>Nachdem wir diese Taste bet&auml;tigt haben, finden wir den Dialog <b>Import\/Export-Assistent <\/b>vor.<\/p>\n<p>Dieser bietet nur einen f&uuml;r uns interessanten Eintrag in der Liste der Aktionen an, n&auml;mlich <b>In Datei exportieren<\/b> (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_002.png\" alt=\"Import- und Export-M&ouml;glichkeiten\" width=\"499,6607\" height=\"313,1676\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Import- und Export-M&ouml;glichkeiten<\/span><\/b><\/p>\n<p>Der nach der Auswahl von <b>In Datei exportieren <\/b>und dem Bet&auml;tigen der <b>Weiter<\/b>-Schaltfl&auml;che angezeigte Dialog bietet wiederum zwei M&ouml;glichkeiten an:<\/p>\n<ul>\n<li><b>Durch Trennzeichen getrennte Werte <\/b>und<\/li>\n<li><b>Outlook-Datendatei (.pst)<\/b>.<\/li>\n<\/ul>\n<p>Hier w&auml;hlen wir den Eintrag <b>Durch Trennzeichen getrennte Werte <\/b>aus und klicken wiederum auf <b>Weiter <\/b>(siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_003.png\" alt=\"Export in eine Liste mit Trennzeichen\" width=\"499,6607\" height=\"313,1676\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Export in eine Liste mit Trennzeichen<\/span><\/b><\/p>\n<p>Das &ouml;ffnet die n&auml;chste Seite des Dialogs und wir finden die Ordnerstruktur von Outlook vor (siehe Bild 4). Hier suchen wir nach dem Ordner <b>Kalender <\/b>und markieren diesen, bevor wir zum n&auml;chsten Schritt wechseln.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_004.png\" alt=\"Export der Kalenderdaten\" width=\"499,6607\" height=\"313,1676\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Export der Kalenderdaten<\/span><\/b><\/p>\n<p>Hier legen wir fest, in welche Datei die Termindaten exportiert werden sollen. Dazu geben Sie entweder Pfad und Datei ein oder w&auml;hlen diese mit dem Dialog aus, den Sie &uuml;ber die <b>Durchsuchen&#8230;<\/b>-Schaltfl&auml;che &ouml;ffnen k&ouml;nnen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_005.png\" alt=\"Angabe der Exportdatei\" width=\"424,7115\" height=\"266,1924\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Angabe der Exportdatei<\/span><\/b><\/p>\n<p>Danach wird es interessanter: Im nun erscheinenden &Uuml;bersichtsdialog &ouml;ffnen Sie &uuml;ber die Schaltlf&auml;che <b>Benutzerdefinierte Felder <\/b>zuordnen einen weiteren Dialog namens <b>Benutzerdefinierte Felder zuordnen<\/b> &ouml;ffnen.<\/p>\n<p>Hier k&ouml;nnen Sie festlegen, welche der Felder &uuml;berhaupt exportiert werden sollen und mit welcher Spalten&uuml;berschrift diese versehen werden sollen (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_006.png\" alt=\"Zuordnen der Felder an die Spalten der Exportdatei\" width=\"424,7115\" height=\"331,3591\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Zuordnen der Felder an die Spalten der Exportdatei<\/span><\/b><\/p>\n<p>Haben Sie diese Liste nach Ihren W&uuml;nschen bearbeitet, schlie&szlig;en Sie den Dialog wieder und f&uuml;hren den Export mit einem Klick auf die Schaltfl&auml;che <b>Fertigstellen <\/b>aus.<\/p>\n<p>Danach erscheint noch ein abschlie&szlig;ender Dialog namens <b>Zeitraum festlegen<\/b> (siehe Bild 7). Hier k&ouml;nnen Sie den vom Export vorgeschlagenen Zeitraum anpassen. Au&szlig;erdem erhalten Sie hier den Hinweis, dass von Termin- und Aufgabenserien, die in diesen Zeitraum fallen, nur die Termine dieses Zeitraums ber&uuml;cksichtigt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_007.png\" alt=\"Festlegen des Zeitraums\" width=\"349,7625\" height=\"291,1066\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Festlegen des Zeitraums<\/span><\/b><\/p>\n<p>Danach geht der Export endlich los und Sie k&ouml;nnen den Fortschritt im Dialog aus Bild 8 verfolgen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_008.png\" alt=\"Exportfortschritt\" width=\"349,7625\" height=\"171,9827\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Exportfortschritt<\/span><\/b><\/p>\n<p>Danach schauen wir uns die Export-Datei direkt in Excel an. Bild 9 zeigt nur zwei Termine an, die so aus Outlook in die <b>.csv<\/b>-Datei exportiert wurden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_009.png\" alt=\"Export von zwei Terminen\" width=\"700\" height=\"401,0743\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Export von zwei Terminen<\/span><\/b><\/p>\n<p>Die erste Zeile enth&auml;lt die Spalten&uuml;berschriften, die zweite den ersten Termin, die folgenden Zeilen den zweiten Termin. Dieser erstreckt sich &uuml;ber mehrere Zeilen, weil der Inhalt des Feldes <b>Beschreibung <\/b>mit Text gef&uuml;llt ist. Dies ist der Fall, wenn ein Termin erstellt wurde, indem der Benutzer eine Aufgabe in den Kalender gezogen hat.<\/p>\n<p><b>Analyse des Ergebnisses<\/b><\/p>\n<p>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 &#8211; zumindest die benutzerdefinierten Eigenschaften wurden nicht mitexportiert.<\/p>\n<p>Zusammenfassend scheint es also praktischer zu sein, direkt per VBA auf die Termine und ihre Eigenschaften zuzugreifen.<\/p>\n<p><b>Zugriff per VBA<\/b><\/p>\n<p>Um von einer Access-Datenbank auf Outlook zuzugreifen, ben&ouml;tigen wir einen Verweis auf die entsprechende Objektbibliothek. Diese binden wir im VBA-Editor &uuml;ber den Men&uuml;eintrag <b>Extras|Verweise <\/b>ein, der den Dialog <b>Verweise <\/b>&ouml;ffnet. Hier w&auml;hlen wir den Eintrag <b>Microsoft Outlook 16.0 Object Library <\/b>aus (f&uuml;r Office 2016 &#8211; sonst w&auml;hlen Sie die verf&uuml;gbare Version f&uuml;r die aktuelle Office-Installation). Das Ergebnis sieht dann im <b>Verweise<\/b>-Dialog wie in Bild 10 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_010.png\" alt=\"Verweis auf die Outlook-Bibliothek\" width=\"424,7115\" height=\"334,8159\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Verweis auf die Outlook-Bibliothek<\/span><\/b><\/p>\n<p><b>Outlook referenzieren<\/b><\/p>\n<p>Als Erstes ben&ouml;tigen wir eine Objektvariable, mit der wir die ge&ouml;ffnete Outlook-Instanz referenzieren oder eine neue erstellen. Das realisieren wir, indem wir zun&auml;chst eine privat deklarierte Objektvariable in einem neuen Standardformular anlegen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Outlook<span style=\"color:blue;\"> As <\/span>Outlook.Application<\/pre>\n<p>Diese f&uuml;llen wir mit der Funktion <b>GetOutlook<\/b>. Sie pr&uuml;ft, ob <b>m_Outlook <\/b>den Wert <b>Nothing <\/b>enth&auml;lt. Falls ja, wird <b>m_Outlook <\/b>mit einer mit dem <b>New<\/b>-Schl&uuml;sselwort erzeugten neuen Instanz gef&uuml;llt. Danach liefert <b>GetOutlook <\/b>den Wert von <b>m_Outlook <\/b>als Funktionswert zur&uuml;ck. Damit braucht <b>m_Outlook <\/b>nur beim ersten Aufruf gef&uuml;llt zu werden und die Funktion kann bei folgenden Aufrufen auf die bereits existierende Instanz zugreifen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetOutlook()<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">If <\/span>m_Outlook Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_Outlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetOutlook = m_Outlook\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das <b>New<\/b>-Schl&uuml;sselwort holt &uuml;brigens nur eine neue Outlook-Instanz, wenn keine Instanz l&auml;uft.<\/p>\n<p>Dies kann zum Beispiel in dem Fall schiefgehen, wenn eine Outlook-Instanz durch den Benutzer ge&ouml;ffnet wurde, die obige Prozedur <b>m_Outlook <\/b>mit einem Verweis auf diese Instanz f&uuml;llt, der Benutzer Outlook &uuml;ber die Benutzeroberfl&auml;che schlie&szlig;t und <b>GetOutlook <\/b>dann nochmals auf <b>m_Outlook <\/b>zugreift.<\/p>\n<p>In diesem Fall l&ouml;st der Zugriff auf eine der Eigenschaften des <b>Outlook-Application<\/b>-Objekts den Fehler aus Bild 11 aus, weil die Objektvariable ein ung&uuml;ltiges Objekt enth&auml;lt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_011.png\" alt=\"Fehler beim Zugriff auf eine leere Objektvariable\" width=\"424,7115\" height=\"186,8297\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Fehler beim Zugriff auf eine leere Objektvariable<\/span><\/b><\/p>\n<p>Also erweitern wir die Funktion ein wenig:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetOutlook()<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>strDummy<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>m_Outlook Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_Outlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     strDummy = m_Outlook.Name\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_Outlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> GetOutlook = m_Outlook\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier versuchen wir nun, bei deaktivierter Fehlerbehandlung auf die Eigenschaft <b>Name <\/b>von <b>m_Outlook <\/b>zuzugreifen. Wenn <b>m_Outlook <\/b>zu diesem Zeitpunkt nicht korrekt gef&uuml;llt, l&ouml;st dies einen Fehler aus, den wir mir der folgenden <b>If&#8230;Then<\/b>-Bedingung abfragen und <b>m_Outlook <\/b>gegebenenfalls mit einer neuen Outlook-Instanz f&uuml;llen.<\/p>\n<p><b>Ordner mit Terminen referenzieren<\/b><\/p>\n<p>Danach ben&ouml;tigen wir Zugriff auf den Ordner mit den Terminen. Wie bekommen wir diesen Dazu gibt es mehrere M&ouml;glichkeiten. Die g&auml;ngigste ist, den Standardordner f&uuml;r die Termine aufzurufen. Das gelingt mit der folgenden Funktion:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetDefaultCalendar()<span style=\"color:blue;\"> As <\/span>Outlook.Folder\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;\">Set<\/span> objMAPI = GetOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objFolder =  objMAPI.GetDefaultFolder(olFolderCalendar)\r\n     <span style=\"color:blue;\">Set<\/span> GetDefaultCalendar = objFolder\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier holen wir erst den <b>MAPI<\/b>-Namespace &uuml;ber die <b>GetNamespace<\/b>-Methode des mit <b>GetOutlook <\/b>referenzierten <b>Outlook.Application<\/b>-Objekts und referenzieren diesen mit der Variablen <b>objMAPI<\/b>. Dann verwenden wir dessen Funktion <b>GetDefaultFolder <\/b>mit dem Parameter <b>olFolderCalendar<\/b>. Die Funktion gibt das erhaltene Objekt dann als Verweis des Typs <b>Outlook.Folder <\/b>an die aufrufende Anweisung zur&uuml;ck.<\/p>\n<p>Damit k&ouml;nnen Sie nun beispielsweise den Pfad zu diesem Ordner innerhalb von Outlook mit folgender Anweisung ausgeben:<\/p>\n<pre>  GetDefaultCalendar.FolderPath\r\n<\/font>OutlookKalender<\/pre>\n<p><!--30percent--><\/p>\n<p>In einer aufrufenden Prozedur k&ouml;nnen wir den Verweis auf dieses <b>Folder<\/b>-Objekt nun auch in einer Objektvariablen speichern und dann weiter damit arbeiten:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AppointmentsLesen()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointments<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objAppointments = GetDefaultCalendar\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objAppointments.FolderPath\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Ordner selbst ausw&auml;hlen<\/b><\/p>\n<p>Sie k&ouml;nnen dem Benutzer auch die M&ouml;glichkeit geben, einen anderen Ordner als Kalenderordner auszuw&auml;hlen. Das ist beispielsweise sinnvoll, wenn die zu untersuchenden Termine sich nicht im Standardordner befinden, sondern in einem anderen Termin-Ordner.<\/p>\n<p>Die folgende Funktion &ouml;ffnet einen entsprechenden Dialog:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetCalenderFolder()<span style=\"color:blue;\"> As <\/span>Outlook.Folder\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;\">Set<\/span> objMAPI = GetOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objFolder = objMAPI.PickFolder\r\n     <span style=\"color:blue;\">Set<\/span> GetCalenderFolder = objFolder\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier nutzen wir die Funktion <b>PickFolder,<\/b> um den Dialog zum &Ouml;ffnen des Dialogs <b>Ordner ausw&auml;hlen <\/b>(siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_012.png\" alt=\"Dialog zum Ausw&auml;hlen eines Outlook-Ordners\" width=\"424,7115\" height=\"359,1846\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Dialog zum Ausw&auml;hlen eines Outlook-Ordners<\/span><\/b><\/p>\n<p>Hier ist leicht zu erkennen, dass Sie beliebige Ordner ausw&auml;hlen k&ouml;nnen. Wie also pr&uuml;fen wir, ob der Benutzer auch einen Kalender-Ordner ausgew&auml;hlt hat Wenn wir sp&auml;ter auf die enthaltenen Elemente zugreifen, wollen wir ja keine Fehler ausl&ouml;sen, weil der Ordner E-Mails, Kontakte oder andere Elemente statt Terminen liefert.<\/p>\n<p>Dazu erweitern wir die Funktion nach dem Einlesen des Ordners mit <b>PickFolder <\/b>um eine Pr&uuml;fung, ob das Standard-element ein Termin ist, was wir durch den Wert der Eigenschaft <b>DefaultItemType <\/b>des <b>Folder<\/b>-Objekts herausfinden. Dieser sollte <b>olAppointmentItem <\/b>lauten. Anderenfalls soll die Funktion mit einer Meldung beendet werden:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetUserdefinedCalendar()<span style=\"color:blue;\"> As <\/span>Outlook.Folder\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;\">Set<\/span> objMAPI = GetOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objFolder = objMAPI.PickFolder\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objFolder.DefaultItemType =  olAppointmentItem<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der gew&auml;hlte Ordner ist kein Kalender.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetUserdefinedCalendar = objFolder\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dementsprechend m&uuml;ssen wir auch beim Aufruf der Funktion <b>GetUserdefinedCalendar<\/b> pr&uuml;fen, ob diese &uuml;berhaupt einen Wert zur&uuml;ckliefert:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AppointmentsLesenII()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentFolder = GetUserdefinedCalendar\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objAppointmentFolder Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objAppointmentFolder.FolderPath\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Kein Ordner referenziert.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Termine durchlaufen<\/b><\/p>\n<p>Bevor Sie alle Termine durchlaufen, pr&uuml;fen Sie erst einmal, wieviele Termine &uuml;berhaupt im Kalender-Ordner enthalten sind. Bei vielen Terminen, die sich &uuml;ber Jahre angesammelt haben, kann dieser Prozess recht lange dauern. Also lassen wir erst einmal die Anzahl ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleTermineDurchlaufen()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentFolder = GetDefaultCalendar\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objAppointmentFolder.Items.Count\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ist die Anzahl &uuml;berschaubar, erweitern Sie die obige Prozedur um die folgenden Anweisungen. Hier durchlaufen wir in einer Schleife alle enthaltenen Elemente:<\/p>\n<pre>For Each objItem In objAppointmentFolder.Items\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objItem.Subject, objItem.Start, objItem.End\r\n<span style=\"color:blue;\">Next<\/span> objItem<\/pre>\n<p><b>Termine nach Datum filtern<\/b><\/p>\n<p>Wenn Sie die Termine filtern wollen, k&ouml;nnen Sie das mit der <b>Restrict<\/b>-Funktion der <b>Items<\/b>-Auflistung erledigen. Diese nimmt einen Ausdruck &auml;hnlich dem <b>Where<\/b>-Kriterium einer SQL-Abfrage entgegen und liefert als Ergebnis eine neue <b>Items<\/b>-Auflistung. Damit verbunden ist somit der wichtige Hinweis, dass allein das Anwenden von <b>Restrict <\/b>nicht die enthaltenen Elemente filtert, sondern dass sich dies lediglich auf die Ergebnismenge auswirkt!<\/p>\n<p>Wir gehen davon aus, dass wir die beiden Parameter <b>datStart <\/b>und <b>datEnd <\/b>zuvor f&uuml;llen. Dann stellen wir wie folgt den Filterausdruck in <b>strFilter <\/b>zusammen:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>datStart &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = \" AND [Start] &lt;= '\"  & Format(datEnd, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n<span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">If <\/span>datEnd &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = strFilter & \" AND [End] &gt;= '\"  & Format(datStart, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n<span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 5)\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Mit Datumsangaben erhalten wir so beispielsweise diesen Filterausdruck:<\/p>\n<pre>[Start] &lt;= '10.12.2019 00:00' AND [End] &gt;= '30.11.2019 00:00'<\/pre>\n<p>Das mag auf den ersten Blick okay aussehen, auf den zweiten aber vielleicht ungewohnt: Wir legen im ersten Teil fest, dass das Startdatum des Termins kleiner als das mit <b>datEnd <\/b>&uuml;bergebene Enddatum ist und das Enddatum gr&ouml;&szlig;er als das mit <b>datStart <\/b>&uuml;bergebene Startdatum. Damit erhalten wir hier einen Ausdruck, der daf&uuml;r sorgt, dass alle Termine erfasst werden, die auch nur teilweise in dem angegebenen Zeitraum liegen. Wenn ein Termin vor dem mit <b>datStart <\/b>und <b>datEnd <\/b>angegebenen Zeitraum liegt und in diesem Zeitraum endet (oder auch danach), wird er von diesem Kriterium erfasst.<\/p>\n<p>Wenn Sie nur Termine erfassen wollen, die innerhalb des angegebenen Zeitraums beginnen und auch dort enden, m&uuml;ssen Sie die Bedingung umformulieren, und zwar so:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>datStart &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = \" AND [Start] &gt;= '\"  & Format(datStart, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n<span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">If <\/span>datEnd &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = strFilter & \" AND [End] &lt;= '\"  & Format(datEnd, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Schlie&szlig;lich deklarieren wir noch eine neue Variable des Typs <b>Items<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objItemsGefiltert<span style=\"color:blue;\"> As <\/span>Outlook.Items<\/pre>\n<p>Diese f&uuml;llen wir dann mit der mit <b>strFilter <\/b>gefilterten Menge von <b>AppointmentItem<\/b>-Elementen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objItemsGefiltert = objItems.Restrict(strFilter)<\/pre>\n<p><b>Ganzt&auml;gige Termine ber&uuml;cksichtigen<\/b><\/p>\n<p>Wenn Sie nur ganzt&auml;gige Termine ber&uuml;cksichtigen wollen, k&ouml;nnen Sie die entsprechende VBA-Eigenschaft des <b>AppointmentItem<\/b>-Elements ebenfalls in die Bedingung integrieren. Auch hier gehen wir davon aus, dass mit dem Parameter <b>bolNurGanztaegig<\/b> angegeben wird, ob nur ganzt&auml;gige Termine ermittelt werden sollen. Dann k&ouml;nnen wir die Bedingung wie folgt erweitern:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>bolNurGanztaegig<span style=\"color:blue;\"> Then<\/span>\r\n     strFilter = strFilter & \" AND [AllDayEvent] = True\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Wir stellen also schlicht einen Filter f&uuml;r die Eigenschaft <b>AllDayEvent <\/b>auf den Wert <b>True <\/b>ein und schlie&szlig;en somit alle Eintr&auml;ge aus, deren Feld <b>AllDayEvent <\/b>den Wert <b>False <\/b>aufweist.<\/p>\n<p>Auf die gleiche Art k&ouml;nnen Sie nach weiteren Eigenschaften von Terminen suchen, die das gesuchte <b>AppointmentItem<\/b>-Element kennzeichnen.<\/p>\n<p><b>Nach benutzerdefinierten Eigenschaften filtern<\/b><\/p>\n<p>Gegebenenfalls haben Sie, wie im Beitrag <b>Benutzerdefinierte Felder in Outlook <\/b>(<b>www.access-im-unternehmen.de\/1221<\/b>) beschrieben, benutzerdefinierte Felder f&uuml;r Outlook-Termine angelegt. Wir wollen auch nach diesen filtern k&ouml;nnen, um beispielsweise alle Termine ausfindig zu machen, die im Kontext eines bestimmten Mitarbeiters angelegt wurden. Wir wollen also nun nach Terminen suchen, deren benutzerdefiniertes Feld <b>Mitarbeiter <\/b>den Wert <b>Minhorst <\/b>enth&auml;lt. Dazu erweitern wir das Kriterium wie folgt:<\/p>\n<pre>strFilter = strFilter & \" AND [Mitarbeiter] = 'Minhorst'\"<\/pre>\n<p>Und es ist tats&auml;chlich so einfach &#8211; benutzerdefinierte Felder k&ouml;nnen Sie in dem Ausdruck f&uuml;r die Funktion <b>Restrict <\/b>einfach wie eingebaute Felder angeben.<\/p>\n<p><b>Mit Terminen arbeiten<\/b><\/p>\n<p>Wenn Sie einmal einen Termin referenziert haben, also ein Element des Typs <b>AppointmentItem<\/b>, wie sie in der <b>Items<\/b>-Auflistung zu finden sind, wollen Sie auch seine Eigenschaften nutzen. Der Zugriff auf diese Eigenschaften erfolgt ganz einfach &uuml;ber die jeweiligen Eigenschaftsnamen. Sie k&ouml;nnen diese also abfragen und die enthaltenen Werte in neue Datens&auml;tze einer Tabelle zum Speichern von Outlook-Termindaten einf&uuml;gen. Wie das gelingt, zeigen wir gleich &#8211; vorher schauen wir uns noch an, wie Sie auf benutzerdefinierte Felder zugreifen k&ouml;nnen.<\/p>\n<p><b>Benutzerdefinierte Felder abfragen<\/b><\/p>\n<p>Sind die benutzerdefinierten Felder eines Termin-Elements genauso einfach zu lesen, wie wir sie als Filterkriterium in der <b>Restrict<\/b>-Methode nutzen konnten Nein, nicht ganz so leicht. Der Grund ist, dass man den VBA-Objekten nicht einfach neue Eigenschaften hinzuf&uuml;gen kann. Eine Abfrage etwa &uuml;ber <b>objItem.Mitarbeiter <\/b>ist also nicht m&ouml;glich. Es ist aber fast so einfach &#8211; wir brauchen lediglich die Auflistung <b>UserProperties<\/b>, um auf die benutzerdefinierte Eigenschaft zuzugreifen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objItem.UserProperties(\"Mitarbeiter\")<\/pre>\n<p>Allerdings kann es sein, dass nicht alle Termin-Elemente auch diese benutzerdefinierte Eigenschaft enthalten. Was geschieht, wenn wir auf eine benutzerdefinierte Eigenschaft zugreifen, die gar nicht im untersuchten Element vorhanden ist Dann wird der Fehler aus Bild 13 ausgel&ouml;st.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_013.png\" alt=\"Fehler beim Zugriff auf ein nicht vorhandenes benutzerdefiniertes Feld\" width=\"424,7115\" height=\"241,078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Fehler beim Zugriff auf ein nicht vorhandenes benutzerdefiniertes Feld<\/span><\/b><\/p>\n<p>Um dies zu verhindern, m&uuml;ssen wir also die Fehlerbehandlung aktivieren oder einfach abfragen, ob das benutzerdefinierte Feld vorhanden ist. Das erledigen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objItem.UserProperties(\"Mitarbeiter\") Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objItem.UserProperties(\"Mitarbeiter\")\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Kein Mitarbeiter angegeben.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p><b>Outlook-Termine in Access speichern<\/b><\/p>\n<p>Damit haben wir die Grundlagen geschaffen, um die Daten von Outlook-Terminen zu ermitteln. Nun m&uuml;ssen wir diese nur noch in einer Access-Tabelle speichern. Diese Tabelle soll im Entwurf wie in Bild 14 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_014.png\" alt=\"Entwurf der Tabelle zum Speichern der Outlook-Termine\" width=\"499,6607\" height=\"399,5544\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Entwurf der Tabelle zum Speichern der Outlook-Termine<\/span><\/b><\/p>\n<p>Das Feld <b>EntryID<\/b>, welches den eindeutigen Wert der gleichnamigen Eigenschaft des <b>Appointment-Item<\/b>-Objekts aufnehmen soll, definieren wir mit einem eindeutigen Index. Dar&uuml;berhinaus haben wir nur die Felder <b>Betreff<\/b>, <b>Inhalt<\/b>, <b>Startzeit <\/b>und <b>Endzeit <\/b>angelegt &#8211; wenn Sie weitere Informationen aus den Terminen ben&ouml;tigen, f&uuml;gen Sie zus&auml;tzliche Felder hinzu und erg&auml;nzen den nachfolgend beschriebenen Code entsprechend.<\/p>\n<p><b>Formular zum Einlesen und Anzeigen der Termine<\/b><\/p>\n<p>Anschlie&szlig;end bauen wir uns ein komfortables Formular, mit dem wir die weiter oben vorgestellten Parameter eingeben k&ouml;nnen (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1222_016.png\" alt=\"Entwurf des Formulars zum Einlesen der Outlook-Termine\" width=\"599,593\" height=\"363,3443\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Entwurf des Formulars zum Einlesen der Outlook-Termine<\/span><\/b><\/p>\n<p>Dieses Formular enth&auml;lt die folgenden Steuer-elemente:<\/p>\n<ul>\n<li><b>txtStartdatum<\/b>: Eingabe des Vergleichswertes f&uuml;r das Startdatum<\/li>\n<li><b>txtEnddatum<\/b>: Eingabe des Vergleichswertes f&uuml;r das Enddatum<\/li>\n<li><b>chkGanztaegig<\/b>: Eingabe, ob nur ganzt&auml;tige Termine angezeigt werden sollen<\/li>\n<li><b>txtMitarbeiter<\/b>: Name des Mitarbeiters, dessen Termine eingelesen werden sollen<\/li>\n<li><b>cmdImportStarten<\/b>: Schaltfl&auml;che zum Starten des Importvorgangs<\/li>\n<\/ul>\n<p>Au&szlig;erdem f&uuml;gen wir ein Unterformular hinzu, das die Daten der Tabelle <b>tblOutlooktermine <\/b>in der Datenblattansicht anzeigt.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdImportStarten <\/b>l&ouml;st die Prozedur aus Listing 1 aus. Diese ruft die Funktion <b>TermineEinlesen <\/b>auf, welche weitgehend die bereits weiter oben beschriebenen Anweisungen zum Einlesen von Terminen aus einem Outlook-Terminkalender enth&auml;lt. Dabei &uuml;bergibt die Prozedur die Werte der Steuer-elemente <b>txtStartdatum<\/b>, <b>txtEnddatum<\/b>, <b>chkGanztaegig <\/b>und <b>txtMitarbeiter <\/b>als Parameter.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdImportStarten_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objTermine<span style=\"color:blue;\"> As <\/span>Outlook.Items\r\n     <span style=\"color:blue;\">Set<\/span> objTermine = TermineEinlesen(Nz(Me!txtStartdatum, 0), Nz(Me!txtEnddatum, 0), Me!chkGanztaegig, _\r\n         Nz(Me!txtMitarbeiter, \"\"))\r\n     TermineSchreiben objTermine\r\n     Me!sfmTermineImportieren.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Start des Importvorgangs<\/span><\/b><\/p>\n<p>Das Ergebnis landet in der Variablen <b>objTermine <\/b>mit dem Datentyp <b>Outlook.Items<\/b>.<\/p>\n<p>Diese Liste verarbeitet die Prozedur dann gleich weiter in der Routine <b>TermineSchreiben<\/b>. Diese nimmt die Liste entgegen und soll die Termine in die weiter oben vorgestellte Tabelle <b>tblOutlookTermine <\/b>eintragen. Danach aktualisiert die Prozedur noch die Datensatzquelle des Unterformulars im Unterformular-Steuerelement <b>sfmTermineImportieren<\/b>.<\/p>\n<p><b>Die Funktion TermineEinlesen<\/b><\/p>\n<p>Die Funktion <b>TermineEinlesen <\/b>aus Listing 2 erwartet die vier bereits beschriebenen Parameter. Sie ermittelt den Standardkalender (dies k&ouml;nnen Sie ersetzen durch die Abfrage eines individuellen Kalenders) und die darin enthaltenen Elemente.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>TermineEinlesen(<span style=\"color:blue;\">Optional<\/span> datStart<span style=\"color:blue;\"> As Date<\/span>, <span style=\"color:blue;\">Optional<\/span> datEnd<span style=\"color:blue;\"> As Date<\/span>, <span style=\"color:blue;\">Optional<\/span> bolNurGanztaegig<span style=\"color:blue;\"> As <\/span>_\r\n         Boolean, <span style=\"color:blue;\">Optional<\/span> strMitarbeiter<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objItems<span style=\"color:blue;\"> As <\/span>Outlook.Items\r\n     <span style=\"color:blue;\">Dim <\/span>objItemsGefiltert<span style=\"color:blue;\"> As <\/span>Outlook.Items\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentFolder = GetDefaultCalendar\r\n     <span style=\"color:blue;\">Set<\/span> objItems = objAppointmentFolder.Items\r\n     <span style=\"color:blue;\">If <\/span>datStart &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND [Start] &gt;= '\" & Format(datStart, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>datEnd &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND [End] &lt;= '\" & Format(datEnd, \"dd.mm.yyyy hh:mm\") & \"'\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolNurGanztaegig<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND [AllDayEvent] = True\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strMitarbeiter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND [Mitarbeiter] = '\" & strMitarbeiter & \"'\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 5)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objItemsGefiltert = objItems.Restrict(strFilter)\r\n     <span style=\"color:blue;\">Set<\/span> TermineEinlesen = objItemsGefiltert\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Einlesen der Termine<\/span><\/b><\/p>\n<p>Je nachdem, ob die Parameter <b>datStart<\/b>, <b>datEnd<\/b>, <b>bolNurGanztaegig <\/b>und <b>txtMitarbeiter <\/b>&uuml;bergeben wurden, stellt die Prozedur ein entsprechendes Kriterium zusammen, dass dann an die <b>Restrict<\/b>-Methode &uuml;bergeben wird. Das Ergebnis dieser Methode wird dann als Funktionswert an die aufrufende Routine zur&uuml;ckgegeben.<\/p>\n<p><b>Die Prozedur TermineSchreiben<\/b><\/p>\n<p>Diese Prozedur erwartet eine Liste von Kalender-Elementen als Parameter (siehe Listing 3). Sie durchl&auml;uft diese in einer <b>For Each<\/b>-Schleife und legt f&uuml;r jeden Termin einen neuen Eintrag in der Tabelle <b>tblTermine <\/b>an.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TermineSchreiben(objTermine<span style=\"color:blue;\"> As <\/span>Outlook.Items)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>objTermin<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     For Each objTermin In objTermine\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         db.Execute \"INSERT INTO tblTermine(EntryID, Betreff, Inhalt, Startzeit, Endzeit) VALUES('\" _\r\n             & objTermin.EntryID & \"', '\" & objTermin.Subject & \"', '\" & objTermin.Body & \"', \" _\r\n             & ISODatum(objTermin.Start) & \", \" & ISODatum(objTermin.End) & \")\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"UPDATE tblTermine SET Betreff = '\" & objTermin.Subject & \"', Inhalt = '\" & objTermin.Body _\r\n                 & \"', Startzeit = \" & ISODatum(objTermin.Start) & \", Endzeit = \" & ISODatum(objTermin.End) _\r\n                 & \" WHERE EntryID = '\" & objTermin.EntryID & \"'\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span> objTermin\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Schreiben der Termine<\/span><\/b><\/p>\n<p>Sollte bereits ein Termin mit der <b>EntryID <\/b>des einzutragenden Termins vorhanden sein, wurde dieser offensichtlich bereits einmal eingetragen. In diesem Fall l&ouml;st der Versuch, den Datensatz erneut mit der <b>INSERT INTO<\/b>-Abfrage anzuf&uuml;gen, den Fehler mit der Nummer <b>3022 <\/b>aus. In diesem Fall sollen diese Termine mit den Daten von Outlook mithilfe einer <b>UPDATE<\/b>-Abfrage aktualisiert werden. Auf diese Weise schreibt die Prozedur alle mit <b>objTermine <\/b>&uuml;bergebenen Termine in die Tabelle <b>tblOutlooktermine<\/b>.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dies ist die Grundausr&uuml;stung f&uuml;r das Einlesen von Outlook-Terminen. Damit k&ouml;nnen Sie die Outlook-Termine vor dem Import nach den g&auml;ngigen Kriterien filtern. Au&szlig;erdem werden die wichtigsten Felder aus den Terminen in der Tabelle <b>tblOutlooktermine <\/b>gespeichert.<\/p>\n<p>Das gilt auch f&uuml;r benutzerdefinierte Felder wie in diesem Beispiel das Feld <b>Mitarbeiter<\/b>.<\/p>\n<p>Wenn Sie weitere Felder in das Filtern der zu importierenden Outlook-Termine hinzuf&uuml;gen wollen, k&ouml;nnen Sie das ebenso erledigen wie das Erweitern der Tabelle <b>tblOutlooktermine <\/b>um weitere Felder. Damit diese gef&uuml;llt werden, m&uuml;ssen Sie nat&uuml;rlich auch noch die <b>INSERT INTO<\/b>&#8211; und die <b>UPDATE<\/b>-Abfragen in der Prozedur <b>TermineSchreiben <\/b>erweitern.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OutlooktermineEinlesen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/6D4E3059-FD4B-4014-85C8-FB21E665FC5A\/aiu_1222.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Outlook-Termine, die man &uuml;ber verschiedene Clients pflegt, m&ouml;chte man vielleicht sp&auml;ter einmal nach Access exportieren, um diese dort beispielsweise f&uuml;r die Erfassung der Projektzeiten beim Kunden heranzuziehen. Daf&uuml;r gibt es verschiedene Methoden. Outlook selbst bietet einen Export an, mit dessen Ergebnis Sie arbeiten k&ouml;nnen. Oder Sie greifen direkt von Access aus per VBA auf das Objektmodell von Outlook zu, um die Termine St&uuml;ck f&uuml;r St&uuml;ck einzulesen. Dieser Beitrag zeigt, was es dabei zu beachten gibt und wie Sie auch benutzerdefinierte Felder in Terminen einlesen k&ouml;nnen.<\/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":[66012020,662020,44000026],"tags":[],"class_list":["post-55001222","post","type-post","status-publish","format-standard","hentry","category-66012020","category-662020","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Outlook-Termine nach Access - 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\/OutlookTermine_nach_Access\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outlook-Termine nach Access\" \/>\n<meta property=\"og:description\" content=\"Outlook-Termine, die man &uuml;ber verschiedene Clients pflegt, m&ouml;chte man vielleicht sp&auml;ter einmal nach Access exportieren, um diese dort beispielsweise f&uuml;r die Erfassung der Projektzeiten beim Kunden heranzuziehen. Daf&uuml;r gibt es verschiedene Methoden. Outlook selbst bietet einen Export an, mit dessen Ergebnis Sie arbeiten k&ouml;nnen. Oder Sie greifen direkt von Access aus per VBA auf das Objektmodell von Outlook zu, um die Termine St&uuml;ck f&uuml;r St&uuml;ck einzulesen. Dieser Beitrag zeigt, was es dabei zu beachten gibt und wie Sie auch benutzerdefinierte Felder in Terminen einlesen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:39:41+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Outlook-Termine nach Access\",\"datePublished\":\"2020-07-10T09:39:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/\"},\"wordCount\":2861,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/42f224d3e2e84ba9bb316debf25416c5\",\"articleSection\":[\"1\\\/2020\",\"2020\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/\",\"name\":\"Outlook-Termine nach Access - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/42f224d3e2e84ba9bb316debf25416c5\",\"datePublished\":\"2020-07-10T09:39:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/42f224d3e2e84ba9bb316debf25416c5\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/42f224d3e2e84ba9bb316debf25416c5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_nach_Access\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outlook-Termine nach Access\"}]},{\"@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":"Outlook-Termine nach Access - 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\/OutlookTermine_nach_Access\/","og_locale":"de_DE","og_type":"article","og_title":"Outlook-Termine nach Access","og_description":"Outlook-Termine, die man &uuml;ber verschiedene Clients pflegt, m&ouml;chte man vielleicht sp&auml;ter einmal nach Access exportieren, um diese dort beispielsweise f&uuml;r die Erfassung der Projektzeiten beim Kunden heranzuziehen. Daf&uuml;r gibt es verschiedene Methoden. Outlook selbst bietet einen Export an, mit dessen Ergebnis Sie arbeiten k&ouml;nnen. Oder Sie greifen direkt von Access aus per VBA auf das Objektmodell von Outlook zu, um die Termine St&uuml;ck f&uuml;r St&uuml;ck einzulesen. Dieser Beitrag zeigt, was es dabei zu beachten gibt und wie Sie auch benutzerdefinierte Felder in Terminen einlesen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:39:41+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Outlook-Termine nach Access","datePublished":"2020-07-10T09:39:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/"},"wordCount":2861,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5","articleSection":["1\/2020","2020","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/","url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/","name":"Outlook-Termine nach Access - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5","datePublished":"2020-07-10T09:39:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/42f224d3e2e84ba9bb316debf25416c5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_nach_Access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Outlook-Termine nach Access"}]},{"@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\/55001222","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=55001222"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001222\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}