{"id":55000415,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-24T18:01:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=415"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Kalender_und_Termine_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Kalender_und_Termine_programmieren\/","title":{"rendered":"Outlook: Kalender und Termine programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/d9184477a6e14b3e8fa3d6d09404ed06\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Outlook-Kalender und -Termine sind neben den E-Mails und Kontakten weitere wichtige Elemente. In diesem Artikel schauen wir uns an, wie wir per VBA auf die einzelnen Kalender und die darin enthaltenen Termine zugreifen k&ouml;nnen. Dabei durchlaufen wir Kalender und Termine, um diese auszulesen, legen neue Termine an, l&ouml;schen Termine und bearbeiten vorhandene Termine. Wozu das alles? Damit wir wissen, welche Elemente und welche Eigenschaften wir per VBA referenzieren m&uuml;ssen, um verschiedene Aufgaben erf&uuml;llen zu k&ouml;nnen: Zugriff von anderen Anwendungen, um Termine anzulegen, Termine zu lesen oder auch um Termine aus Outlook heraus in andere Kalenderanwendungen wie beispielsweise Google Calendar zu exportieren.<\/b><\/p>\n<p>Den Outlook-Kalender d&uuml;rfte mittlerweile jeder kennen: Er bietet auf der linken Seite die Monats&uuml;bersicht, auf der rechten Seite sehen wir die jeweils aktive Ansicht der Termine. In Bild 1 wird beispielsweise die Monats&uuml;bersicht dargestellt. Daneben gibt es auch noch Tages- und verschiedene Wochenansichten. Die Ansichten interessieren uns in diesem Artikel jedoch nicht, denn wir wollen ausschlie&szlig;lich per VBA auf die enthaltenen Termine zugreifen. Dabei haben wir folgende Aktionen im Blick:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_415_001.png\" alt=\"Der Outlook-Kalender in der Monatsansicht\" width=\"700\" height=\"452,9411\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der Outlook-Kalender in der Monatsansicht<\/span><\/b><\/p>\n<ul>\n<li>Referenzieren von Kalendern<\/li>\n<li>Funktion zum Holen des Standardkalenders<\/li>\n<li>Durchlaufen und Referenzieren von Terminen<\/li>\n<li>Aktuell markierten Termin referenzieren<\/li>\n<li>Wichtige Eigenschaften von Terminen<\/li>\n<li>Eigenschaften f&uuml;r den aktuellen Termin ausgeben <\/li>\n<li>Details zu Erinnerungen<\/li>\n<li>Methoden von Terminen<\/li>\n<li>Ereignisse von Terminen<\/li>\n<li>Anlegen eines neuen Termins<\/li>\n<li>Auslesen bestimmter Termine<\/li>\n<li>L&ouml;schen vorhandener Termine<\/li>\n<li>Bearbeiten vorhandener Termine<\/li>\n<li>Details zu Zeitzonen<\/li>\n<\/ul>\n<h2>Wo programmieren wir Outlook?<\/h2>\n<p>Wir f&uuml;hren die nachfolgend vorgestellten Beispiele im VBA-Projekt von Outlook aus. Das hei&szlig;t, dass wir Outlook &ouml;ffnen und mit der Tastenkombination <b>Alt + F11 <\/b>zum VBA-Editor wechseln. Hier legen wir f&uuml;r unsere Beispiele ein neues Modul an, beispielsweise namens <b>mdlKalenderUndTermine<\/b>. Mehr zum Ausf&uuml;hren von VBA-Prozeduren in Outlook haben wir im Artikel <b>Outlook: Codebeispiele ausprobieren <\/b>(<b>www.vbentwickler.de\/313<\/b>) beschrieben.<\/p>\n<h2>Referenzieren von Kalendern<\/h2>\n<p>Unter Outlook finden wir den Standardkalender und gegebenenfalls noch weitere, freigegebene Kalender. Wir wollen uns in diesem Artikel auf den Standardkalender beziehen.<\/p>\n<p>Dazu nutzen wir die Prozedur aus Listing 1. Hier deklarieren wir zun&auml;chst Objektvariablen f&uuml;r die Outlook-Anwendung selbst, f&uuml;r den MAPI-Namespace, der alle Informationen wie E-Mails, Kontakte, Termine et cetera enth&auml;lt und eine <b>Folder<\/b>-Variable namens <b>objCalendar<\/b>. Warum der Datentyp <b>Folder<\/b>? Weil alle Elemente von Outlook in Foldern gespeichert sind. Es gibt kein spezielles Objekt etwa mit dem Typ <b>Calendar<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ReferenceCalendar()\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\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>objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = objOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = objMAPI.GetDefaultFolder(olFolderCalendar)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Calender name: \" & objCalendar.Name\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Appointments: \" & objCalendar.Items.count\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Referenzieren des Standardkalenders<\/span><\/b><\/p>\n<p>Danach referenzieren wir zuerst die Outlook-Anwendung. Mit <b>New Outlook.Application <\/b>greifen wir entweder auf die laufende Outlook-Anwendung zu oder erzeugen eine neue Instanz.<\/p>\n<p>In der aktuellen Umgebung, also im VBA-Editor mit dem VBA-Projekt von Outlook, sollten wir allerdings mit <b>Application <\/b>auf die aktuelle Outlook-Instanz zugreifen &#8211; hier k&ouml;nnte die Verwendung von <b>New Outlook.Application <\/b>zu Problemen f&uuml;hren. Aber damit wir den Code ohne Umschweife in andere VBA-Projekte beispielsweise von Excel oder Access &uuml;bertragen oder diesen in twinBASIC oder &auml;hnlichen Entwicklungsumgebungen nutzen k&ouml;nnen, greifen wir hier im Text explizit auf die jeweiligen Objekte zu.<\/p>\n<p>Die n&auml;chste Anweisung referenziert den MAPI-Namespace mit der Variablen <b>objMAPI<\/b>. Dann greifen wir mit der <b>GetDefaultFolder <\/b>und dem Parameter <b>olFolderCalendar <\/b>auf den <b>Kalender<\/b>-Ordner von Outlook zu und speichern den Verweis in <b>objCalendar<\/b>. Dann geben wir den Namen des Folders aus, der in der deutschen Version Kalender hei&szlig;t, und ermitteln noch die Anzahl der im Kalenderordner enthaltenen Elemente.<\/p>\n<h2>Funktion zum Holen des Standardkalenders<\/h2>\n<p>Diese Schritte sind immer n&ouml;tig, wenn wir auf Elemente des Kalender-Ordners zugreifen wollen. Damit wir nicht immer die gleichen Anweisungen in die folgenden Beispielprozeduren und -funktionen schreiben m&uuml;ssen, programmieren wir die Prozedur <b>ReferenceCalendar <\/b>in eine Funktion um, die wir <b>GetDefaultCalendar <\/b>nennen. Diese Funktion soll einen R&uuml;ckgabewert des Datentyps <b>Folder<\/b> liefern. Sie enth&auml;lt weitestgehend die gleichen Anweisungen wie die Prozedur, von der sie abgeleitet wurde &#8211; am Ende gibt sie jedoch noch den Verweis auf den Kalender als Funktionswert zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetDefaultCalendar()<span style=\"color:blue;\"> As <\/span>Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\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>objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = objOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = _\r\n         objMAPI.GetDefaultFolder(olFolderCalendar)\r\n     <span style=\"color:blue;\">Set<\/span> GetDefaultCalendar = objCalendar\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Durchlaufen und Referenzieren von Terminen<\/h2>\n<p>In der folgenden Prozedur durchlaufen wir alle Termine des aktuellen Kalenders. Das k&ouml;nnen, wenn Du den Kalender intensiv nutzt, viele Eintr&auml;ge sein. Du kannst vorsichtshalber innerhalb der Schleife die Anweisung <b>DoEvents <\/b>einbauen, damit Du zwischenzeitlich abbrechen kannst, wenn es zu lange dauert.<\/p>\n<p>Die Prozedur <b>ListAppointments <\/b>deklariert zwei Objekte zum Referenzieren der Kalender-Eintr&auml;ge. Eigentlich wollen wir auf die <b>AppointmentItem<\/b>-Elemente zugreifen, aber der Kalender-Ordner kann auch Elemente anderer Typen enthalten. Deshalb referenzieren wir jedes Element erst einmal mit der Variablen <b>objItem <\/b>mit dem allgemeinen Datentyp <b>Object<\/b>.<\/p>\n<p>Zuvor lesen wir allerdings den Kalender-Ordner mit der zuvor beschriebenen Funktion <b>GetDefaultCalendar <\/b>ein. Danach durchlaufen wir in einer <b>For&#8230;Each<\/b>-Schleife alle Elemente der Auflistung <b>objCalendar.Items<\/b>. In der Schleife untersuchen wir in einer <b>Select Case<\/b>-Bedingung den Wert von <b>TypeName(objItem)<\/b>, was beispielsweise die Zeichenkette <b>AppointmentItem <\/b>liefert. Genau diesen Fall wollen wir untersuchen und weisen den Inhalt von <b>objItem <\/b>der Variablen <b>objAppointmentItem <\/b>zu. Dann geben wir beispielhaft den Betreff des Termins aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ListAppointments()\r\n     <span style=\"color:blue;\">Dim <\/span>objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Dim <\/span>objItem<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = GetDefaultCalendar\r\n     For Each objItem In objCalendar.Items\r\n         Select Case TypeName(objItem)\r\n             <span style=\"color:blue;\">Case <\/span>\"AppointmentItem\"\r\n                 <span style=\"color:blue;\">Set<\/span> objAppointmentItem = objItem\r\n                 <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> .Subject\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Aktuell markierten Termin referenzieren<\/h2>\n<p>Gerade beim Experimentieren mit den Eigenschaften von Kalenderelementen kann es hilfreich sein, den aktuell markierten Eintrag im Kalender zu referenzieren.<\/p>\n<p>Das erledigen wir mit der folgenden Funktion, die ein Objekt des Typs <b>Outlook.AppointmentItem <\/b>zur&uuml;ckliefern soll. Sie referenziert erst die Outlook-Anwendung und dann den aktiven Explorer (sprich: das Hauptfenster).<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft sie, ob der Wert der Eigenschaft <b>Count <\/b>der Auflistung <b>Selection <\/b>ungleich <b>0 <\/b>ist. In diesem Fall referenziert sie das erste markierte Element mit der Variablen <b>objAppointmentItem<\/b>, das sie dann auch als Funktionswert zur&uuml;ckliefert:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetSelectedAppointmentItem() _\r\n        <span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objExplorer<span style=\"color:blue;\"> As <\/span>Outlook.Explorer\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objExplorer = objOutlook.ActiveExplorer\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objExplorer.Selection.count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objAppointmentItem = _\r\n             objExplorer.Selection.Item(1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetSelectedAppointmentItem = objAppointmentItem\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Wichtige Eigenschaften von Terminen<\/h2>\n<p>Bevor wir nun genauer auf die verschiedenen Aktionen eingehen, die wir mit Terminen erledigen k&ouml;nnen, sehen wir uns einige wichtige Eigenschaften von Terminen an. In Bild 2 haben wir markiert, wo wir einige der Eigenschaften in einem Outlook-Termin in der Benutzeroberfl&auml;che finden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_415_003.png\" alt=\"Ein Termin im Inspektor.\" width=\"700\" height=\"377,7197\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ein Termin im Inspektor.<\/span><\/b><\/p>\n<p>Und hier sind die Eigenschaften:<\/p>\n<ul>\n<li><b>AllDayEvent<\/b>: Gibt an, ob es sich um einen ganzt&auml;tigen Termin handelt.<\/li>\n<li><b>BillingInformation<\/b>: Normalerweise nicht genutzte Eigenschaft, die man mit benutzerdefinierten Werten f&uuml;llen kann.<\/li>\n<li><b>Body<\/b>: Inhalt des Termins.<\/li>\n<li><b>BodyFormat<\/b>: Format des Inhalts, kann die Werte <b>olFormatHTML<\/b>, <b>olFormatPlain <\/b>oder <b>olFormatRichText <\/b>annehmen.<\/li>\n<li><b>BusyStatus<\/b>: Zeigt an, welchen Status der Bericht anzeigen soll &#8211; zum Beispiel <b>Frei <\/b>(<b>0 <\/b>&#8211; <b>olFree<\/b>), <b>An anderem Ort t&auml;tig <\/b>(<b>4 <\/b>&#8211; <b>olWorkingElsewhere<\/b>), <b>Mit Vorbehalt <\/b>(<b>1 <\/b>&#8211; <b>olTentative<\/b>), <b>Gebucht <\/b>(<b>2 <\/b>&#8211; <b>olBusy<\/b>) oder <b>Au&szlig;er Haus <\/b>(<b>3 <\/b>&#8211; <b>olOutOfOffice<\/b>) (siehe Bild 3)<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_415_004.png\" alt=\"Status eines Termins\" width=\"424,6267\" height=\"240,5067\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Status eines Termins<\/span><\/b><\/p>\n<li><b>Categories<\/b>: Kategorien des Termins. Liefert eine Liste der Kategorien, denen der Termin zugeordnet ist.<\/li>\n<li><b>Duration<\/b>: Dauer des Termins in Minuten<\/li>\n<li><b>End<\/b>: Ende des Termins mit dem Datentyp <b>Date<\/b><\/li>\n<li><b>EndTimeZone<\/b>: Gibt die Zeitzone f&uuml;r das Ende des Termins an.<\/li>\n<li><b>EndInEndTimeZone<\/b>: Gibt die Zeit f&uuml;r das Ende des Termins in der als Parameter &uuml;bergebenen Zeitzone an.<\/li>\n<li><b>EntryID<\/b>: Eindeutige ID des Termins<\/li>\n<li><b>Importance<\/b>: Gibt die Priorit&auml;t des Termins an. M&ouml;gliche Werte sind <b>0 <\/b>&#8211; <b>olImportanceLow<\/b>, <b>1 <\/b>&#8211; <b>olImportanceNormal <\/b>und <b>2 <\/b>&#8211; <b>olImportanceHigh<\/b>.<\/li>\n<li><b>IsRecurring<\/b>: Gibt an, ob es sich um einen Serientermin handelt.<\/li>\n<li><b>GetOrganizer<\/b>: Liefert den Organisator des Termins.<\/li>\n<li><b>Location<\/b>: Gibt den Ort des Termins an.<\/li>\n<li><b>ReminderMinutesBeforeStart<\/b>: Gibt an, wie viele Minuten vor einem Termin eine Erinnerung erfolgen soll. <\/li>\n<li><b>ReminderOverrideDefault<\/b>: Gibt an, ob die Standardeinstellungen des Benutzers f&uuml;r eine Erinnerung &uuml;berschrieben werden sollen.<\/li>\n<li><b>ReminderPlaySound<\/b>: Gibt an, ob mit der Erinnerung ein Ton abgespielt werden soll.<\/li>\n<li><b>ReminderSet<\/b>: Gibt an, ob eine Erinnerung ausgegeben werden soll.<\/li>\n<li><b>ReminderSoundFile<\/b>: Gibt den Pfad zu einer Sounddatei an, die bei Eintreten der Erinnerung abgespielt werden soll.<\/li>\n<li><b>RTFBody<\/b>: Inhalt des Termins im RTF-Format<\/li>\n<li><b>Sensitivity<\/b>: Gibt an, wie vertraulich der Termin ist. M&ouml;gliche Werte sind <b>0 <\/b>&#8211; <b>olNormal<\/b>, <b>1 <\/b>&#8211; <b>olPersonal<\/b>, <b>2 <\/b>&#8211; <b>olPrivate<\/b> oder <b>3 <\/b>&#8211; <b>olConfidental<\/b>. Nur die Werte <b>0 <\/b>und <b>2 <\/b>k&ouml;nnen &uuml;ber die Benutzeroberfl&auml;che eingestellt werden. Bei <b>0<\/b>, <b>1 <\/b>und <b>3<\/b> ist die Umschaltfl&auml;che <b>Privat <\/b>im Ribbon nicht aktiviert, bei <b>2 <\/b>ist sie aktiviert. <\/li>\n<li><b>Start<\/b>: Start des Termins mit dem Datentyp <b>Date<\/b><\/li>\n<li><b>StartTimeZone<\/b>: Gibt die Zeitzone f&uuml;r den Start des Termins an.<\/li>\n<li><b>StartInStartTimeZone<\/b>: Gibt die Zeit f&uuml;r den Start des Termins in der als Parameter &uuml;bergebenen Zeitzone an.<\/li>\n<li><b>Subject<\/b>: Betreff des Termins<\/li>\n<\/ul>\n<h2>Eigenschaften f&uuml;r den aktuellen Termin ausgeben<\/h2>\n<p>Wenn wir schon mit der Funktion <b>GetSelectedAppointmentItem <\/b>den aktuellen Termin ermitteln k&ouml;nnen, wollen wir auch direkt einmal alle soeben vorgestellten Eigenschaften ausgeben. Dies erledigen wir mit der Prozedur <b>ShowAppointmentItemProperties<\/b> aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ShowAppointmentItemProperties()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"AllDayEvent: \" & .AllDayEvent\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"BillingInformation: \" & .BillingInformation\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Body: \" & .Body\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"BodyFormat: \" & .BodyFormat\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"BusyStatus: \" & .BusyStatus\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Categories: \" & .Categories\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Duration: \" & .Duration\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"End: \" & .End\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"EndTimeZone: \" & .EndTimeZone\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"EndInEndTimeZone: \" & .EndInEndTimeZone\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"EntryID: \" & .EntryID\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"IsRecurring: \" & .IsRecurring\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Location: \" & .Location\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Importance: \" & .Importance\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"ReminderMinutesBeforeStart: \" & .ReminderMinutesBeforeStart\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"ReminderOverrideDefault: \" & .ReminderOverrideDefault\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"ReminderPlaySound: \" & .ReminderPlaySound\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"ReminderSet: \" & .Reminder<span style=\"color:blue;\">Set<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"ReminderSoundFile: \" & .ReminderSoundFile\r\n         ''<span style=\"color:blue;\">Debug.Print<\/span> \"RTFBody: \" & .RTFBody\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Sensitivity: \" & .Sensitivity\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Start: \" & .Start\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"StartTimeZone: \" & .StartTimeZone\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"StartInStartTimeZone: \" & .StartInStartTimeZone\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Subject: \" & .Subject\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"GetOrganizer: \" & .GetOrganizer\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ausgeben der Eigenschaften eines Termins<\/span><\/b><\/p>\n<p>Hier referenzieren wir den aktuellen Termin und geben dann per <b>Debug.Print <\/b>alle besprochenen Eigenschaften mit Namen und Wert im Direktbereich aus. Die Eigenschaft <b>RTFBody<\/b> haben wir auskommentiert, da diese nur Bin&auml;rcode liefert, der ohnehin nicht lesbar ist.<\/p>\n<h2>Details zu Erinnerungen<\/h2>\n<p>Wenn wir Erinnerungen per VBA einstellen wollen, reicht es nicht wie in der Benutzeroberfl&auml;che aus, die Anzahl der Minuten einzustellen, die zwischen der Erinnerung und dem Termin liegen sollen.<\/p>\n<p>Genau genommen reicht es aus, die Eigenschaft <b>ReminderSet <\/b>auf <b>True <\/b>einzustellen. Allerdings wird dann der Standardwert f&uuml;r die Eigenschaft <b>ReminderMinutesBeforeStart <\/b>&uuml;bernommen, die bei uns auf 15 Minuten eingestellt ist. Entweder man legt den Standardwert &uuml;ber die Benutzeroberfl&auml;che auf einen anderen Wert fest (in den Outlook-Optionen im Bereich <b>Kalender|Kalenderoptionen<\/b>) oder man setzt explizit die Eigenschaft <b>ReminderMinutesBeforeStart <\/b>auf den gew&uuml;nschten Wert ein.<\/p>\n<h2>Methoden von Terminen<\/h2>\n<p>F&uuml;r Termine finden wir die folgenden wichtigen Methoden:<\/p>\n<ul>\n<li><b>Display<\/b>: Zeigt einen Termin im Inspector an.<\/li>\n<li><b>Save<\/b>: Speichert den Termin.<\/li>\n<li><b>SaveAs<\/b>: Erlaubt das Speichern eines Termins im Dateisystem. Als Parameter muss der Dateipfad angegeben werden. Als Dateiendung verwenden wir <b>.ics<\/b>, f&uuml;r den zweiten Parameter <b>Type <\/b>geben wir den Wert <b>olICal <\/b>an.<\/li>\n<\/ul>\n<h2>Ereignisse von Terminen <\/h2>\n<p>Das <b>AppointmentItem<\/b>-Element bietet auch einige Ereignisse an, die wir implementieren k&ouml;nnen. Allerdings sind diese im Kontext dieses Artikels nicht relevant, sondern eher, wenn man auf Aktionen des Benutzers &uuml;ber die Benutzeroberfl&auml;che reagieren m&ouml;chte &#8211; beispielsweise, wenn er den Termin schlie&szlig;t, eine Anlage hinzuf&uuml;gt et cetera.<\/p>\n<h2>Anlegen neuer Termine<\/h2>\n<p>Einen neuen Termin legen wir unter VBA mit der Methode <b>CreateItem <\/b>des <b>Outlook.Application<\/b>-Objekts an. Dabei &uuml;bergeben wir mit <b>olAppointmentItem <\/b>den Typ des zu erstellenden Objekts &#8211; wir k&ouml;nnen mit dieser Methode n&auml;mlich auch E-Mails, Kontakte et cetera erstellen. Das Ergebnis referenzieren wir mit der Variablen <b>objAppointmentItem<\/b>, damit wir noch seine Eigenschaften einstellen und den Termin speichern k&ouml;nnen.<\/p>\n<p>Mit der ersten Beispielprozedur erstellen wie einen Termin mit den Standardeinstellungen &#8211; das hei&szlig;t, wir nehmen keine Anpassungen von Eigenschaften vor uns speichern den Termin direkt mit der <b>Save<\/b>-Methode des <b>AppointmentItem<\/b>-Elements:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateSimpleAppointmentItem()\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = _\r\n         objOutlook.CreateItem(olAppointmentItem)\r\n     objAppointmentItem.Save\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Normalerweise werden wir allerdings noch weitere Eigenschaften einstellen wollen. Daher haben wir noch zwei weitere Beispiele vorgesehen. Im ersten legen wir einen Ganztages-Termin an. die dazu vorgesehene Funktion <b>CreateAllDayAppointmentItem <\/b>nimmt das Datum des Termins sowie den Betreff als Parameter entgegen.<\/p>\n<p>Sie legt mit <b>CreateItem <\/b>einen neuen Eintrag an und stellt die drei Eigenschaften <b>AllDayEvent<\/b>, <b>Start <\/b>und <b>Subject <\/b>ein, bevor es den neuen Termin mit der <b>Save<\/b>-Methode speichert:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateAllDayAppointmentItem(datStart<span style=\"color:blue;\"> As Date<\/span>, _\r\n         strSubject<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = _\r\n         objOutlook.CreateItem(olAppointmentItem)\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .AllDayEvent = <span style=\"color:blue;\">True<\/span>\r\n         .Start = datStart\r\n         .Subject = strSubject\r\n         .Save\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Funktion rufen wir beispielsweise wie folgt auf:<\/p>\n<pre>CreateAllDayAppointmentItem Date, _\r\n                             \"All Day Appointment \" & Date<\/pre>\n<p>Die n&auml;chste Funktion legt einen neuen Termin an und &uuml;bernimmt die per Parameter &uuml;bergebenen Daten f&uuml;r das Startdatum und das Enddatum sowie den Betreff in den neu erstellten Termin.<\/p>\n<p>Dazu nutzt sie die Eigenschaften <b>Start<\/b>, <b>End <\/b>und <b>Subject <\/b>vor dem Speichern mit der <b>Save<\/b>-Methode:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateAppointmentItem(datStart<span style=\"color:blue;\"> As Date<\/span>, _\r\n         datEnd<span style=\"color:blue;\"> As Date<\/span>, strSubject<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = _\r\n         objOutlook.CreateItem(olAppointmentItem)\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .Start = datStart\r\n         .End = datEnd\r\n         .Subject = strSubject\r\n         .Save\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ein Beispielaufruf sieht wie folgt aus. Hier &uuml;bergeben wir als Startdatum und -zeit das aktuelle Datum plus Uhrzeit und als Enddatum und -zeit den gleichen Wert plus 30 Minuten (1\/24 Tag):<\/p>\n<pre>CreateAppointmentItem Now, Now + 1 \/ 24, _\r\n     \"Appointment \" & Now<\/pre>\n<h2>Auslesen bestimmter Termine<\/h2>\n<p>Wie wir den aktuellen Termin referenzieren und seine Eigenschaften auslesen k&ouml;nnen, haben wir bereits weiter oben gezeigt.<\/p>\n<p>Allerdings m&ouml;chte man nicht immer alle Termine durchlaufen und auslesen und auch nicht immer den aktuell in Outlook markierten Termin nutzen. Stattdessen wollen wir vielleicht nur Termine in einem bestimmten Zeitraum oder mit einem bestimmten Betreff ermitteln.<\/p>\n<p>Dazu bietet Outlook ausreichend Filterm&ouml;glichkeiten an. Diese sind allerdings etwas anders als man diese beispielsweise von Access kennt, vor allem, weil es unter Outlook auch ganzt&auml;gige Termine gibt.<\/p>\n<p>Im folgenden Beispiel suchen wir erst einmal nach Terminen, die am 1.1.2024 und dem 2.1.2024 stattfinden. Dazu haben wir zwei ganzt&auml;gige Termine und drei mit Uhrzeiten hinzugef&uuml;gt:<\/p>\n<ul>\n<li>1.1.2024 Ganzt&auml;gig<\/li>\n<li>1.1.2024 0:00-1:00 Uhr<\/li>\n<li>1.1.2024 8:00-9:00 Uhr<\/li>\n<li>2.1.2024 Ganzt&auml;gig<\/li>\n<li>2.1.2024 23:00 bis 3.1.2024 0:00 Uhr<\/li>\n<\/ul>\n<p>In der folgenden Prozedur filtern wir die gew&uuml;nschten Termine heraus und geben einige ihrer Eigenschaften im Direktbereich des VBA-Editors aus. Dabei weisen wir den aktuellen Kalender-Ordner wieder der Variablen <b>objCalendar<\/b> zu. Danach stellen wir in <b>strFilter <\/b>den Filter zusammen. Dieser lautet:<\/p>\n<pre>[Start] &gt;= ''01\/01\/2024 00:00 AM'' AND [Start] &lt;= ''03\/01\/2024 00:00 AM''<\/pre>\n<p>Erst einmal ist hier anzumerken, dass wir uns nur auf den Startzeitpunkt der Termine konzentrieren. Wir erfassen also auch Termine, die innerhalb des angegebenen Zeitraums starten, aber &uuml;ber diesen hinausgehen k&ouml;nnen.<\/p>\n<p>Das Anwenden dieses Filterausdrucks erfolgt mit der <b>Restrict<\/b>-Methode auf der <b>Items<\/b>-Auflistung des Ordners aus <b>objCalendar<\/b>. Das Ergebnis weisen wir der Objektvariablen <b>objItems <\/b>mit dem Datentyp <b>Outlook.Items <\/b>zu. Nach dem Filtern sortieren wir die enthaltenen Daten noch nach dem Feld <b>Start<\/b>, da diese sonst in der Reihenfolge des Anlegens sortiert w&uuml;rden.<\/p>\n<p>Diese Auflistung k&ouml;nnen wir anschlie&szlig;end in einer <b>For Each<\/b>-Schleife durchlaufen und geben einige Eigenschaften der gefundenen Elemente aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GetAppointmentItemsByDate()\r\n     <span style=\"color:blue;\">Dim <\/span>objCalendar<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>Outlook.AppointmentItem\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>objItem<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCalendar = GetDefaultCalendar\r\n     strFilter = \"[Start] &gt;= ''01\/01\/2024 00:00 AM'' \" _\r\n         & \"AND [Start] &lt;= ''03\/01\/2024 00:00 AM''\"\r\n     <span style=\"color:blue;\">Set<\/span> objItems = objCalendar.Items.Restrict(strFilter)\r\n     objItems.Sort \"[Start]\", <span style=\"color:blue;\">False<\/span>\r\n     For Each objItem In objItems\r\n         <span style=\"color:blue;\">With<\/span> objItem\r\n             <span style=\"color:blue;\">Debug.Print<\/span> .Start, .End, .Subject\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Bez&uuml;glich des Filters sind noch Anmerkungen erforderlich. Hier ist zu sehen, dass nicht nur das Datum angegeben wird, sondern auch noch die Uhrzeit. Wer schon einmal mit SQL gearbeitet hat, h&auml;lt die Angabe der Uhrzeit in diesem Fall vielleicht f&uuml;r unn&ouml;tig. In SQL ist die Angabe des Datums 1.1.2024 gleichbedeutend mit 1.1.2024 00:00 Uhr. Das ist bei Outlook-Filtern f&uuml;r die <b>Restrict<\/b>-Methode nicht der Fall, hier muss die Uhrzeit explizit mit angegeben werden.<\/p>\n<p>Wenn wir beispielsweise den folgenden Filterausdruck angeben w&uuml;rden, fiele der erste Termin vom <b>01.01.2024 <\/b>heraus:<\/p>\n<pre>[Start] &gt;= ''01\/01\/2024'' AND [Start] &lt; ''03\/01\/2024''<\/pre>\n<h2>L&ouml;schen vorhandener Termine<\/h2>\n<p>Schlie&szlig;lich wollen wir uns noch das L&ouml;schen vorhandener Termine ansehen. Dazu brauchen wir einfach nur den zu l&ouml;schenden Termin zu referenzieren. Im folgenden Beispiel nutzen wir dazu den aktuell in Outlook markierten Termin. F&uuml;r diesen rufen wir schlie&szlig;lich die <b>Delete<\/b>-Methode auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DeleteAppointmentItem()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .Delete\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Bearbeiten vorhandener Termine<\/h2>\n<p>Um vorhandene Termine zu bearbeiten, holen wir uns eine Referenz auf diesen Termin in Form einer <b>AppointmentItem<\/b>-Variablen. Danach k&ouml;nnen wir ihre Eigenschaften nach Wunsch anpassen und speichern die &Auml;nderungen schlie&szlig;lich mit der <b>Save<\/b>-Methode.<\/p>\n<h2>Details zu Zeitzonen<\/h2>\n<p>Wir haben zur Startzeit und zur Endzeit des Termins je zwei Einstellungen zu den Zeitzonen aufgelistet. Die ersten namens <b>StartTimeZone <\/b>beziehungsweise <b>EndTimeZone <\/b>liefert die Zeitzone und erlaubt ihre Einstellung.<\/p>\n<p>Wir gehen im ersten Fall davon aus, dass wir der Organisator des Termins sind. Die Startzeit des Termins lautet 8:00 Uhr, die in Outlook eingestellte Zeitzone lautet <b>(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien <\/b>(siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_415_005.png\" alt=\"Einstellung f&uuml;r eine Zeitzone\" width=\"700\" height=\"196,9731\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Einstellung f&uuml;r eine Zeitzone<\/span><\/b><\/p>\n<p>Wenn wir den Termin markieren und die Prozedur <b>ShowAppointmentItemProperties <\/b>aufrufen, liefert dieser f&uuml;r den Termin die folgenden Informationen bez&uuml;glich Zeit und Zeitzone:<\/p>\n<pre>Start: 02.01.2024 08:00:00\r\nStartTimeZone: W. Europe Standard Time\r\nStartInStartTimeZone: 02.01.2024 08:00:00<\/pre>\n<p>&Auml;ndern wir nun als Organisator des Termins die Zeitzone, beispielsweise auf <b>(UTC+02:00) Athen, Bukarest<\/b>, wird diese Zeitzone im Termin eingestellt und die Zeit bleibt erhalten.<\/p>\n<p>Das hei&szlig;t, der Termin findet nun um 8:00 Uhr in der angegebenen Zeitzone statt. Als Benutzer der vorherigen Zeitzone m&uuml;sste man von dieser Ansicht aus erst einmal die Zeit f&uuml;r die eigene Zeitzone berechnen. Aber Outlook nimmt uns an anderer Stelle die Arbeit ab &#8211; n&auml;mlich in der Darstellung im Hauptfenster. Hier wird der Termin n&auml;mlich um 7:00 Uhr abgebildet, was korrekt ist (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_415_006.png\" alt=\"Termin nach &Auml;nderung der Zeitzone\" width=\"649,627\" height=\"320,1621\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Termin nach &Auml;nderung der Zeitzone<\/span><\/b><\/p>\n<p>Die VBA-Eigenschaften liefern nun:<\/p>\n<pre>Start: 02.01.2024 07:00:00\r\nStartTimeZone: GTB Standard Time\r\nStartInStartTimeZone: 02.01.2024 08:00:00<\/pre>\n<p>Nun schauen wir uns einen Termin an, der einen anderen Organisator hat. Der Organisator sitzt in der gleichen Zeitzone, aber das ist hier irrelevant. &Auml;ndern wir f&uuml;r diesen Termin die Zeitzone ebenfalls auf <b>(UTC+02:00) Athen, Bukarest<\/b>, erscheint der Termin in der Benutzeroberfl&auml;che genau wie beim ersten Beispiel. Allerdings &auml;ndern sich die per VBA ausgelesenen Eigenschaften wie folgt:<\/p>\n<pre>Start: 11.01.2024 07:00:00\r\nStartTimeZone: GTB Standard Time\r\nStartInStartTimeZone: 11.01.2024 08:00:00<\/pre>\n<p>Dies liefert die Daten nun aus der Sicht des Empf&auml;ngers des durch den Organisator erstellten Termins. Wir &auml;ndern die Zeitzone f&uuml;r unseren Ort auf <b>GTB Standard Time <\/b>und <b>StartInStartTimeZone <\/b>zeigt die Originalzeit in der Zeitzone des Organisators an.<\/p>\n<h2>Details zu Kategorien<\/h2>\n<p>Die Kategorien werden in der Eigenschaft <b>Categories <\/b>verwaltet. Wir k&ouml;nnen beliebige Kategorien hinzuf&uuml;gen, auch solche, die noch nicht in der Liste der Kategorien aus der Benutzeroberfl&auml;che enthalten sind. Wichtig ist nur, dass wir die Kategorien als Liste mit dem Semikolon als Trennzeichen anlegen. <\/p>\n<p>Um eine Kategorie einzustellen, verwenden wir folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SetAppointmentItemCategory()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .Categories = \"Gr&uuml;ne Kategorie\"\r\n         .Save\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Um eine Kategorie zu einer oder mehreren Kategorien hinzuzuf&uuml;gen, nutzen wir die folgende Version. Hier f&uuml;gen wir die neue Kategorie zu den bestehenden Kategorien hinzu und stellen durch ein vorangestelltes Semikolon sicher, dass die neue Kategorie separat von den vorhandenen Eintr&auml;gen angelegt wird:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddAppointmentItemCategory()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .Categories = .Categories & \";Blaue Kategorie\"\r\n         .Save\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir k&ouml;nnen auch Kategorien entfernen. Dazu ersetzen wir in der Eigenschaft <b>Categories <\/b>den Namen der zu entfernenden Kategorie durch eine leere Zeichenkette. Dabei ist zu beachten, dass der Name der zu entfernenden Kategorie nicht Bestandteil des Namens anderer Kategorien ist, da deren Name sonst ge&auml;ndert wird, was nicht erw&uuml;nscht ist:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RemoveAppointmentItemCategory()\r\n     <span style=\"color:blue;\">Dim <\/span>objAppointmentItem<span style=\"color:blue;\"> As <\/span>AppointmentItem\r\n     <span style=\"color:blue;\">Set<\/span> objAppointmentItem = GetSelectedAppointmentItem\r\n     <span style=\"color:blue;\">With<\/span> objAppointmentItem\r\n         .Categories = <span style=\"color:blue;\">Replace<\/span>(.Categories, _\r\n             \"Blaue Kategorie\", \"\")\r\n         .Save\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt die wichtigsten Techniken zum Programmieren von Terminen in Outlook. Es gibt einige Bereiche, die wir ausgespart haben, weil sie nach einem eigenen Artikel verlangen. Zum Beispiel sind die Eigenschaften zum Erfassen von Serienterminen recht umfangreich, sodass wir diese nicht in dieser Einf&uuml;hrung behandeln wollten. Wir gehen darauf in einem sp&auml;teren Artikel ein.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>mdlKalenderUndTermine.bas<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/64B6180B-A7A4-474C-8162-9CCD7E022908\/vbe_415.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Outlook-Kalender und -Termine sind neben den E-Mails und Kontakten weitere wichtige Elemente. In diesem Artikel schauen wir uns an, wie wir per VBA auf die einzelnen Kalender und die darin enthaltenen Termine zugreifen k&ouml;nnen. Dabei durchlaufen wir Kalender und Termine, um diese auszulesen, legen neue Termine an, l&ouml;schen Termine und bearbeiten vorhandene Termine. Wozu das alles? Damit wir wissen, welche Elemente und welche Eigenschaften wir per VBA referenzieren m&uuml;ssen, um verschiedene Aufgaben erf&uuml;llen zu k&ouml;nnen: Zugriff von anderen Anwendungen, um Termine anzulegen, Termine zu lesen oder auch um Termine aus Outlook heraus in andere Kalenderanwendungen wie beispielsweise Google Calendar zu exportieren.<\/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":[66012024,662024,44000026,44000023,44000036],"tags":[],"yst_prominent_words":[],"class_list":["post-55000415","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Outlook_programmieren","category-PowerApps","category-Ribbon_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000415"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000415\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000415"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}