{"id":55000439,"date":"2007-02-01T00:00:00","date_gmt":"2021-02-11T21:08:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=439"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"OutlookTermine_im_Griff","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/","title":{"rendered":"Outlook-Termine im Griff"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt eine Menge Gr&uuml;nde, von Access aus auf die in Outlook eingetragenen Termine zuzugreifen. So k&ouml;nnte man Liefertermine aus der Bestellverwaltung nach Outlook exportieren oder die Termine aus Outlook in eine Access-Datenbank importieren, um dort schneller nach den enthaltenen Informationen zu suchen. Vielleicht mag man ja auch einfach einen Terminkalender in einem ganz individuellen Format ausdrucken, was in Outlook selbst nicht m&ouml;glich ist. In diesem Beitrag erfahren Sie, wie Sie Termine zwischen Outlook und Access hin- und herschieben.<\/b><\/p>\n<\/p><\/div>\n<div class=\"story\">\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Verkn&uuml;pfung mit Outlook<\/p>\n<p>Die einfachste M&ouml;glichkeit, von Access aus auf die Termine von Outlook zuzugreifen, ist &#8211; so sollte man meinen &#8211; die Verkn&uuml;pfung mit den passenden Daten von Outlook. Immerhin bietet der <b>Verkn&uuml;pfen<\/b>-Dialog unter <b>Datei\/Externe Daten\/Tabellen verkn&uuml;pfen&#8230; <\/b>die M&ouml;glichkeit, Outlook() als Datentyp auszuw&auml;hlen und im n&auml;chsten Dialog (siehe Bild 1) den Kalender-Ordner auszuw&auml;hlen. Der Inhalt der verkn&uuml;pften Tabelle entspricht allerdings keinesfalls den Erwartungen: Die Tabelle enth&auml;lt lediglich die Felder, die ein Termin mit einer E-Mail gemein hat. Damit w&auml;re die Sackgasse f&uuml;r diesen Beitrag bereits gefunden, es folgt der zweite Anlauf per VBA.<\/p>\n<div class=\"abbildung\">\n            <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_01\/OutlookTermine-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/>\n        <\/div>\n<div class=\"abbildung\">\n<p><b><span style=\"color:darkgrey\">Bild 1: Auswahl des Inhalts der zu verkn&uuml;pfenden Tabelle<\/span><\/b><\/p>\n<\/p><\/div>\n<p><b>Zugriff per VBA<\/b><\/p>\n<p>Outlook bietet wie alle Office-Anwendungen eine m&auml;chtige VBA-Schnittstelle, mit der sich praktisch alles automatisieren l&auml;sst. In diesem Fall ist es interessant, auf eine Auflistung oder ein &auml;hnliches Konstrukt mit den Terminen als Inhalt zuzugreifen. Dazu ben&ouml;tigen Sie erstmal einen Objektverweis auf eine Outlook-Instanz, die Sie &uuml;blicherweise mit folgender Anweisung erstellen &#8211; nat&uuml;rlich nicht, ohne vorher eine passende Variable deklariert zu haben:<\/p>\n<pre>Dim objOutlook As Outlook.Application\r\nSet objOutlook = _<br \/> CreateObject(&quot;Outlook.Application&quot;)<\/pre>\n<p>Bei anderen Office-Anwendungen wie Word oder Excel w&uuml;rden Sie zun&auml;chst versuchen, mit <b>GetObject <\/b>eine bestehende Instanz der Anwendung zu erhalten, dies ist bei Outlook allerdings nicht erforderlich: Outlook ist im Gegebensatz zu den anderen Anwendungen eine MultiUse-Anwendung, das hei&szlig;t, dass es ohnehin nur jeweils eine Instanz pro Rechner gibt. Da dies im ung&uuml;nstigen Fall &#8211; wenn n&auml;mlich kein Outlook auf dem Rechner installiert ist &#8211; zu einem Fehler f&uuml;hrt, packen Sie diese Anweisung in eine Fehlerbehandlung ein und reagieren im Fehlerfall mit der Ausgabe einer entsprechenden Meldung:<\/p>\n<pre>Dim objOutlook As Outlook.Application\r\nOn Error Resume Next\r\nSet objOutlook = _<br \/> CreateObject(&quot;Outlook.Application&quot;)\r\nIf Err.Number = 429 Then\r\n MsgBox &quot;Outlook ist nicht installiert.&quot;\r\n Exit Function\r\nEnd If<\/pre>\n<p><b>Globaler Instanzbau<\/b><\/p>\n<p>Diese Zeilen kann man in jede Routine einbauen, die eine Outlook-Instanz ben&ouml;tigt, muss man aber nicht. Man kann die enthaltene Funktion auch in eine <b>Property Get<\/b>-Prozedur ausklammern und kann dann anwendungsweit auf die so erzeugte Eigenschaft zugreifen.<\/p>\n<p>Diese Prozedur legen Sie am besten in einem separaten Modul an, in dem Sie weitere &auml;hnliche Konstrukte unterbringen k&ouml;nnen. Im vorliegenden Fall sehen die Code sparenden Zeilen wie in Listing 1 aus. <\/p>\n<p class=\"kastentabelleheader\">Listing 1: Speichern und bereitstellen eines Outlook-Verweises als globale Eigenschaft<\/p>\n<pre>Private mOutlook As Outlook.Application\r\nPublic Property Get GetOutlook() As Outlook.Application\r\n     If mOutlook Is Nothing Then\r\n         On Error Resume Next\r\n         Set mOutlook = CreateObject(&quot;Outlook.Application&quot;)\r\n         If Err.Number = 429 Then\r\n             MsgBox &quot;Outlook ist nicht installiert.&quot;\r\n             Exit Function\r\n         End If\r\n   &nbsp  End If\r\n     Set GetOutlook = mOutlook\r\nEnd Property<\/pre>\n<p>Die Variable <b>mOutlook <\/b>h&auml;lt modulintern einen Verweis auf die Outlook-Instanz vor, soweit diese vorhanden ist. Die <b>Property Get<\/b>-Routine kann man wie eine Funktion aufrufen. Sie pr&uuml;ft, ob <b>mOutlook<\/b> einen g&uuml;ltigen Objektverweis enth&auml;lt, und legt ihn, wenn dies nicht der Fall ist, mit den oben vorgestellten Zeilen an und weist ihn der Variablen <b>mOutlook <\/b>zu. Schlie&szlig;lich gibt die <b>Property Get<\/b>-Prozedur diesen Verweis zur&uuml;ck. Testen Sie dies, indem Sie einfach einmal den folgenden Aufruf im Direktfenster absetzen:<\/p>\n<pre>Debug.Print GetOutlook.Name<\/pre>\n<p>Erstens stellen Sie fest, dass <b>GetOutlook <\/b>bereits mit IntelliSense die verf&uuml;gbaren Methoden und Eigenschaften des Outlook-Objekts liefert, und zweitens, dass der Aufruf einwandfrei funktioniert. Von jetzt an verwenden Sie also <b>GetOutlook<\/b>, wenn Sie einen Verweis auf eine Outlook-Instanz ben&ouml;tigen.<\/p>\n<p><b>Namespace holen<\/b><\/p>\n<p>Wenn Sie auf die unterschiedlichen in Outlook beziehungsweise in der .pst-Datei gespeicherten Objekte zugreifen m&ouml;chten, brauchen Sie ein so genanntes <b>NameSpace<\/b>-Objekt. Dabei handelt es sich um ein abstraktes Objekt, das die f&uuml;r den Zugriff auf die Auflistungen und Elemente notwendigen Methoden und Eigenschaften zur Verf&uuml;gung stellt. Der gew&uuml;nschte Bereich hei&szlig;t in diesem Fall <b>MAPI <\/b>und die Methode des Outlook-Objektmodells zum Holen eines solchen <b>NameSpace <\/b>hei&szlig;t <b>GetNamespace<\/b>.<\/p>\n<p>Auch f&uuml;r den vereinfachten Zugriff auf das <b>NameSpace<\/b>-Objekt schreiben Sie sich eine vereinfachende <b>Property Get<\/b>-Routine. Stellen Sie dazu in dem gleichen Modul, in dem sich auch die Routine zum Bereitstellen der Outlook-Instanz befindet, zun&auml;chst eine passende private Variable bereit (ohne Zeilenumbruch):<\/p>\n<pre>Private mNamespace As Outlook.NameSpace<\/pre>\n<p>Die Routine zum Holen des <b>NameSpace<\/b>-Objekts baut auf der zum Erzeugen der Outlook-Instanz auf und sieht wie folgt aus:<\/p>\n<pre>Public Property Get GetMAPINamespace() _<br \/> As Outlook.NameSpace\r\n If mNamespace Is Nothing Then\r\n Set objNamespace = _<br \/> GetOutlook.GetNamespace(&quot;MAPI&quot;)\r\n End If\r\n Set GetNamespace = mNamespace\r\nEnd Property<\/pre>\n<p>Da Sie mit dem <b>NameSpace<\/b>-Objekt direkt noch nicht viel anfangen k&ouml;nnen, setzen wir noch eines obendrauf und bauen eine Routine, mit der Sie einen Objektverweis auf den Kalender-Ordner von Outlook erzeugen k&ouml;nnen.<\/p>\n<p>Das Spiel geht von vorne los und beginnt mit dem Anlegen einer Variablen:<\/p>\n<pre>Private mAppointmentFolder As Outlook.MAPIFolder<\/pre>\n<p>Und nat&uuml;rlich brauchen Sie auch noch eine <b>Property Get<\/b>-Routine, die pr&uuml;ft, ob es schon einen Verweis gibt, und gegebenenfalls einen neuen anlegt &#8211; wobei sie wie schon zuvor auf die <b>GetMAPINameSpace<\/b>-Eigenschaft und dar&uuml;ber auf die <b>GetOutlook<\/b>-Eigenschaft zugreift (s. Listing 2).<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Speichern und bereitstellen des Outlook-Ordners mit den Terminen<\/p>\n<pre>Private mAppointmentFolder As Outlook.MAPIFolder \r\nPublic Property Get GetAppointmentFolder() As Outlook.MAPIFolder\r\n     If mAppointmentFolder Is Nothing Then\r\n         Set mAppointmentFolder = GetMAPINamespace.GetDefaultFolder(olFolderCalendar)\r\n     End If\r\n     Set GetAppointmentFolder = mAppointmentFolder\r\nEnd Property<\/pre>\n<p><!--30percent--><\/p>\n<p>Die Routine verwendet dabei die <b>GetDefaultFolder<\/b>-Methode mit dem Argument <b>olFolderCalendar<\/b>, die immer einen Verweis auf den Kalender-Ordner zur&uuml;ckgibt.<\/p>\n<p>Gegebenenfalls m&ouml;chten Sie auf einen Unterordner des Hauptordners zugreifen. In diesem Fall verwenden Sie beispielsweise die folgende Syntax (in einer Zeile):<\/p>\n<pre>Get DefaultFolder(olFolderCalendar).Folders(&quot;MeineTermine&quot;)<\/pre>\n<p><b>Termine ausgeben<\/b><\/p>\n<p>Nun haben Sie das Werkzeug an der Hand, um komfortabel auf die Termine von Outlook zuzugreifen.<\/p>\n<p>Am einfachsten demonstriert dies die folgende Routine, die alle vorhandenen Termine ausgibt:<\/p>\n<pre>Public Sub TermineAusgeben()\r\n Dim objAppointment As Outlook.AppointmentItem\r\n For Each objAppointment In _<br \/> GetAppointmentFolder.Items\r\n Debug.Print objAppointment.Start, _<br \/> objAppointment.Subject\r\n Next objAppointment\r\nEnd Sub<\/pre>\n<p>Die Routine durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Elemente des Kalender-Ordners und gibt die Werte der Eigenschaften <b>Start <\/b>und <b>Subject <\/b>aus, was den beiden Feldern <b>Beginnt um: <\/b>und <b>Betreff <\/b>entspricht. Alle weiteren Eigenschaften lassen sich recht einfach per IntelliSense ermitteln. Beachten Sie, dass Outlook zun&auml;chst alle ganzt&auml;gigen Termine (<b>AllDayEvent = True<\/b>) und erst dann die anderen Termine ausgibt und dann aufsteigend nach dem Datum sortiert.<\/p>\n<p><b>Termine in Tabelle schreiben<\/b><\/p>\n<p>Sinnvoll f&uuml;r weitere Operationen ist das Schreiben der vorhandenen Termine in eine Tabelle. Der Entwurf dieser Tabelle sieht wie in Bild 2 aus und enth&auml;lt zu Beispielzwecken nur die wichtigsten Informationen.<\/p>\n<div class=\"abbildung\">\n            <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_01\/OutlookTermine-web-images\/pic003_opt.jpeg\" alt=\"pic003.tif\" \/>\n        <\/div>\n<div class=\"abbildung\">\n<p><b><span style=\"color:darkgrey\">Bild 2: Datenmodell der Tabelle zum Speichern der Termindaten<\/span><\/b><\/p>\n<\/p><\/div>\n<p>Dazu geh&ouml;ren ein Prim&auml;rschl&uuml;ssel und ein Feld mit einem &auml;nderungsdatum, die noch eine weitere wichtige Funktion innehaben (mehr dazu weiter unten), sowie vier Felder zum Speichern von Betreff, Inhalt, Start- und Endzeit des Termins.<\/p>\n<p>Das Prim&auml;rschl&uuml;sselfeld <b>TerminID <\/b>und das Feld <b>GeaendertAm <\/b>sind f&uuml;r den Import von Daten nur wichtig, wenn die Daten beim Import abgeglichen werden sollen. Wenn Sie einfach nur die Termine in eine leere Tabelle einlesen, die so gespeicherten Daten nutzen und die Tabelle anschlie&szlig;end praktisch wieder l&ouml;schen k&ouml;nnen, brauchen Sie die weiteren Ausf&uuml;hrungen nicht zu verfolgen.<\/p>\n<p>Wenn Sie die Daten in der Access-Tabelle beibehalten und gegebenenfalls sogar einmal zur&uuml;ck nach Outlook &uuml;bertragen m&ouml;chten, ben&ouml;tigen Sie diese beiden Felder unbedingt daf&uuml;r.<\/p>\n<p><b>EntryID und Best&auml;ndigkeit<\/b><\/p>\n<p>Es gibt eine ebenso weit verbreitete wie falsche Annahme, dass die <b>EntryID <\/b>als Eigenschaft eines Appointment-Elements (und auch der anderen Elemente wie Mails oder Kontakte) auf Outlook-Seite nicht nur ein eindeutiges, sondern auch ein best&auml;ndiges Merkmal ist. Es ist eindeutig, sofern man bei GUID-&auml;hnlichen Werten von Eindeutigkeit sprechen kann (immerhin hat die EntryID 24 Byte L&auml;nge statt der 16 Byte einer &#8222;richtigen&#8220; GUID), aber keinesfalls best&auml;ndig. Wenn Sie n&auml;mlich ein Element von einem Outlook-Ordner in einen anderen verschieben, &auml;ndert sich auch dessen <b>EntryID<\/b>.<\/p>\n<p>Das bedeutet, wenn Sie einen Outlook-Termin in einer Access-Tabelle speichern, diesen in Access anpassen und anschlie&szlig;end wieder nach Outlook exportieren m&ouml;chten, &uuml;berschreiben Sie damit nicht zwangsl&auml;ufig auch den urspr&uuml;nglichen Termin. Also sorgen Sie selbst f&uuml;r ein eindeutiges Kriterium, und das stammt in diesem Fall aus dem Prim&auml;rschl&uuml;sselfeld der Access-Tabelle.<\/p>\n<p>Dieses ist &#8211; zumindest f&uuml;r diese Tabelle &#8211; mit Sicherheit eindeutig. Leider bieten Outlook-Elemente keine Eigenschaft ohne Funktion, die man mit benutzerdefinierten Werten f&uuml;llen k&ouml;nnte. Allerdings k&ouml;nnen Sie f&uuml;r Outlook-Elemente &#8211; genau wie f&uuml;r Access-Objekte &#8211; eigene benutzerdefinierte Eigenschaften anlegen und diese M&ouml;glichkeit legen Sie f&uuml;r das Speichern des in der Access-Tabelle festgelegten Prim&auml;rschl&uuml;sselwertes fest.<\/p>\n<p>Daf&uuml;r m&uuml;ssen Sie nur drei Dinge erledigen. Als Erstes deklarieren Sie eine passende Variable:<\/p>\n<pre>Dim objUserProperty As Outlook.UserProperty<\/pre>\n<p>Anschlie&szlig;end erzeugen Sie eine neue Benutzereigenschaft und weisen dieser den gew&uuml;nschten Wert zu:<\/p>\n<pre>Set objUserProperty = .UserProperties.Add(&quot;TerminID&quot;, olText)\r\nobjUserProperty.Value = rst!TerminID<\/pre>\n<p>Das alles sind aber nur Ausschnitte aus der Routine aus Listing 3. Diese &ouml;ffnet zun&auml;chst eine Datensatzgruppe auf Basis der Tabelle <b>tblTermine<\/b>. Anschlie&szlig;end holt sie sich mit der oben vorgestellten Routine <b>GetAppointmentFolder <\/b>einen Verweis auf den Termine-Ordner von Outlook und durchl&auml;uft in einer Schleife alle Termin-Elemente. <\/p>\n<p class=\"kastentabelleheader\">Listing 3: Importieren von Outlook-Terminen in eine Access-Tabelle<\/p>\n<pre>Public Sub TermineImportieren()\r\n     Dim objAppointment As Outlook.AppointmentItem\r\n     Dim db As DAO.Database\r\n     Dim rst As DAO.Recordset\r\n     Dim objUserProperty As Outlook.UserProperty\r\n     Dim lngTerminID As Long\r\n     Set db = CurrentDb\r\n     Set rst = db.OpenRecordset(&quot;tblTermine&quot;, dbOpenDynaset)\r\n     For Each objAppointment In GetAppointmentFolder.Items\r\n         With objAppointment\r\n             lngTerminID = 0\r\n             On Error Resume Next\r\n             lngTerminID = .UserProperties.Item(&quot;TerminID&quot;).Value\r\n             On Error GoTo 0\r\n             If lngTerminID &gt; 0 Then\r\n                 rst.FindFirst &quot;TerminID = &quot; &amp; lngTerminID\r\n                 If rst.NoMatch Then\r\n                     rst.AddNew\r\n                     rst!Betreff = .Subject\r\n                     rst!Inhalt = .Body\r\n                     rst!BeginntAm = .Start\r\n                     rst!EndetAm = .End\r\n                     rst!GeaendertAm = .LastModificationTime\r\n                     Set objUserProperty = _<br \/> .UserProperties.Add(&quot;TerminID&quot;, olText)\r\n                     objUserProperty.Value = rst!TerminID\r\n                     .Save\r\n                     rst.Update\r\n                 Else\r\n                     If Not rst!GeaendertAm = .LastModificationTime Then\r\n                         rst.Edit\r\n                         rst!Betreff = .Subject\r\n                             rst!Inhalt = .Body\r\n                             rst!BeginntAm = .Start\r\n                         rst!EndetAm = .End\r\n                         rst!GeaendertAm = .LastModificationTime\r\n                         rst.Update\r\n                     End If\r\n                 End If\r\n             Else\r\n                 rst.AddNew\r\n                 rst!Betreff = .Subject\r\n                 rst!Inhalt = .Body\r\n                 rst!BeginntAm = .Start\r\n                 rst!EndetAm = .End\r\n                 rst!GeaendertAm = .LastModificationTime\r\n                 Set objUserProperty = _<br \/> .UserProperties.Add(&quot;TerminID&quot;, olText)\r\n                 objUserProperty.Value = rst!TerminID\r\n                 .Save\r\n                 rst.Update\r\n             End If\r\n         End With\r\n     Next objAppointment\r\n     rst.Close\r\n     Set rst = Nothing\r\n     Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Und dort geschehen die wesentlichen Schritte: Zun&auml;chst pr&uuml;ft die Routine, ob der Termin bereits die Benutzereigenschaft <b>TerminID <\/b>aufweist. Ist das nicht der Fall, ist der Termin sicher noch nicht in der Tabelle <b>tblTermine <\/b>vorhanden und wird dort angelegt. Ist der Termin angelegt, ermittelt die Routine noch die <b>TerminID<\/b>, erzeugt die Benutzereigenschaft <b>TerminID <\/b>f&uuml;r das Outlook-Termin-Element und schreibt den neuen Wert hinein.<\/p>\n<p>Ist die Benutzereigenschaft gesetzt, sucht die Routine in der Tabelle nach einem Termin mit dieser <b>TerminID<\/b>. Ist dieser vorhanden, vergleicht sie das &auml;nderungsdatum von Tabelleneintrag und Outlook-Element. Ist dieses gleich, geschieht weiter nichts, falls nicht, ersetzt die Routine die in der Tabelle enthaltenen Daten durch die Outlook-Daten. Wenn die <b>TerminID<\/b> noch nicht vorhanden ist, legt die Routine einen neuen Termindatensatz an, der dann zwangsl&auml;ufig auch eine neue <b>TerminID<\/b> in der Tabelle enth&auml;lt. Um eine Synchronisation zu erm&ouml;glichen, aktualisiert die Routine die <b>TerminID <\/b>des passenden Outlook-Elements auf den Wert des Prim&auml;rschl&uuml;ssels des neuen Datensatzes.<\/p>\n<p><b>Termine nach Outlook <br \/>exportieren<\/b><\/p>\n<p>Der Export funktioniert sogar noch ein wenig einfacher &#8211; zumindest, wenn man sich auf die Anzahl der daf&uuml;r verwendeten Codezeilen bezieht. Die Routine aus Listing 4 durchl&auml;uft einfach alle Datens&auml;tze der Tabelle <b>tblTermine <\/b>und macht sich zu Nutze, dass man in Outlook sogar nach dem Inhalt von benutzerdefinierten Feldern suchen kann (bei einigen eingebauten Feldern wie etwa <b>EntryID <\/b>funktioniert das nicht). In diesem Fall versucht die Routine zun&auml;chst, einen Eintrag aus dem Kalender-Ordner zu finden, dessen benutzerdefinierte Eigenschaft <b>TerminID <\/b>den Wert des Prim&auml;rschl&uuml;ssels des aktuellen Datensatzes enth&auml;lt. Ist das nicht der Fall, legt sie einen neuen Termin mit den in der Tabelle enthaltenen Daten an und erzeugt auch die benutzerdefinierte Eigenschaft <b>TerminID <\/b>mit dem passenden Prim&auml;rschl&uuml;sselwert. Ist der Termin bereits vorhanden, pr&uuml;ft die Routine, ob sich das &auml;nderungsdatum der beiden unterscheidet. Falls ja, &uuml;bertr&auml;gt sie die Daten aus der Access-Tabelle in den Outlook-Termin.<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Importieren von Outlook-Terminen in eine Access-Tabelle<\/p>\n<pre>Public Sub TermineExportieren()\r\n     Dim objAppointment As Outlook.AppointmentItem\r\n     Dim db As DAO.Database\r\n     Dim rst As DAO.Recordset\r\n     Dim objUserProperty As Outlook.UserProperty\r\n     Dim lngTerminID As Long\r\n     Set db = CurrentDb\r\n     Set rst = db.OpenRecordset(&quot;tblTermine&quot;, dbOpenDynaset)\r\n     Do While Not rst.EOF\r\n         Set objAppointment = _<br \/> GetAppointmentFolder.Items.Find(&quot;[TerminID] = &quot; _<br \/> &amp; rst!TerminID)\r\n         If objAppointment Is Nothing Then\r\n             Set objAppointment = GetAppointmentFolder.Items.Add\r\n             With objAppointment\r\n                 .Subject = rst!Betreff\r\n                 .Body = Nz(rst!Inhalt, &quot;&quot;)\r\n                 .Start = rst!BeginntAm\r\n                 .End = rst!EndetAm\r\n                 Set objUserProperty = _<br \/> .UserProperties.Add(&quot;TerminID&quot;, olText)\r\n                 objUserProperty.Value = rst!TerminID\r\n                 .Save\r\n             End With\r\n         Else\r\n             With objAppointment\r\n                 If Not (rst!GeaendertAm = .LastModificationTime) Then\r\n                     .Subject = rst!Betreff\r\n                     .Body = Nz(rst!Inhalt)\r\n                     .Start = rst!BeginntAm\r\n                     .End = rst!EndetAm\r\n                     .Save\r\n                 End If\r\n             End With\r\n         End If\r\n         rst.MoveNext\r\n     Loop\r\n     rst.Close\r\n     Set rst = Nothing\r\n     Set db = Nothing\r\nEnd Sub<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dank der zu Beginn des Beitrags eingef&uuml;hrten &ouml;ffentlichen Eigenschaften zum Beschaffen von Objektvariablen mit Verweisen auf das Outlook-Application-Objekt, das NameSpace-Objekt und den Termin-Ordner kann man sich im Folgenden auf die Programmierung der eigentlichen Funktionen konzentrieren. Daraus resultierten zwei Routinen: eine, die alle Termine von Outlook nach Access importiert, und eine, die den umgekehrten Weg geht. Dabei versehen beide sowohl die Termin-Datens&auml;tze in Access sowie die Termin-Elemente in Outlook mit einem eindeutigen Index, wobei unter Outlook das Erzeugen einer benutzerdefinierten Eigenschaft notwendig ist. Damit ist die Voraussetzung f&uuml;r das Synchronisieren von Daten aus Access und Outlook geschaffen.<\/p>\n<p>Die beiden Routinen <b>TermineImportieren <\/b>und <b>TermineExportieren <\/b>bieten in einem Fall, n&auml;mlich dem Im- beziehungsweise Export von Terminen, die auf beiden Seiten schon vorhanden sind, aber ein unterschiedliches &auml;nderungsdatum aufweisen, ein etwas rudiment&auml;res Verhalten: Sie &uuml;berschreiben einfach die Termindaten des Zieltermins. Hier k&ouml;nnte man noch eine etwas ausgefeiltere Technik einsetzen, um zu pr&uuml;fen, welche Feldinhalte sich unterscheiden, und gegebenenfalls den Benutzer entscheiden lassen, welche Information er beibehalten m&ouml;chte. Au&szlig;erdem enth&auml;lt die Access-Tabelle nur die vier wesentlichen Termin-Eigenschaften <b>Subject<\/b>, <b>Body<\/b>, <b>Start <\/b>und <b>End<\/b>; diese kann man nach Gutd&uuml;nken erweitern. Vorsicht ist dabei nat&uuml;rlich bei der Handhabung von Terminserien geboten. Dieses Thema w&uuml;rde allerdings den Rahmen des vorliegenden Beitrags sprengen und wird gegebenenfalls an anderer Stelle behandelt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OutlookTermine.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/613FBF4D-7742-409E-9E9A-9EBBF85A953E\/aiu_439.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt eine Menge Gr&uuml;nde, von Access aus auf die in Outlook eingetragenen Termine zuzugreifen. So k&ouml;nnte man Liefertermine aus der Bestellverwaltung nach Outlook exportieren oder die Termine aus Outlook in eine Access-Datenbank importieren, um dort schneller nach den enthaltenen Informationen zu suchen. Vielleicht mag man ja auch einfach einen Terminkalender in einem ganz individuellen Format ausdrucken, was in Outlook selbst nicht m&ouml;glich ist. In diesem Beitrag erfahren Sie, wie Sie Termine zwischen Outlook und Access hin- und herschieben.<\/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":[66012007,662007,44000026,44000033],"tags":[],"class_list":["post-55000439","post","type-post","status-publish","format-standard","hentry","category-66012007","category-662007","category-Interaktiv","category-Outlook"],"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>Outlook-Termine im Griff - 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_im_Griff\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outlook-Termine im Griff\" \/>\n<meta property=\"og:description\" content=\"Es gibt eine Menge Gr&uuml;nde, von Access aus auf die in Outlook eingetragenen Termine zuzugreifen. So k&ouml;nnte man Liefertermine aus der Bestellverwaltung nach Outlook exportieren oder die Termine aus Outlook in eine Access-Datenbank importieren, um dort schneller nach den enthaltenen Informationen zu suchen. Vielleicht mag man ja auch einfach einen Terminkalender in einem ganz individuellen Format ausdrucken, was in Outlook selbst nicht m&ouml;glich ist. In diesem Beitrag erfahren Sie, wie Sie Termine zwischen Outlook und Access hin- und herschieben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:08:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491\" \/>\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=\"13\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_im_Griff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Outlook-Termine im Griff\",\"datePublished\":\"2021-02-11T21:08:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/\"},\"wordCount\":2114,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e8d5d8d51b8c4f138276f6c0d1336491\",\"articleSection\":[\"1\\\/2007\",\"2007\",\"Interaktiv\",\"Outlook\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/\",\"name\":\"Outlook-Termine im Griff - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e8d5d8d51b8c4f138276f6c0d1336491\",\"datePublished\":\"2021-02-11T21:08:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e8d5d8d51b8c4f138276f6c0d1336491\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e8d5d8d51b8c4f138276f6c0d1336491\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_im_Griff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outlook-Termine im Griff\"}]},{\"@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 im Griff - 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_im_Griff\/","og_locale":"de_DE","og_type":"article","og_title":"Outlook-Termine im Griff","og_description":"Es gibt eine Menge Gr&uuml;nde, von Access aus auf die in Outlook eingetragenen Termine zuzugreifen. So k&ouml;nnte man Liefertermine aus der Bestellverwaltung nach Outlook exportieren oder die Termine aus Outlook in eine Access-Datenbank importieren, um dort schneller nach den enthaltenen Informationen zu suchen. Vielleicht mag man ja auch einfach einen Terminkalender in einem ganz individuellen Format ausdrucken, was in Outlook selbst nicht m&ouml;glich ist. In diesem Beitrag erfahren Sie, wie Sie Termine zwischen Outlook und Access hin- und herschieben.","og_url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:08:36+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Outlook-Termine im Griff","datePublished":"2021-02-11T21:08:36+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/"},"wordCount":2114,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491","articleSection":["1\/2007","2007","Interaktiv","Outlook"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/","url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/","name":"Outlook-Termine im Griff - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491","datePublished":"2021-02-11T21:08:36+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/e8d5d8d51b8c4f138276f6c0d1336491"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_im_Griff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Outlook-Termine im Griff"}]},{"@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\/55000439","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=55000439"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000439\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}