{"id":55001223,"date":"2020-02-01T00:00:00","date_gmt":"2020-07-10T09:39:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1223"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"OutlookTermine_programmieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/","title":{"rendered":"Outlook-Termine programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wie wir im Beitrag &#8222;Benutzerdefinierte Felder in Outlook&#8220; gezeigt haben, k&ouml;nnen Sie beispielsweise einem Outlook-Termin weitere Seiten mit benutzerdefinierten Steuerelementen hinzuf&uuml;gen. Wie nicht anders zu erwarten, lassen sich diese Elemente auch programmieren. Ein Einsatzzweck ist, die benutzerdefinierten Steuer-elemente beziehungsweise die dahinter stehenden Felder vorab mit Standardwerten zu f&uuml;llen &#8211; beispielsweise das Feld &#8222;Mitarbeiter&#8220; mit dem Namen des aktuellen Mitarbeiters.<\/b><\/p>\n<p><b>Ereignisse von Terminen und Steuerelementen<\/b><\/p>\n<p>Uns als Access-Entwickler interessiert neben den Objekten und Eigenschaften auch, welche Ereignisse die Objekte ausl&ouml;sen, mit denen wir arbeiten. Und nat&uuml;rlich l&ouml;sen auch Outlook-Termine Ereignisse aus und auch die durch den Entwickler hinzugef&uuml;gten Steuer-elemente.<\/p>\n<p>Schauen wir in den Objektkatalog, finden wir allein f&uuml;r das <b>AppointmentItem<\/b>-Objekt, um das es hier im Wesentlichen geht, einige Ereignisse (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_001.png\" alt=\"Ereignisse des AppointmentItem-Elements im Objektkatalog\" width=\"599,593\" height=\"533,2965\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ereignisse des AppointmentItem-Elements im Objektkatalog<\/span><\/b><\/p>\n<p>Um ein <b>AppointmentItem<\/b>, in diesem Beitrag auch Termin genannt, so zu programmieren, dass wir die hier aufgef&uuml;hrten Ereignisse implementieren, ben&ouml;tigen wir eine andere Herangehensweise als beispielsweise bei der Programmierung eines Access-Formulars oder seiner Steuer-elemente.<\/p>\n<p>Dort brauchen wir nur explizit die gew&uuml;nschten Ereignisse in das jeweilige Klassenmodul zu schreiben und f&uuml;r die Ereigniseigenschaft den Wert <b>[Ereignisprozedur] <\/b>zu hinterlegen. Unter Outlook sieht das etwas anders aus &#8211; wie genau, schauen wir uns nun im Detail an.<\/p>\n<p><b>Ereignisse beim Bearbeiten<\/b><\/p>\n<p>Als Erstes schauen wir uns an, wie wir Ereignisse abfangen k&ouml;nnen, die beim Bearbeiten eines Termins ausgel&ouml;st werden. Dazu brauchen wir eine Instanz des Termins. Wie kommen wir an diese heran Dazu gehen wir den Weg &uuml;ber das sogenannte <b>Inspector<\/b>-Element. <b>Inspector <\/b>ist das Fenster, in dem ein Outlook-Objekt &#8211; wie in diesem Fall ein Termin &#8211; angezeigt wird. &Uuml;ber das <b>Inspector<\/b>-Objekt k&ouml;nnen wir schlie&szlig;lich auf den enthaltenen Termin zugreifen, wenn der Benutzer diesen ge&ouml;ffnet hat.<\/p>\n<p><b>Neu ge&ouml;ffneten Inspector referenzieren<\/b><\/p>\n<p>Um auf ein frisch ge&ouml;ffnetes Termin-Objekt zugreifen zu k&ouml;nnen, ben&ouml;tigen wir das <b>Inspector<\/b>-Objekt. Dieses erhalten wir &uuml;ber die <b>Inspectors<\/b>-Auflistung. Dazu deklarieren wir eine Objektvariable wie die folgende im Klassenmodul <b>ThisOutlookSession <\/b>des VBA-Projekts von Outlook:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objInspectors<span style=\"color:blue;\"> As <\/span>Inspectors<\/pre>\n<p>Wir verwenden das Schl&uuml;sselwort <b>WithEvents<\/b>, um die Ereignisse dieses Objekts implementieren zu k&ouml;nnen. Die <b>Inspectors<\/b>-Auflistung hat nur eine Ereigniseigenschaft, die wir implementieren k&ouml;nnen, indem wir im linken Kombinationsfeld im VBA-Fenster des Moduls <b>ThisOutlookSession <\/b>den Eintrag <b>objInspectors <\/b>ausw&auml;hlen. Im rechten Kombinationsfeld wird dann automatisch das einzige Ereignis ausgew&auml;hlt und im VBA-Fenster die Ereignisprozedur <b>objInspectors_NewInspector <\/b>angelegt (siehe Bild 2). Diese Prozedur sieht zun&auml;chst wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_002.png\" alt=\"Anlegen des Ereignisses f&uuml;r die Inspectors-Auflistung\" width=\"599,593\" height=\"245,7499\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen des Ereignisses f&uuml;r die Inspectors-Auflistung<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspectors_NewInspector(ByVal Inspector <span style=\"color:blue;\"> As <\/span>Inspector)\r\n     \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Ereignisprozedur wird im aktuellen Zustand des Moduls niemals ausgel&ouml;st, denn die Objektvariable <b>objInspectors <\/b>wurde noch nicht gef&uuml;llt. Das holen wir nun nach, indem wir ihr in der Ereignisprozedur <b>Application_Startup <\/b>die Auflistung zuweisen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Application_Startup()\r\n     <span style=\"color:blue;\">Set<\/span> objInspectors = Outlook.Application.Inspectors\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>Application_Startup <\/b>wird bei jedem Start von Outlook aufgerufen. Sie k&ouml;nnen nun Outlook neu starten, um diese Prozedur auszul&ouml;sen, oder Sie rufen diese einfach durch Platzieren der Einf&uuml;gemarke in der Prozedur und Bet&auml;tigen der Taste <b>F5 <\/b>auf. Setzen Sie au&szlig;erdem einen Haltepunkt in die Prozedur <b>objInspectors_New-Inspector<\/b>. Wenn Sie nun zum Anwendungsfenster von Outlook wechseln und durch einen Doppelklick in den Kalender einen neuen Termin &ouml;ffnen, wird die Prozedur <b>objInspectors_NewInspector <\/b>ausgel&ouml;st und stoppt am Haltepunkt.<\/p>\n<p><b>Neues Inspector-Fenster referenzieren<\/b><\/p>\n<p>Damit kommen wir zum n&auml;chsten Schritt: Der Parameter <b>Inspector <\/b>der Prozedur <b>objInspectors_NewInspector <\/b>liefert einen Verweis auf das neue <b>Inspector<\/b>-Fenster. Dieses k&ouml;nnen wir nun wiederum mit einer Objektvariablen referenzieren, um seine Ereignisse implementieren zu k&ouml;nnen. Dazu f&uuml;gen wir dem Modul <b>ThisOutlookSession <\/b>die folgende Objektvariable hinzu, wiederum mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausgestattet:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objInspector<span style=\"color:blue;\"> As <\/span>Inspector<\/pre>\n<p>Wenn wir das neue Objekt im linken Kombinationsfeld des VBA-Fensters ausw&auml;hlen, finden wir im rechten Kombinationsfeld alle daf&uuml;r zur Verf&uuml;gung stehenden Ereignisse vor &#8211; zum Beispiel eines, das beim Wechseln der Seite ausgel&ouml;st wird (siehe Bild 3). Um dieses auszuprobieren, stellen wir in der Ereignisprozedur <b>objInspectors_NewInspector <\/b>die Objektvariable <b>objInspector <\/b>auf das mit dem Parameter <b>Inspector <\/b>gelieferte Objekt ein:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_003.png\" alt=\"Ereignisse eines Outlook-Inspectors\" width=\"599,593\" height=\"202,2722\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ereignisse eines Outlook-Inspectors<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspectors_NewInspector( ByVal Inspector<span style=\"color:blue;\"> As <\/span>Inspector)\r\n     <span style=\"color:blue;\">Set<\/span> objInspector = Inspector\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dann implementieren wir das Ereignis <b>PageChange <\/b>der neuen Objektvariablen und geben darin den Wert des Parameters <b>ActivePageName <\/b>aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspector_PageChange( ActivePageName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Aktuelle Seite: \" & ActivePageName\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen wir nun zwischen den Seiten <b>Termin <\/b>und <b>Terminplanung <\/b>hin- und herwechseln und erhalten jeweils den Titel der aktiven Seite im Direktbereich. Wenn Sie, wie im Beitrag <b>Benutzerdefinierte Felder in Outlook <\/b>(<b>www.access-im-unternehmen.de\/1221<\/b>) beschrieben, bereits eine weitere Seite namens <b>Termindetails <\/b>angelegt haben, k&ouml;nnen Sie auch diese aufrufen und den jeweiligen Namen ausgeben.<\/p>\n<p><b>Unterscheidung zwischen verschiedenen Inspector-Objekten<\/b><\/p>\n<p>Wir haben nun bewusst immer Termin-Eintr&auml;ge im <b>Inspector<\/b>-Objekt ge&ouml;ffnet. Aber auch beim &Ouml;ffnen von E-Mails oder Kontakten wird das Ereignis <b>objInspectors_NewInspector <\/b>ausgel&ouml;st. Wenn wir nun nicht mehr nur mit <b>objInspector <\/b>das ge&ouml;ffnete <b>Inspector<\/b>-Objekt referenzieren wollen, sondern auch mit einer weiteren Objektvariablen namens <b>objAppointmentItem <\/b>den im Inspector enthaltenen Termin, kann es zu Problemen kommen &#8211; beispielsweise, wenn wir gar keinen Termin-Inspector ge&ouml;ffnet haben.<\/p>\n<p>In diesem Fall m&uuml;ssen wir also zuvor pr&uuml;fen, ob &uuml;berhaupt ein Inspector mit einem Termin ge&ouml;ffnet wurde.<\/p>\n<p>Dazu deklarieren wir wieder eine Objektvariable mit dem Schl&uuml;sselwort <b>WithEvents<\/b> f&uuml;r das <b>AppointmentItem<\/b>-Objekt im neu ge&ouml;ffneten Inspector:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem<\/pre>\n<p>Dann erweitern wir die Prozedur <b>objInspectors_NewInspector <\/b>so, dass wir den Typ des enthaltenen Elements pr&uuml;fen und nur im Falle eines Appointments einen Verweis auf das Element in die Variable <b>objAppointmentItem <\/b>schreiben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspectors_NewInspector( ByVal Inspector<span style=\"color:blue;\"> As <\/span>Inspector)\r\n     <span style=\"color:blue;\">Set<\/span> objInspector = Inspector\r\n     Select Case Inspector.CurrentItem.Class\r\n         <span style=\"color:blue;\">Case <\/span>olAppointment\r\n             <span style=\"color:blue;\">Set<\/span> objAppointmentItem = Inspector.CurrentItem\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Interessant sind zum Beispiel die beiden Ereignisse <b>PropertyChange <\/b>und <b>CustomPropertyChange<\/b>, die jeweils beim &Auml;ndern von eingebauten und benutzerdefinierten Ereignissen ausgel&ouml;st werden. Das Ereignis <b>PropertyChange <\/b>k&ouml;nnen Sie so implementieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_PropertyChange( ByVal Name<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Eigenschaft ge&auml;ndert: \" & Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier k&ouml;nnen wir leider nicht &uuml;ber die <b>Properties<\/b>-Auflistung auf die Eigenschaft mit dem ge&auml;nderten Wert zugreifen, denn diese Auflistung gibt es schlicht nicht. Sie k&ouml;nnten aber per <b>Select Case <\/b>auf die &Auml;nderung bestimmter Eigenschaften reagieren, die f&uuml;r den Anwendungsfall interessant sind. Im Beispiel aus Listing 1 geben wir die Werte f&uuml;r die Eigenschaften <b>Subject <\/b>und <b>Start <\/b>aus, wenn diese ge&auml;ndert wurden.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_PropertyChange(ByVal Name<span style=\"color:blue;\"> As String<\/span>)\r\n     Select Case Name\r\n         <span style=\"color:blue;\">Case <\/span>\"Subject\"\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Die Eigenschaft '\" & Name & \"' wurde ge&auml;ndert.\"\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Neuer Wert: \" & objAppointmentItem.Subject\r\n         <span style=\"color:blue;\">Case <\/span>\"Start\"\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Die Eigenschaft '\" & Name & \"' wurde ge&auml;ndert.\"\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Neuer Wert: \" & objAppointmentItem.Start\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Eigenschaft ge&auml;ndert: \" & Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ereignisprozedur beim &Auml;ndern einer eingebauten Eigenschaft<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p><b>Objektvariablen erneut initialisieren<\/b><\/p>\n<p>Wenn Sie mit den hier vorgestellten Ereignisprozeduren experimentieren, werden Sie gelegentlich feststellen, dass diese nicht mehr wie gew&uuml;nscht funktionieren. Es kann sein, dass die Objektvariablen bei Code&auml;nderungen zur Laufzeit oder durch Laufzeitfehler geleert werden. Damit werden dann nat&uuml;rlich auch nicht mehr die f&uuml;r diese Objektvariablen implementierten Ereignisse ausgel&ouml;st. Sie sollten also gelegentlich die Prozedur <b>Application_Startup<\/b> erneut ausf&uuml;hren, um die Objektvariablen zu initialisieren.<\/p>\n<p><b>&Auml;nderungen von benutzerdefinierten Eigenschaften<\/b><\/p>\n<p>Im oben genannten Beitrag <b>Benutzerdefinierte Felder in Outlook <\/b>haben wir einem Termin eine neue Seite mit einem Feld namens <b>Mitarbeiter <\/b>hinzugef&uuml;gt. Eine &Auml;nderungen an einem solchen Feld k&ouml;nnen wir nicht &uuml;ber die Ereignisprozedur <b>PropertyChange <\/b>erfassen, sondern wir ben&ouml;tigen dazu die Ereignisprozedur <b>CustomPropertyChange<\/b>. Diese liefert ebenfalls mit dem <b>Name<\/b>-Parameter den Namen der ge&auml;nderten Eigenschaft. Im Gegensatz zu den eingebauten Eigenschaften k&ouml;nnen wir hier allerdings &uuml;ber die Auflistung <b>UserProperties <\/b>des <b>AppointmentItem<\/b>-Elements auf die Eigenschaft und ihren Wert zugreifen. Das erledigen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_CustomPropertyChange( ByVal Name<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Benutzerdefinierte Eigenschaft  ge&auml;ndert: \" & Name\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Neuer Wert: \"  & objAppointmentItem.UserProperties(Name)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Schlie&szlig;en von Termin-Objekten<\/b><\/p>\n<p>Mit den oben vorgestellten Ereignissen k&ouml;nnen Sie bereits auf &Auml;nderungen an den eingebauten und benutzerdefinierten Eigenschaften von Outlook-Terminen zugreifen. Damit k&ouml;nnten Sie die ge&auml;nderten Eigenschaften beispielsweise direkt mit einer Tabelle in einer Access-Datenbank synchronisieren. Allerdings w&auml;re es ressourcenschonender, wenn wir dies erst beim Schlie&szlig;en des Termin-Elements erledigen.<\/p>\n<p>Dazu k&ouml;nnen wir beispielsweise eines der Ereignisse <b>Close <\/b>oder <b>Unload <\/b>nutzen.  Wir legen beide Ereignisprozeduren an und versehen diese mit Haltepunkten, um zu pr&uuml;fen, zu welchem Zeitpunkt diese beiden Ereignisse ausgel&ouml;st werden und in welcher Reihenfolge. In unseren Tests haben wir festgestellt, dass nur <b>Close <\/b>ausgel&ouml;st wird, <b>Unload <\/b>jedoch nicht.<\/p>\n<p>F&uuml;r unsere Zwecke w&uuml;rde es jedoch reichen, wenn die <b>Close<\/b>-Ereignisprozedur ausgel&ouml;st wird &#8211; in dieser k&ouml;nnen wir noch auf alle Eigenschaften des Termin-Elements zugreifen und wir k&ouml;nnen das Schlie&szlig;en gegebenenfalls auch noch abbrechen, wenn Informationen fehlen. Das gestalten wir dann beispielsweise so:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_Close(Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>objAppointmentItem.UserProperties(\"Mitarbeiter\")  = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Tragen Sie den Mitarbeiter ein.\"\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das setzt nat&uuml;rlich voraus, dass Sie wie im Beitrag <b>Benutzerdefinierte Felder in Outlook <\/b>beschrieben, ein benutzerdefiniertes Feld namens <b>Mitarbeiter <\/b>angelegt und auch &uuml;ber die Benutzeroberfl&auml;che verf&uuml;gbar gemacht haben. Praktisch w&auml;re es, wenn wir den Bereich, in dem sich das Steuer-element zur Eingabe des benutzerdefinierten Feldes befindet, noch einblenden k&ouml;nnten. Dazu erweitern wir die Prozedur wie in Listing 2. Hier fragen wir den Benutzer noch, ob er den Mitarbeiter eintragen m&ouml;chte. Falls ja, wechseln wir mit der Methode <b>SetCurrentFormPage <\/b>des <b>Inspector<\/b>-Objekts zum Formularbereich <b>Termindetails<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_Close(Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intResult<span style=\"color:blue;\"> As <\/span>VbMsgBoxResult\r\n     <span style=\"color:blue;\">If <\/span>objAppointmentItem.UserProperties(\"Mitarbeiter\") = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         intResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Es ist kein Mitarbeiter zugeordnet. Noch eintragen\", vbYesNo)\r\n         <span style=\"color:blue;\">If <\/span>intResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n             objInspector.SetCurrentFormPage \"Termindetails\"\r\n             Cancel = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Abbrechen des Schlie&szlig;ens, wenn noch kein Mitarbeiter eingetragen wurde<\/span><\/b><\/p>\n<p>Damit landen wir dann auf der Seite, die in Bild 4 abgebildet ist. Nach der Eingabe eines Wertes in das Textfeld k&ouml;nnen Sie das Termin-Element allerdings noch nicht schlie&szlig;en &#8211; es erscheint die gleiche Meldung wie zuvor. Der Grund ist, dass der eingegebene Wert nun zwar im Textfeld vorliegt, aber noch nicht in der zugrundeliegenden benutzerdefinierten Eigenschaft. Aber wann landet der Wert im benutzerdefinierten Feld und wie k&ouml;nnen wir nicht nur auf das benutzerdefinierte Feld, sondern auch auf das Steuer-element und seinen Inhalt zugreifen Das schauen wir uns im n&auml;chsten Abschnitt an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_004.png\" alt=\"Wechseln zum benutzerdefinierten Formularbereich\" width=\"599,593\" height=\"275,2074\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Wechseln zum benutzerdefinierten Formularbereich<\/span><\/b><\/p>\n<p><b>Steuer-elemente im Formularbereich referenzieren<\/b><\/p>\n<p>Um Steuer-elemente in einem Formularbereich zu referenzieren, ben&ouml;tigen wir zun&auml;chst einen Verweis auf den Formularbereich. Aber welchen Objekttyp hat der Formularbereich eigentlich Das finden wir im Zweifel mit der <b>Typename<\/b>-Funktion heraus. Und wie kommen wir &uuml;berhaupt an den Formularbereich heran Dazu haben wir im Objektkatalog die Eigenschaften der beteiligten Objekte durchgesehen. F&uuml;r das <b>Inspector<\/b>-Element haben wir schlie&szlig;lich die Eigenschaft <b>ModifiedFormPages <\/b>gefunden, deren Inhalt wir wie nachfolgend der Variablen <b>obj-Pages <\/b>vom Typ <b>Pages <\/b>zuweisen. Die <b>Count<\/b>-Eigenschaft liefert den Wert <b>1 <\/b>und die Funktion <b>Typename <\/b>f&uuml;r diesen einen Eintrag liefert den Wert <b>UserForm<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspectors_NewInspector( ByVal Inspector<span style=\"color:blue;\"> As <\/span>Inspector)\r\n     <span style=\"color:blue;\">Dim <\/span>objPages<span style=\"color:blue;\"> As <\/span>Outlook.Pages\r\n     <span style=\"color:blue;\">Set<\/span> objInspector = Inspector\r\n     Select Case Inspector.CurrentItem.Class\r\n         <span style=\"color:blue;\">Case <\/span>olAppointment\r\n             <span style=\"color:blue;\">Set<\/span> objAppointmentItem = Inspector.CurrentItem\r\n             <span style=\"color:blue;\">Set<\/span> objPages = objInspector.ModifiedFormPages\r\n             <span style=\"color:blue;\">Debug.Print<\/span> objPages.Count\r\n             <span style=\"color:blue;\">Debug.Print<\/span> TypeName(objPages(1))\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen wir nun im Kopf des Klassenmoduls die folgende Deklaration vornehmen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents objUserForm<span style=\"color:blue;\"> As <\/span>UserForm<\/pre>\n<p>Dabei f&auml;llt uns allerdings auf, dass die Klasse <b>UserForm <\/b>gar nicht per IntelliSense angeboten wird. Kein Wunder: Die <b>UserForm<\/b>-Klasse ist auch Teil der Bibliothek <b>Microsoft Forms 2.0 Object Library<\/b>, die im VBA-Projekt von Outlook nicht standardm&auml;&szlig;ig referenziert wird. Und leider finden wir diese auch nicht im <b>Verweise<\/b>-Dialog. Es gibt jedoch einen alternativen Weg, um diesen Verweis hinzuzuf&uuml;gen. Dazu legen Sie im VBA-Projekt eine UserForm &uuml;ber den Men&uuml;eintrag <b>Einf&uuml;gen|UserForm <\/b>an. Dies f&uuml;gt automatisch den Eintrag <b>Microsoft Forms 2.0 Object Library <\/b>zur Liste der Verweise hinzu (siehe Bild 5). Die hinzugef&uuml;gte UserForm k&ouml;nnen Sie danach wieder entfernen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_005.png\" alt=\"Verweis auf die Bibliothek Microsoft Forms 2.0 Object Library\" width=\"499,6607\" height=\"393,9009\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Verweis auf die Bibliothek Microsoft Forms 2.0 Object Library<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen wir die obige Prozedur noch um eine Schleife erweitern, die alle Steuerelemente der UserForm im Direktbereich ausgibt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>MSForms.Control\r\nFor Each ctl In objUserForm.Controls\r\n     <span style=\"color:blue;\">Debug.Print<\/span> ctl.Name\r\n<span style=\"color:blue;\">Next<\/span> ctl<\/pre>\n<p>Das liefert in unserem Fall:<\/p>\n<pre><span style=\"color:blue;\">Text<\/span>Box1\r\nLabel1<\/pre>\n<p>Die Textbox k&ouml;nnen wir wiederum referenzieren. Auch sie stellt Ereignisprozeduren bereit, daher erfolgt die Deklaration wieder mit dem Schl&uuml;sselwort <b>WithEvents<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents txt<span style=\"color:blue;\"> As <\/span>MSForms.TextBox<\/pre>\n<p>Die Prozedur <b>objInspectors_NewInspector <\/b>erweitern wir um die folgende Anweisung:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> txt = objUserForm.Controls(\"TextBox1\")<\/pre>\n<p>Damit k&ouml;nnen wir &uuml;ber die beiden Kombinationsfelder im Codefenster auch f&uuml;r das Textfeld Ereignisprozeduren implementieren.<\/p>\n<p><b>Ereignisprozeduren f&uuml;r alle F&auml;lle<\/b><\/p>\n<p>Damit haben wir nun die M&ouml;glichkeit, Ereignisprozeduren f&uuml;r die folgenden Klassen zu implementieren:<\/p>\n<ul>\n<li><b>Inspectors<\/b>: Liefert das Ereignis <b>NewInspector<\/b>.<\/li>\n<li><b>Inspector<\/b>: Liefert Ereignisse wie <b>Activate<\/b>, <b>AttachmentSelectionChange<\/b>, <b>Close<\/b>, <b>Deactivate <\/b>oder <b>PageChange<\/b>.<\/li>\n<li><b>AppointmentItem<\/b>: Bietet Ereignisse wie <b>Close<\/b>, <b>Custom-Action<\/b>, <b>CustomPropertyChange<\/b>, <b>Open<\/b>, <b>PropertyChange <\/b>oder <b>Unload<\/b>.<\/li>\n<li><b>UserForm<\/b>: Bietet Ereignisse, die beim Klicken, Doppelklicken, Drag and Drop oder Tastenbet&auml;tigung ausgel&ouml;st werden.<\/li>\n<li>Steuer-elemente der UserForm: Bieten die f&uuml;r Steuer-elemente &uuml;blichen Ereignisse.<\/li>\n<\/ul>\n<p><b>Alternativer Ort f&uuml;r Programmcode<\/b><\/p>\n<p>Wenn Sie Outlook-Elemente beispielsweise um Formular-Regionen erweitern wollen, die Sie auch an andere Benutzer weitergeben m&ouml;chten, ist das VBA-Projekt von Outlook nicht der richtige Ort. Denn dann m&uuml;ssten Sie jedem Benutzer auch noch das VBA-Projekt weitergeben beziehungsweise den darin enthaltenen Code zur Automatisierung von Vorg&auml;ngen.<\/p>\n<p>Der in diesem Fall praktischere Weg ist, den Code direkt mit dem Formularbereich anzulegen. Um das zu tun, aktivieren Sie die Anzeige der Entwicklertools im Ribbon von Outlook. Danach k&ouml;nnen Sie mit dem Befehl <b>Entwickler-tools|Benutzerdefinierte Formulare|Ein Formular entwerfen <\/b>den Dialog <b>Formular entwerfen <\/b>&ouml;ffnen. Hier finden Sie in einem der mit dem oberen Kombinationsfeld auszuw&auml;hlenden Ordner das benutzerdefinierte Formular, sofern Sie schon eines angelegt haben (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_006.png\" alt=\"Auswahl eines zu entwerfenden Formulars\" width=\"499,6607\" height=\"355,8044\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Auswahl eines zu entwerfenden Formulars<\/span><\/b><\/p>\n<p>Nach dem &Ouml;ffnen erscheint das Formular, in diesem Fall ein Termin, in der Entwurfsansicht. Hier finden Sie den Ribbon-Befehl <b>Code anzeigen <\/b>vor (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_007.png\" alt=\"Anzeigen des Codes\" width=\"599,593\" height=\"289,106\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Anzeigen des Codes<\/span><\/b><\/p>\n<p>Danach erscheint ein Fenster, das einem sehr einfachen Code-Editor entspricht. Hier k&ouml;nnen Sie zwei weitere Fenster zur Unterst&uuml;tzung bei der Eingabe von Code aufrufen, denn IntelliSense gibt es hier nicht. Diese beiden finden Sie unter dem Men&uuml;punkt <b>Schrifttyp <\/b>unter den Namen <b>Ereignishandler <\/b>und <b>Objektkatalog<\/b>. Warum der Men&uuml;punkt <b>Schrifttyp <\/b>hei&szlig;t, wollen wir an dieser Stelle nicht herausfinden.<\/p>\n<p>Mit dem Dialog <b>Ereignishandlerroutinen einf&uuml;gen <\/b>k&ouml;nnen wir Ereignisprozeduren beziehungsweise -funktionen f&uuml;r das <b>Item<\/b>-Objekt hinzuf&uuml;gen, im Screenshot zum Beispiel die <b>Open<\/b>-Ereignisprozedur (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_008.png\" alt=\"Der Skript-Editor\" width=\"599,593\" height=\"376,6037\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Der Skript-Editor<\/span><\/b><\/p>\n<p>Das <b>Item<\/b>-Objekt entspricht dabei dem <b>AppointmentItem<\/b>-Objekt, das wir weiter oben vorgestellt haben. Allerdings finden wir hier nicht alle Ereignisprozeduren, die f&uuml;r das <b>AppointmentItem<\/b>-Objekt zur Verf&uuml;gung stehen.<\/p>\n<p><b>Praktische Anwendung<\/b><\/p>\n<p>Durch die Programmierung der Ereignisprozedur <b>Item_Open <\/b>im Skript-Editor des Formulars k&ouml;nnen Sie beispielsweise Werte &auml;ndern, die beim Erstellen eines neuen Termins automatisch von der Standardvorlage &uuml;bernommen werden. Das folgende Skript soll beispielsweise daf&uuml;r sorgen, dass beim &Ouml;ffnen eines neuen Termins (das erkennen wir an <b>Item.Size = 0<\/b>) die Dauer standardm&auml;&szlig;ig auf 15 Minuten festgelegt wird statt wie sonst auf 30 Minuten:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>Item_Open()\r\n     <span style=\"color:blue;\">If <\/span>Item.Size = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Item.Duration = 15\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wenn wir das Formular dann speichern und ausf&uuml;hren oder ver&ouml;ffentlichen und einen neuen Termin auf Basis dieser Version mit dem Formular anlegen, wird das Skript nicht ausgef&uuml;hrt. Mangels Debugging-M&ouml;glichkeiten haben wir noch <b>MsgBox<\/b>-Anweisungen im Skript platziert, die jedoch nicht zur Anzeige von Meldungsfenstern f&uuml;hrten. Woran kann das liegen<\/p>\n<p><b>Benutzerdefinierter Formularcode standardm&auml;&szlig;ig deaktiviert<\/b><\/p>\n<p>Die L&ouml;sung war schnell gefunden: Benutzerdefinierter Formularcode wie der in unserer L&ouml;sung ist seit einiger Zeit standardm&auml;&szlig;ig deaktiviert. Und die Ausf&uuml;hrbarkeit kann auch nur durch Einstellungen an der Registry wiederhergestellt werden, also nicht etwa durch das Einstellen von Optionen &uuml;ber die Benutzeroberfl&auml;che. Dazu &ouml;ffnen Sie zun&auml;chst den Registry-Editor. Dann gehen Sie f&uuml;r die 32-Bit-Variante von Office wie folgt vor:<\/p>\n<ul>\n<li>F&uuml;gen Sie den Schl&uuml;ssel <b>HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftOffice16.0OutlookSecurity <\/b>hinzu.<\/li>\n<li>Legen Sie dann ein Element des Typs <b>DWORD (32-bit) <\/b>unter diesem Schl&uuml;ssel an. Das Element soll <b>DisableCustomFormItemScript <\/b>hei&szlig;en und den Wert <b>0 <\/b>erhalten (siehe Bild 9).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_009.png\" alt=\"Ausf&uuml;hrung von Skripten erlauben per Registry\" width=\"599,593\" height=\"354,451\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ausf&uuml;hrung von Skripten erlauben per Registry<\/span><\/b><\/p>\n<\/ul>\n<p>Danach m&uuml;ssen Sie noch die Klasse des Formulars angeben, f&uuml;r das Skripte ausgef&uuml;hrt werden d&uuml;rfen. Diese m&uuml;ssen Sie erst einmal herausfinden. Dazu f&uuml;gen wir unserer <b>NewInspector<\/b>-Ereignisprozedur einen entsprechenden Befehl hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objInspectors_NewInspector( ByVal Inspector<span style=\"color:blue;\"> As <\/span>Inspector)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = Inspector.CurrentItem\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objAppointmentItem.MessageClass\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das liefert f&uuml;r unser Formular <b>Termin mit Details <\/b>das folgende Ergebnis:<\/p>\n<pre>IPM.Appointment.Termin mit Details<\/pre>\n<p>Danach legen Sie einen neuen Schl&uuml;ssel in der Registry an:<\/p>\n<pre>ComputerHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftOffice16.0OutlookFormsTrustedFormScriptList<\/pre>\n<p>F&uuml;r diesen f&uuml;gen Sie einen <b>REG_SZ<\/b>-Wert hinzu, der diesen Namen erh&auml;lt:<\/p>\n<pre>IPM.Appointment.Termin mit Details<\/pre>\n<p>F&uuml;r die 64-Bit-Version von Office f&uuml;hren Sie beide Schritte ausgehend von diesem Registry-Schl&uuml;ssel aus:<\/p>\n<pre>HKEY_LOCAL_MACHINESOFTWAREMicrosoftOffice16.0Outlook...<\/pre>\n<p>Beachten Sie au&szlig;erdem, dass Sie f&uuml;r beide Schl&uuml;ssel <b>16.0 <\/b>durch Ihre Office-Version ersetzen, sollte diese von 16 abweichen. Danach starten Sie Outlook neu und probieren, ob das Skript nun funktioniert. Und siehe da &#8211; das Anlegen eines neuen Termins auf Basis unserer Vorlage zeigt die Meldungsfenster an und stellt auch die Dauer des Termins auf die gew&uuml;nschten 15 Minuten ein (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1223_010.png\" alt=\"Korrekt eingestellte Dauer\" width=\"599,593\" height=\"321,7533\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Korrekt eingestellte Dauer<\/span><\/b><\/p>\n<p><b>Weitere praktische Einstellm&ouml;glichkeiten<\/b><\/p>\n<p>Auf die gleiche Weise k&ouml;nnen Sie noch weitere Einstellungen direkt in das Skript des Formularbereichs einarbeiten. Sie k&ouml;nnen beispielsweise die Startzeit auf die aktuelle Zeit einstellen, damit neue Termine immer zum aktuellen Zeitpunkt beginnen. Dazu f&uuml;gen Sie dem Skript die folgende Anweisung hinzu:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>Item_Open()\r\n     <span style=\"color:blue;\">If <\/span>Item.Size = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Item.Start = Now\r\n         Item.Duration = 15\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wenn Sie beispielsweise noch die Anzeige von Erinnerungen unterbinden wollen, stellen Sie dies mit folgender Zeile ein:<\/p>\n<pre>Item.Reminder<span style=\"color:blue;\">Set<\/span> = <span style=\"color:blue;\">False<\/span><\/pre>\n<p><b>&Uuml;bernehmen des Mitarbeiters ohne Wechsel des Formulars<\/b><\/p>\n<p>Weiter oben hatten wir noch die offene Frage, wann der Mitarbeiter vom Textfeld in das daran angebundene benutzerdefinierte Feld eingetragen wird. Einfaches Eintragen reicht nicht, da nach dem Schlie&szlig;en immer noch die Meldung erscheint, dass der Mitarbeiter nicht eingegeben wurde.<\/p>\n<p>Das ist auch der Fall, wenn wir nach der Meldung zum benutzerdefinierten Formular wechseln, dort einen Wert in das Textfeld eintragen und dann erneut versuchen, das Formular zu schlie&szlig;en. Also f&uuml;gen wir der Prozedur, die dies pr&uuml;ft, eine Anweisung hinzu, die vorher den Inhalt des Textfeldes in das benutzerdefinierte Feld &uuml;bertr&auml;gt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objAppointmentItem_Close(Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intResult<span style=\"color:blue;\"> As <\/span>VbMsgBoxResult\r\n     objAppointmentItem.UserProperties(\"Mitarbeiter\") =  objUserForm.Controls(\"Textbox1\").Value\r\n     <span style=\"color:blue;\">If <\/span>objAppointmentItem.UserProperties(\"Mitarbeiter\")  = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Leider lassen sich nicht alle Elemente dieser Prozedur in die Skripte des benutzerdefinierten Formulars &uuml;bertragen. Daher ist ab einer bestimmten Komplexit&auml;t dennoch das &Uuml;bertragen des VBA-Projekts von Outlook beziehungsweise der enthaltenen Prozeduren erforderlich.<\/p>\n<p><b>Mitarbeiter vorbelegen<\/b><\/p>\n<p>Schlie&szlig;lich kommen wir noch zum benutzerdefinierten Feld <b>Mitarbeiter<\/b>, das wir bisher noch nicht per Code gef&uuml;llt haben. Das erledigen wir ebenfalls in der Prozedur <b>objInspectors_NewInspector<\/b>, wo wir am Ende die folgende Anweisung hinzuf&uuml;gen:<\/p>\n<pre>objAppointmentItem.UserProperties(\"Mitarbeiter\") = Environ$(\"Username\")<\/pre>\n<p>Diese ermittelt aus <b>Environ$(&#8222;Username&#8220;) <\/b>den Namen des aktuellen Windows-Benutzers und tr&auml;gt diesen f&uuml;r das benutzerdefinierte Feld ein.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Sie haben hier einen &Uuml;berblick &uuml;ber die M&ouml;glichkeit der Programmierung von Terminen erhalten. Damit haben wir allerdings nur die Spitze des Eisbergs gesehen, denn es gibt noch viele weitere M&ouml;glichkeiten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie wir im Beitrag &#8222;Benutzerdefinierte Felder in Outlook&#8220; gezeigt haben, k&ouml;nnen Sie beispielsweise einem Outlook-Termin weitere Seiten mit benutzerdefinierten Steuerelementen hinzuf&uuml;gen. Wie nicht anders zu erwarten, lassen sich diese Elemente auch programmieren. Ein Einsatzzweck ist, die benutzerdefinierten Steuer-elemente beziehungsweise die dahinter stehenden Felder vorab mit Standardwerten zu f&uuml;llen &#8211; beispielsweise das Feld Mitarbeiter mit dem Namen des aktuellen Mitarbeiters.<\/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-55001223","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 programmieren - 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_programmieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outlook-Termine programmieren\" \/>\n<meta property=\"og:description\" content=\"Wie wir im Beitrag &quot;Benutzerdefinierte Felder in Outlook&quot; gezeigt haben, k&ouml;nnen Sie beispielsweise einem Outlook-Termin weitere Seiten mit benutzerdefinierten Steuerelementen hinzuf&uuml;gen. Wie nicht anders zu erwarten, lassen sich diese Elemente auch programmieren. Ein Einsatzzweck ist, die benutzerdefinierten Steuer-elemente beziehungsweise die dahinter stehenden Felder vorab mit Standardwerten zu f&uuml;llen - beispielsweise das Feld Mitarbeiter mit dem Namen des aktuellen Mitarbeiters.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:39:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f\" \/>\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_programmieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Outlook-Termine programmieren\",\"datePublished\":\"2020-07-10T09:39:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/\"},\"wordCount\":3078,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/26776e74873547a5bb8b12b29bd1bb5f\",\"articleSection\":[\"1\\\/2020\",\"2020\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/\",\"name\":\"Outlook-Termine programmieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/26776e74873547a5bb8b12b29bd1bb5f\",\"datePublished\":\"2020-07-10T09:39:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/26776e74873547a5bb8b12b29bd1bb5f\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/26776e74873547a5bb8b12b29bd1bb5f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTermine_programmieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outlook-Termine programmieren\"}]},{\"@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 programmieren - 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_programmieren\/","og_locale":"de_DE","og_type":"article","og_title":"Outlook-Termine programmieren","og_description":"Wie wir im Beitrag \"Benutzerdefinierte Felder in Outlook\" gezeigt haben, k&ouml;nnen Sie beispielsweise einem Outlook-Termin weitere Seiten mit benutzerdefinierten Steuerelementen hinzuf&uuml;gen. Wie nicht anders zu erwarten, lassen sich diese Elemente auch programmieren. Ein Einsatzzweck ist, die benutzerdefinierten Steuer-elemente beziehungsweise die dahinter stehenden Felder vorab mit Standardwerten zu f&uuml;llen - beispielsweise das Feld Mitarbeiter mit dem Namen des aktuellen Mitarbeiters.","og_url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:39:47+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f","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_programmieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Outlook-Termine programmieren","datePublished":"2020-07-10T09:39:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/"},"wordCount":3078,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f","articleSection":["1\/2020","2020","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/","url":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/","name":"Outlook-Termine programmieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f","datePublished":"2020-07-10T09:39:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/26776e74873547a5bb8b12b29bd1bb5f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/OutlookTermine_programmieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Outlook-Termine programmieren"}]},{"@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\/55001223","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=55001223"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001223\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}