{"id":55001100,"date":"2017-10-01T00:00:00","date_gmt":"2021-03-22T16:26:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1100"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kalendersteuerelement_Teil_2","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/","title":{"rendered":"Kalendersteuerelement, Teil 2"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das im ersten Teil dieser Ausgabe beschriebene Kalendersteuerelement eignet sich vornehmlich zur Auswahl eines Datums. Ben&ouml;tigen Sie aber eine &uuml;bersicht, wie die Termine des Outlook-Kalenders mit der Markierung von Datumsbereichen, etwa zur Darstellung Ihrer Urlaubsplanung, so sind die Anforderungen ganz andere. Auch f&uuml;r diesen Zweck stellen wir ein Pseudo-Steuerelement vor, das allein mit Access-Bordmitteln realisiert ist.<\/b><\/p>\n<h2>Terminkalender<\/h2>\n<p>Einsatzbereiche f&uuml;r solche kalendarischen &uuml;bersichten gibt es viele. Feiertage k&ouml;nnen darin eingetragen werden, Geburtstage und andere Jubilaren, die Buchung von Ferienwohnungen oder Autovermietungen, die Einsatzplanung von Mitarbeitern, oder Sie markieren hier Ihre Urlaubstage. Dabei geht es weniger um die Auswahl von Terminen, als um deren Darstellung. Bild 1 zeigt bereits, wie unser Bespiel aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_RT2.png\" alt=\"Demo des Unterformularsteuerelements Monatskalender nach Einbau in ein Hauptformular mit Markierungen\" width=\"700\" height=\"291,3236\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Demo des Unterformularsteuerelements Monatskalender nach Einbau in ein Hauptformular mit Markierungen<\/span><\/b><\/p>\n<p>Nat&uuml;rlich bauen wir hier keinen komplexen Terminkalender nach, wie den von Outlook. Das Kalendersteuerelement <b>sfrmCalendarMonths<\/b> ist eng an die einfache Version des Auswahlkalenders im ersten Teil dieser Ausgabe angelehnt, wie seine linke Seite schon vermuten l&auml;sst. Es dient in erster Linie der Visualisierung bereits vorliegender Termindaten. Beschreiben wir zun&auml;chst kurz seinen Aufbau.<\/p>\n<p>Grunds&auml;tzlich werden hier drei Monate mit ihren Tagen angezeigt. Die Auswahl der Monate geschieht mit dem Kombinationsfeld links, die den mittleren Monat einstellt. Die &uuml;brigen Navigationselemente, wie die Jahres-Combo oder die Buttons zum Weiterschalten der Monate gleichen in ihrer Funktion genau der des einfachen Auswahlkalenders. Zus&auml;tzlich ist die Kalender&uuml;bersicht noch mit einer Titelzeile oben versehen, die Sie mit beliebigem Inhalt f&uuml;llen k&ouml;nnen. Das eigentliche Feature aber sind die rot unterlegten Zellen, die durch die dem Steuerelement &uuml;ber eine &ouml;ffentliche Funktion zugewiesene Datumsbereiche zustande kommen. Mehr gibt das Steuerelement in dieser Version nicht her. Es reagiert auch nicht auf Klicks in die Zellen. Das w&auml;re eine Eigenschaft, die Sie mit dem Wissen aus dem ersten Teil dieser Ausgabe zum Auswahlkalender leicht selbst nachtragen k&ouml;nnten.<\/p>\n<h2>Basistabelle<\/h2>\n<p>&auml;hnlich, wie beim Auswahlkalender, kommt f&uuml;r die Darstellung der Tage eine Tabelle zum Einsatz, deren Felder dann von <b>21<\/b> Textboxen im Endlosformular ausgegeben werden. Hier reichen sieben Felder nat&uuml;rlich nicht aus. F&uuml;r jede Spalte des Dreimonatskalenders muss ein eigenes Feld her, wenn nicht etwa eine umst&auml;ndliche Kreuztabellenabfrage verwendet werden soll.<\/p>\n<p>Die Felder der Tabelle <b>tblCalendarMonths<\/b> sind ebenfalls vom Zahlentyp <b>Long<\/b>. Die Nummerierung geschieht &uuml;ber das Pr&auml;fix <b>D<\/b>, gefolgt von der Nummer des Wochentags und der Position des Monats im Kalender. <b>D62<\/b> bezeichnet also etwa den sechsten Tag (<b>Sonnabend<\/b>) und die <b>2<\/b> darin den mittleren Monat. Bild 2 verdeutlicht dies ausschnittsweise. Auch diese Tabelle wird vom Formular selbst mit Datens&auml;tzen gef&uuml;llt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/tblMonths_DS.png\" alt=\"Ausschnitt der Monatskalendertabelle in der Entwurfsansicht\" width=\"599,593\" height=\"492,6446\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausschnitt der Monatskalendertabelle in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Allerdings speichern wir hier nicht jeweils die Tage der Monate ab, da diese ja mehrfach vorkommen -pro Monat einmal. Stattdessen nimmt ein Feld jeweils tats&auml;chlich einen Datumswert auf. Warum ein Datum in einem <b>Long<\/b>-Feld Sie ahnen es m&ouml;glicherweise: Auch hier m&ouml;chten wir <b>Bedingte Formatierung<\/b> zur farblichen Unterscheidung der Zellen benutzen und nehmen wieder negative Werte als Indiz f&uuml;r eine Markierung. Schauen Sie auf die gef&uuml;llte Tabelle in Bild 3.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/tblMonths_RT.png\" alt=\"So pr&auml;sentiert sich die Tabelle tblCalendarMonths, nachdem sie &uuml;ber das Formular mit Daten gef&uuml;llt wurde.\" width=\"700\" height=\"104,386\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: So pr&auml;sentiert sich die Tabelle tblCalendarMonths, nachdem sie &uuml;ber das Formular mit Daten gef&uuml;llt wurde.<\/span><\/b><\/p>\n<p>Ein negativer Wert f&uuml;hrt sp&auml;ter zur roten Hervorhebung der Zelle. Der Absolutwert einer Zahl stellt das Datum dar. Wir erw&auml;hnten bereits, dass ein Access- oder VBA-Datum tats&auml;chlich ein <b>Double<\/b>-Wert ist, dessen ganzzahliger Anteil den Tag angibt. Und diesen kann auch ein <b>Long<\/b>-Wert aufnehmen. Beispiel:<\/p>\n<pre>  Now()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Datum: 21.07.2017 08:33\r\n  CDbl(Now())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Double: 42937,35625\r\n  Clng(CDbl(Now()))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Long: 42937\r\n  CDate(42938)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Datum: 21.07.2017<\/pre>\n<p>Ben&ouml;tigen Sie also den Zeitanteil eines Datums nicht, so reicht zu dessen Speicherung ein <b>Long<\/b>-Wert.<\/p>\n<p>Die Tatsache, dass hier tats&auml;chlich Datumswerte abgespeichert sind, macht es &uuml;berdies sp&auml;ter leichter, sie beim Klick auf die Textboxen zu ermitteln. Den Steuerelementinhalt unterziehen Sie dazu lediglich der Funktion <b>CDate()<\/b>. Eine Berechnung aus der Zellenposition, wie beim Auswahlkalender, ist hier nicht n&ouml;tig. Schauen wir im Folgenden an, wie die Daten der Tabelle generiert werden. Auch hier nennt sich die verantwortliche Prozedur <b>FillCalendar<\/b>.<\/p>\n<h2>Daten der Basistabelle erzeugen<\/h2>\n<p>Die Prozedur <b>FillCalendar<\/b> wird im Formularmodul immer dann aufgerufen, wenn sich der Monat oder Tag &auml;ndern. Das kann durch Auswahl in den entsprechenden Kombinationsfeldern geschehen, durch Bet&auml;tigung der Buttons zum Weiterschalten, oder durch Zuweisung an die Eigenschaftsprozeduren <b>Year<\/b> und <b>Month<\/b>. Listing 1 zeigt wieder eine gek&uuml;rzte Version, in der nur die f&uuml;r die Erzeugung der Datens&auml;tze relevanten Teile abgebildet sind.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FillCalendar()\r\n     <span style=\"color:blue;\">Dim <\/span>rs<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>, j<span style=\"color:blue;\"> As Long<\/span>, n<span style=\"color:blue;\"> As Long<\/span>, f<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>StartDate<span style=\"color:blue;\"> As Date<\/span>, EndDate<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>MaxDate<span style=\"color:blue;\"> As Date<\/span>, DTmp<span style=\"color:blue;\"> As Date<\/span>\r\n     \r\n     StartDate = DateSerial(m_Year, m_Month - 1, 1)\r\n     EndDate = DateSerial(m_Year, m_Month + 2, 0)\r\n     \r\n     CurrentDb.Execute \"DELETE FROM tblCalendarMonths\"\r\n     <span style=\"color:blue;\">Set<\/span> rs = CurrentDb.OpenRecordset(\"tblCalendarMonths\", dbOpenDynaset)\r\n     For n = 0 To 4\r\n         rs.Add<span style=\"color:blue;\">New<\/span>\r\n         For i = 1 To 3\r\n             MaxDate = DateSerial(m_Year, m_Month + i - 1, 0)\r\n             For j = 1 To 7\r\n                 DTmp = DateAdd(\"m\", i - 1, StartDate)\r\n                 DTmp = DateAdd(\"d\", n * 7 + j - 1, DTmp)\r\n                 <span style=\"color:blue;\">If <\/span>DTmp &gt; MaxDate<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit For<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>IsInRanges(DTmp)<span style=\"color:blue;\"> Then<\/span> f = -1 Else f = 1\r\n                 rs.Fields(\"D\" & CStr(j) & CStr(i)).Value = f * CLng(DTmp)\r\n             <span style=\"color:blue;\">Next<\/span> j\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         rs.Update\r\n     <span style=\"color:blue;\">Next<\/span> n\r\n     \r\n     rs.Close\r\n     Me.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Bef&uuml;llen der Tabelle tblCalendarMonths<\/span><\/b><\/p>\n<p>Zun&auml;chst wird in <b>StartDate<\/b> der erste Tag des linken Monats ermittelt. Dazu wird vom Monat der <b>Member<\/b>-Variablen <b>m_Month<\/b> <b>eins<\/b> abgezogen und das Datum mit <b>DateSerial<\/b> berechnet. <b>EndDate<\/b> wiederum speichert den letzten Tag des rechten Monats. Da die Anzahl der Tage eines Monats variabel ist, kann f&uuml;r den <b>Tag<\/b>-Parameter in <b>DateSerial<\/b> kein Wert angegeben werden. Man behilft sich in diesem Fall mit dem Folgemonat (<b>m_Month + 2<\/b>) und dem Tag <b>0<\/b>. Das entspricht dem ersten Tag des Monats minus eins.<\/p>\n<p>Die <b>Execute<\/b>-Anweisung leert die Tabelle und <b>OpenRecordset<\/b> &ouml;ffnet eine beschreibbare Datensatzgruppe auf sie. Die folgende Schleifenkonstruktion weicht von der des Auswahlkalenders ab. Wir ben&ouml;tigen hier drei ineinander verschachtelte Schleifen. Die &auml;u&szlig;ere auf die Z&auml;hlervariable <b>n<\/b> stellt die Zeilen der Kalender dar. Diese entspricht dann auch der Anzahl der Datens&auml;tze der Tabelle, weshalb der Durchlauf auch mit einem <b>AddNew<\/b> beginnt. Die n&auml;chste Schleife mit dem Z&auml;hler <b>i<\/b> betrifft die drei Monate, die innerste Schleife mit dem Z&auml;hler <b>j<\/b> deren Wochentage.<\/p>\n<p>Zur Berechnung des Datums eines Datenfeldes wird hier <b>StartDate<\/b> nicht einfach fortlaufend erh&ouml;ht. Stattdessen werden zu <b>StartDate<\/b> zweimal Werte &uuml;ber die <b>DateAdd<\/b>-Funktion addiert und das Ergebnis in der <b>Date<\/b>-Variablen <b>DTmp<\/b> zwischengespeichert. Die erste <b>DateAdd<\/b>-Funktion addiert die Nummer des Monats aus dem Monatsschleifenz&auml;hler <b>i<\/b>, wobei der Ausdruck <b>m<\/b> der Funktion erst sagt, dass Monate zu addieren sind. Das zweite <b>DateAdd<\/b> verwendet Tag-Werte (Ausdruck <b>d<\/b>) und berechnet &uuml;ber den Wochentag in <b>j<\/b> und das Siebenfache der betreffenden Woche <b>n<\/b> einen weiteren Offset. Im Prinzip k&ouml;nnte dieser Wert aus <b>DTmp<\/b> dann schon einem Tabellenfeld zugewiesen werden.<\/p>\n<p>Da jedoch die Schleifendurchl&auml;ufe dazu f&uuml;hren k&ouml;nnen, dass &uuml;ber die Addition der Tage ein &uuml;ber einen Monat hinausreichendes Datum ermittelt w&uuml;rde, gibt es eine Abbruchbedingung f&uuml;r die innere Schleife. Ist <b>DTmp<\/b> gr&ouml;&szlig;er, als der letzte Tag des Monats, so wird die Schleife verlassen. Dieser letzte Tag ist in der Variablen <b>MaxDate<\/b> gespeichert und wird nach dem Beginn der zweiten Schleife jeweils neu berechnet.<\/p>\n<p>Schlie&szlig;lich sind noch die Zeitr&auml;ume zu ber&uuml;cksichtigen, die im Kalendersteuerelement rot zu unterlegen sind und durch negative Datumszahlen repr&auml;sentiert werden. Die Funktion <b>IsInRanges<\/b>, auf welche wir noch zu sprechen kommen, wird dazu befragt.<\/p>\n<p>Befindet sich das Schleifendatum <b>DTmp<\/b> innerhalb eines der verabreichten Zeitr&auml;ume, so gibt die Funktion <b>True<\/b> zur&uuml;ck. In diesem Fall nimmt die Variable <b>f<\/b> den Wert <b>-1<\/b> an, andernfalls <b>1<\/b>. Und <b>f<\/b> ist dann wieder der Multiplikator f&uuml;r den Datumswert, der dem Feld des Recordsets zugewiesen wird. Der Name des Felds ergibt sich aus dem Pr&auml;fix <b>D<\/b> und den Z&auml;hlvariablen <b>j<\/b> und <b>i<\/b> &uuml;ber String-Verkettung.<\/p>\n<h2>Zeitr&auml;ume zuweisen<\/h2>\n<p><!--30percent--><\/p>\n<p>Dem Kalendersteuerelement k&ouml;nnen beliebig viele Datumsbereiche hinzugef&uuml;gt werden, die dann in der Ansicht rot markiert werden. Sie k&ouml;nnen dabei auch au&szlig;erhalb des dargestellten Bereichs liegen. Die Prozedur <b>AddRange<\/b> (s. Listing 2) bewerkstelligt deren Speicherung.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Type TRange\r\n     StartDate<span style=\"color:blue;\"> As Date<\/span>\r\n     EndDate<span style=\"color:blue;\"> As Date<\/span>\r\nEnd Type \r\n<span style=\"color:blue;\">Private <\/span>arrRanges()<span style=\"color:blue;\"> As <\/span>TRange\r\n<span style=\"color:blue;\">Public Sub <\/span>AddRange(StartDate<span style=\"color:blue;\"> As Date<\/span>, EndDate<span style=\"color:blue;\"> As Date<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>n<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     n = <span style=\"color:blue;\">UBound<\/span>(arrRanges)\r\n     <span style=\"color:blue;\">If <\/span>Err.Number &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         n = 0\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         n = n + 1\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     ReDim Preserve arrRanges(n)\r\n     arrRanges(n).StartDate = StartDate\r\n     arrRanges(n).EndDate = EndDate\r\n     \r\n     FillCalendar\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hinzuf&uuml;gen eines Zeitraums &uuml;ber AddRange<\/span><\/b><\/p>\n<p>Als Parameter geben Sie das Startdatum des gew&uuml;nschten Bereichs in <b>StartDate<\/b> an und das Enddatum in <b>EndDate<\/b>. Soll es nur ein Tag sein, dann m&uuml;ssen beide Werte identisch sein. Das Wertepaar speichert die Routine in einem modulweit g&uuml;ltigen <b>Array<\/b> <b>arrRanges<\/b> des benutzerdefinierten Typs <b>TRange<\/b>, der im Kopf des Moduls deklariert ist. Hier muss erst per <b>UBound<\/b> ermittelt werden, wie viele Elemente das Array bereits enth&auml;lt. Ist noch kein Element vorhanden, so ist das Array noch nicht initialisiert, was bei <b>UBound<\/b> zu einem Fehler f&uuml;hren w&uuml;rde. Deshalb ist die Fehlerbehandlung eingangs per <b>On Error Resume Next<\/b> au&szlig;er Kraft gesetzt. Die Variable <b>n<\/b> nimmt die Anzahl der Elemente entgegen und erh&ouml;ht sie um <b>eins<\/b>.<\/p>\n<p>Nun kann das Array mit <b>ReDim<\/b> neu dimensioniert werden, wobei das Schl&uuml;sselwort <b>Preserve<\/b> angibt, dass sein Inhalt dabei nicht verloren gehen soll. Im <b>n-ten<\/b> Element das Arrays werden schlie&szlig;lich Start- und Enddatum abgespeichert. Der abschlie&szlig;ende Aufruf von <b>FillCalendar<\/b> f&uuml;hrt dazu, dass der Zeitraum im Kalender auch sofort dargestellt wird.<\/p>\n<p>M&ouml;chten Sie die Zeitr&auml;ume modifizieren, so l&ouml;schen Sie sie mit der Prozedur <b>DeleteRanges<\/b> alle auf einen Schlag und f&uuml;gen die neuen wieder hinzu. Das L&ouml;schen einzelner Datumsbereiche erlaubt das Modul nicht.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DeleteRanges()\r\n     Erase arrRanges\r\n     FillCalendar\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Die angesprochene Funktion <b>IsInRanges<\/b> ermittelt dann, ob ein bestimmtes Datum sich innerhalb der Zeitr&auml;ume des angelegten Arrays befindet (s. Listing 3). <b>D<\/b> ist hier der Datumsparameter, den Sie der Funktion &uuml;bergeben. Alle Zeitr&auml;ume werden in einer Schleife durchlaufen und <b>StartDate<\/b>, wie <b>EndDate<\/b> eines Elements, mit ihm verglichen. Sobald das f&uuml;r ein Bereichselement zutrifft, erh&auml;lt der R&uuml;ckgabewert der Funktion <b>True<\/b> und die Schleife wird verlassen.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>IsInRanges(D<span style=\"color:blue;\"> As Date<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>, n<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     n = <span style=\"color:blue;\">UBound<\/span>(arrRanges)\r\n     <span style=\"color:blue;\">If <\/span>Err.Number &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     \r\n     For i = 0 To n\r\n         <span style=\"color:blue;\">If <\/span>(D &gt;= arrRanges(i).StartDate) And (D &lt;= arrRanges(i).EndDate)<span style=\"color:blue;\"> Then<\/span>\r\n             IsInRanges = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion ermittelt, ob sich das Datum D innerhalb der gespeicherten Datumsbereiche befindet.<\/span><\/b><\/p>\n<h2>Entwurf des Steuerelementformulars<\/h2>\n<p>Die Entwurfsansicht des Formulars <b>sfrmCalendarMonths<\/b> (s. Bild 4) kommt &auml;hnlich daher, wie die des Auswahlkalenders. Der Unterschied ist, dass hier nat&uuml;rlich mehr Textboxen im Detailbereich untergebracht sind, drei Labels f&uuml;r die Monatsnamen &uuml;ber den Wochentagen platziert sind und sich ein Bezeichnungsfeld f&uuml;r den Titel oben rechts befindet. Sowohl die Label f&uuml;r die Monatsnamen, wie die f&uuml;r die Wochentage, werden in der <b>FillCalendar<\/b>-Prozedur des Formulars per VBA beschriftet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/sfrmMonths_DS.png\" alt=\"Das Formular sfrmCalendarMonths gleich in der Entwurfsansicht dem des Beitrags zum einfachen Kalender.\" width=\"700\" height=\"252,2138\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Formular sfrmCalendarMonths gleich in der Entwurfsansicht dem des Beitrags zum einfachen Kalender.<\/span><\/b><\/p>\n<p>Bei den Monatsnamen ist die Geschichte noch einfach. Die Beschriftung der Labels <b>LM1<\/b> bis <b>LM3<\/b> leitet sich vom Startdatum des Kalenders ab:<\/p>\n<pre>Me!LM1.Caption = Format(StartDate, \"mmmm\")\r\nMe!LM2.Caption = Format(StartDate + 31, \"mmmm\")\r\nMe!LM3.Caption = Format(StartDate + 62, \"mmmm\")<\/pre>\n<p>Der Monatsname des ersten Einzelkalenders ergibt sich aus dem Startdatum (<b>StartDate<\/b>) &uuml;ber die <b>Format<\/b>-Funktion. F&uuml;r den zweiten Monat werden dem Startdatum einfach <b>31<\/b> Tage hinzuaddiert, f&uuml;r den dritten <b>62<\/b>.<\/p>\n<p>Die Labels f&uuml;r die Wochentage waren im Auswahlkalender noch fest beschriftet. Hier geht das nicht, weil ja jeder Einzelkalender mit dem Ersten des Monats beginnt. Folglich variiert auch die Bezeichnung der jeweils ersten Spalte.<\/p>\n<p>Die Labels f&uuml;r die Wochentage haben die durchnummerierten Namen <b>L1<\/b> bis <b>L21<\/b>. So kann einfach auf sie zugegriffen werden. Der folgende Prozedurteil von <b>FillCalendar<\/b> &uuml;berreicht diesen Steuerelementen ihre Beschriftung:<\/p>\n<pre>For j = 0 To 2\r\n     For i = 1 To 7\r\n         S = \"L\" & CStr(i + j * 7)\r\n         Me.Controls(S).Caption = Format( _\r\n                                   DateSerial(m_Year, m_Month + j - 1, 0) + i, \"ddd\")\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">Next<\/span> j<\/pre>\n<p>In der String-Variablen <b>S<\/b> wird der Name des Labels aus den beiden Schleifenz&auml;hlern <b>i<\/b> und <b>j<\/b> gebildet. Die <b>Caption<\/b>-Eigenschaft der Steuerelemente der <b>Controls<\/b>-Auflistung des Formulars kann nun angesprochen werden. Ihr Wert ergibt sich aus der Kombination von jeweiligem Monatsstartdatum plus Tag <b>1<\/b> bis <b>7<\/b> und der <b>DateSerial<\/b>-Funktion im Verein mit der <b>Format<\/b>-Funktion, deren Ausdruck <b>ddd<\/b> anweist, die Wochentage abgek&uuml;rzt auszugeben.<\/p>\n<p>Etwas komplexer, als beim Auswahlkalender, ist der Steuerelementinhalt der Textboxen im Detailbereich gestaltet. Hier reicht die <b>Abs<\/b>-Funktion allein nicht aus, da in der Tabelle ja nicht <b>Integer<\/b>-Tage abgespeichert sind, sondern Datumswerte. Wir bem&uuml;hen hier ausnahmsweise den <b>Ausdrucks-Generator<\/b> von Access. In Bild 5 ist er f&uuml;r den Steuerelementinhalt der Textbox <b>txtD11<\/b>, also der ersten links im Detailbereich, dargestellt. Der eigentlich in der Textbox auszugebende Tag ergibt sich &uuml;ber die <b>Day<\/b>-Funktion von VBA auf das gespeicherte Datum <b>D11<\/b> der Tabelle. Im Ausdruckseditor ist der Funktionsname eingedeutscht und lautet demzufolge <b>Tag()<\/b>. Die <b>Abs<\/b>-Funktion macht aus einem negativen Datum ein positives. Das alles reicht indessen immer noch nicht aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_FldExpr.png\" alt=\"Ausdruck f&uuml;r den Steuerelementinhalt der ersten Textbox\" width=\"549,6265\" height=\"456,5081\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ausdruck f&uuml;r den Steuerelementinhalt der ersten Textbox<\/span><\/b><\/p>\n<p>Denn einige Zellen in der Tabelle sind leer, weil es etwa keinen <b>34.<\/b> eines Monats gibt. Bei diesen Feldinhalten kommt <b>Abs<\/b> ins Schlingern. Die Textboxen g&auml;ben den Ausdruck <b>#Fehler!<\/b> aus. Um das abzufangen, muss noch &uuml;ber <b>IsNull<\/b> ermittelt werden, ob ein Feld <b>nicht<\/b> leer ist. Nur dann gibt der Ausdruck &uuml;ber die <b>If<\/b>-Bedingung (<b>Wenn<\/b>) den Tag aus und andernfalls einen Leerstring.<\/p>\n<h2>Bedingte Formatierung der Textfelder<\/h2>\n<p>Damit sich diejenigen Tage, welche sich in den spezifizierten Zeitr&auml;umen des Kalenders befinden, rot einf&auml;rben, kommt die gleiche <b>Bedingte Formatierung<\/b> zum Zug, wie beim einfachen Auswahlkalender. Der Unterschied besteht lediglich in der Formatierung, die f&uuml;r den Hintergrund ein hellrot vorsieht, die Schriftfarbe aber unver&auml;ndert l&auml;sst.<\/p>\n<p>Der Vergleichsausdruck bleibt derselbe. Bild 6 zeigt den ersten Dialog zum Anlegen der bedingten Formatierung, den Sie &uuml;ber das Kontextmen&uuml; der Textbox aufrufen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_Condition1.png\" alt=\"Erster Dialog zur bedingten Formatierung der ersten Textbox\" width=\"649,559\" height=\"339,967\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Erster Dialog zur bedingten Formatierung der ersten Textbox<\/span><\/b><\/p>\n<p>In Bild 7 sehen Sie den zweiten Dialog, in den Sie den ben&ouml;tigten Ausdruck eingeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_Condition2.png\" alt=\"Zweiter Dialog zur bedingten Formatierung der ersten Textbox\" width=\"649,559\" height=\"331,3406\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Zweiter Dialog zur bedingten Formatierung der ersten Textbox<\/span><\/b><\/p>\n<p>Nun ist es ein recht zeitraubendes Unterfangen, diesen Vorgang f&uuml;r alle 21 Textfelder zu wiederholen. Darum greifen wir zu einer kleinen Routine, welche die <b>Bedingte Formatierung<\/b> per Code setzt.<\/p>\n<p>&ouml;ffnen Sie dazu das Formular <b>sfrmCalendarMonths<\/b> im Entwurf, wechseln in den VBA-Editor und rufen dort im Direktfenster die Routine <b>SetFormatConditions<\/b> von <b>Modul1<\/b> auf. Diese Prozedur finden Sie in Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>SetFormatConditions()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Access.Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.TextBox\r\n     <span style=\"color:blue;\">Dim <\/span>S<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fmtcond<span style=\"color:blue;\"> As <\/span>FormatCondition\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> frm = Screen.ActiveForm\r\n     For Each ctl In frm.Section(acDetail).Controls\r\n         S = <span style=\"color:blue;\">Mid<\/span>(ctl.Name, 4)\r\n         ctl.FormatConditions.Delete\r\n         <span style=\"color:blue;\">Set<\/span> fmtcond = ctl.FormatConditions.Add(acExpression, , \"[\" & S & \"]&lt;0\")\r\n         fmtcond.BackColor = <span style=\"color:blue;\">RGB<\/span>(255, 160, 160)\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Anlegen der bedingten Formatierung per Code<\/span><\/b><\/p>\n<p><b>Screen.ActiveForm<\/b> gibt das aktuell im Arbeitsbereich von Access aktive Formular zur&uuml;ck, egal, ob es zur Laufzeit oder im Entwurf ge&ouml;ffnet ist. &uuml;ber die <b>Controls<\/b>-Auflistung des Detailbereichs ermittelt eine Schleife alle Steuerelemente in der Schleifenvariablen <b>ctl<\/b>.<\/p>\n<p>Die ist gleich als <b>Access.Textbox <\/b>deklariert, da sich im Detailbereich keine anders gearteten Steuerelemente befinden. Das Datenfeld, an welches die Textbox indirekt gebunden ist, k&ouml;nnen Sie aus dem Namen ermitteln. <b>txtD11<\/b> etwa bezieht sich auf das Tabellenfeld <b>D11<\/b>, <b>txt62<\/b> auf <b>D62<\/b>, et cetera. <\/p>\n<p>M&ouml;glicherweise schon bestehende <b>Bedingte Formatierungen<\/b> der Textbox l&ouml;scht zuerst die <b>Delete<\/b>-Anweisung der <b>FormatConditions<\/b>-Auflistung. Deren <b>Add<\/b>-Funktion schlie&szlig;lich legt eine neue Formatierung an, wobei als Parameter zwingend deren Typ anzugeben ist. F&uuml;r einen <b>Ausdruck<\/b> ist das die Konstante <b>acExpression<\/b>.<\/p>\n<p>Den n&auml;chsten Parameter k&ouml;nnen Sie in diesem Fall unber&uuml;cksichtigt lassen, m&uuml;ssen jedoch anschlie&szlig;end den Vergleichsausdruck setzen. Der bildet sich aus dem Datenfeld in <b>S<\/b> in rechteckigen Klammern plus dem Vergleich <b><0<\/b>. In der Objektvariablen <b>fmtCond<\/b> ist nun die <b>Bedingte Formatierung<\/b> gespeichert. Sie m&uuml;ssen ihr nur noch sagen, welche Formatierung gew&uuml;nscht ist. <b>BackColor<\/b> stellen Sie deshalb auf die &uuml;ber die <b>RGB<\/b>-Funktion erhaltene hellrote Farbe ein. <\/p>\n<p>Sie k&ouml;nnen nun in der Entwurfsansicht &uuml;ber die Dialoge zur <b>Bedingten Formatierung<\/b> der Textboxen &uuml;berpr&uuml;fen, ob die Sache geklappt hat. Erst nach dem Schlie&szlig;en des Formulars und der Best&auml;tigung der Nachfrage zum Speichern der &auml;nderungen, sind diese in ihm verewigt.<\/p>\n<p>Nicht unerw&auml;hnt soll bleiben, dass diese Routine auch zur Laufzeit des Formulars funktioniert! Sie k&ouml;nnen bei einem angezeigten Formular jederzeit die <b>Bedingten Formatierungen<\/b> von Steuerelementen per Code &auml;ndern. Die neuen Formatierungen reflektieren sich dann sofort in ihm, ein Umstand, von dem selten Gebrauch gemacht wird, der jedoch sehr m&auml;chtig ist!<\/p>\n<p>&uuml;brigens sind die Ausdr&uuml;cke zum <b>Steuerelementinhalt<\/b> der Textboxen in der Beispieldatenbank auf &auml;hnliche Weise zustande gekommen. Auch hier w&auml;re die manuelle Anlage &uuml;ber den Ausdruckseditor sehr m&uuml;hsam. Statt der <b>FormatConditions<\/b> wurde hier jeweils die <b>ctl.ControlSource<\/b> auf einen entsprechend generierten String gesetzt.<\/p>\n<h2>Einbau des Steuerelements in ein Hauptformular<\/h2>\n<p>Wie beim Auswahlkalender auch k&ouml;nnen Sie nun im Formular <b>frmCalendarMonths<\/b> ein Unterformularsteuerelement erzeugen und als dessen Inhalt das Formular <b>sfrmCalendarMonths<\/b> angeben (s. Bild 8). Hier ist zus&auml;tzlich oben ein Button eingef&uuml;gt, der das Hinzuf&uuml;gen von Zeitraummarkierungen demonstrieren soll. <b>Beim Laden<\/b> des Hauptformulars werden einige Einstellungen f&uuml;r das Kalendersteuerelement vorgenommen, das als Objekt im Kopf des Moduls &uuml;ber die Variable <b>oCalendar<\/b> deklariert ist:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_DS.png\" alt=\"Au&szlig;er dem Button zur Markierung von Datumsbereichen enth&auml;lt das Formular frmCalendarMonths nur das Unterformularsteuerelement und etwas VBA-Code\" width=\"700\" height=\"336,0385\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Au&szlig;er dem Button zur Markierung von Datumsbereichen enth&auml;lt das Formular frmCalendarMonths nur das Unterformularsteuerelement und etwas VBA-Code<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents oCalendar<span style=\"color:blue;\"> As <\/span>Form_sfrmCalendarMonths\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> oCalendar = Me!ctlCalendar.Form\r\n     <span style=\"color:blue;\">With<\/span> oCalendar\r\n         .BackColor = <span style=\"color:blue;\">RGB<\/span>(224, 224, 224)\r\n         .Year = 2018\r\n         .Month = 6\r\n         .Title = \"AiU-Belegungsplan\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Seine Hintergrundfarbe wird im <b>With<\/b>-Block auf einen Grauton gesetzt, das gew&uuml;nschte Jahr auf <b>2018<\/b>, der Monat auf <b>Juni,<\/b> und der Titel <b>AiU-Belegungsplan<\/b> wird zugewiesen. Das ist bereits alles! Bild 9 demonstriert, wie das ge&ouml;ffnete Formular dann aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmMonths_RT1.png\" alt=\"Demo des Unterformularsteuerelements Monatskalender nach Einbau in ein Hauptformular frmCalendarMonths\" width=\"649,559\" height=\"270,3311\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Demo des Unterformularsteuerelements Monatskalender nach Einbau in ein Hauptformular frmCalendarMonths<\/span><\/b><\/p>\n<p>Das Kalendersteuerelement l&ouml;st nur zwei Ereignisse aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>oCalendar_MonthChanged(ByVal NewMonth<span style=\"color:blue;\"> As Long<\/span>)\r\n''''\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>oCalendar_YearChanged(ByVal NewYear<span style=\"color:blue;\"> As Long<\/span>)\r\n''''\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das passiert beim Bet&auml;tigen eines der Navigationssteuerelemente. Wie Sie auf die in den Ereignisparametern &uuml;bergebenen Monats- und Jahrangaben reagieren, bleibt Ihnen &uuml;berlassen.<\/p>\n<p>Ein Klick auf die Tage des Kalenders l&ouml;st indessen, abweichend vom Auswahlkalender des ersten Teils, kein Ereignis aus. Implementieren Sie das auf analoge Weise selbst, wenn Sie es w&uuml;nschen. Sie m&uuml;ssen nur f&uuml;r jede der 21 Textboxen das <b>Click<\/b>-Ereignis generieren und dort die Funktion <b>fuClick<\/b> anspringen lassen, die im einfachsten Fall etwa so auss&auml;he:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>fuClick()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Me.ActiveControl.CDate(Abs(Value))\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies g&auml;be das angeklickte Datum im VBA-Direktfenster aus.<\/p>\n<p>Dem Button f&uuml;r das Hinzuf&uuml;gen von Zeitr&auml;umen ist diese Prozedur hinterlegt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSel1_Click()\r\n     <span style=\"color:blue;\">With<\/span> oCalendar\r\n         .DeleteRanges\r\n         .AddRange \"21.05.2018\", \"24.05.2018\"\r\n         .AddRange \"06.06.2018\", \"12.06.2018\"\r\n         .AddRange \"19.06.2018\", \"22.06.2018\"\r\n         .AddRange \"02.07.2018\", \"16.07.2018\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Vier Zeitr&auml;ume werden dem Kalender jeweils &uuml;ber Start- und Enddatum verabreicht, nachdem m&ouml;glicherweise schon bestehende &uuml;ber die <b>DeleteRanges<\/b>-Anweisung gel&ouml;scht wurden. Das unmittelbare Ergebnis sahen Sie bereits in der ersten Abbildung.<\/p>\n<p>Klicken Sie nun irgendwo in den Detailbereich des Hauptformulars und lassen Sie sich vom Effekt &uuml;berraschen! Deren <b>Click<\/b>-Prozedur animiert die Hintergrundfarbe der Zeitraummarkierungen. Die hier verwendete Routine leitet sich von der bereits beschriebenen <b>SetFormatConditions<\/b> ab. Sie legt neue <b>FormatConditions<\/b> an und stellt die Hintergrundfarbe auf einen zuf&auml;lligen Pastellton ein. Die Schriftart wird mit <b>FontBold<\/b> ebenfalls nach Zufall auf Fettdruck gesetzt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Detailbereich_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Access.Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.TextBox\r\n     <span style=\"color:blue;\">Dim <\/span>S<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fmtcond<span style=\"color:blue;\"> As <\/span>FormatCondition\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> frm = Me!ctlCalendar.Form\r\n     For Each ctl In frm.Section(acDetail).Controls\r\n         S = <span style=\"color:blue;\">Mid<\/span>(ctl.Name, 4)\r\n         ctl.FormatConditions.Delete\r\n         <span style=\"color:blue;\">Set<\/span> fmtcond = ctl.FormatConditions.Add( _\r\n             acExpression, , \"[\" & S & \"]&lt;0\")\r\n         fmtcond.BackColor = <span style=\"color:blue;\">RGB<\/span>(128 + 128 * Rnd, _\r\n             128 + 128 * Rnd, 128 + 128 * Rnd)\r\n         fmtcond.FontBold = (Rnd &gt; 0.5)\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ganze ergibt einen bunten Kalender, der deutlich macht, dass sich mit der <b>Bedingten Formatierung<\/b> noch weit mehr anstellen lie&szlig;e. Eine fortlaufende Animation allerdings l&auml;sst sich nicht erreichen. Dazu ben&ouml;tigen die Routine und Access zulange f&uuml;r die Neuberechnung der Formatierungen.<\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KalenderCtl2.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/94666488-C5A1-4F1C-8B46-525CEFA62B2D\/aiu_1100.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das im ersten Teil dieser Ausgabe beschriebene Kalendersteuerelement eignet sich vornehmlich zur Auswahl eines Datums. Ben&ouml;tigen Sie aber eine &Uuml;bersicht, wie die Termine des Outlook-Kalenders mit der Markierung von Datumsbereichen, etwa zur Darstellung Ihrer Urlaubsplanung, so sind die Anforderungen ganz andere. Auch f&uuml;r diesen Zweck stellen wir ein Pseudo-Steuerelement vor, das allein mit Access-Bordmitteln realisiert ist.<\/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":[662017,66052017,44000023],"tags":[],"class_list":["post-55001100","post","type-post","status-publish","format-standard","hentry","category-662017","category-66052017","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kalendersteuerelement, Teil 2 - 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\/Kalendersteuerelement_Teil_2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kalendersteuerelement, Teil 2\" \/>\n<meta property=\"og:description\" content=\"Das im ersten Teil dieser Ausgabe beschriebene Kalendersteuerelement eignet sich vornehmlich zur Auswahl eines Datums. Ben&ouml;tigen Sie aber eine &Uuml;bersicht, wie die Termine des Outlook-Kalenders mit der Markierung von Datumsbereichen, etwa zur Darstellung Ihrer Urlaubsplanung, so sind die Anforderungen ganz andere. Auch f&uuml;r diesen Zweck stellen wir ein Pseudo-Steuerelement vor, das allein mit Access-Bordmitteln realisiert ist.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T16:26:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kalendersteuerelement, Teil 2\",\"datePublished\":\"2021-03-22T16:26:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/\"},\"wordCount\":2439,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a5f7a1f127404b75b7aced85d611e7c5\",\"articleSection\":[\"2017\",\"5\\\/2017\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/\",\"name\":\"Kalendersteuerelement, Teil 2 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a5f7a1f127404b75b7aced85d611e7c5\",\"datePublished\":\"2021-03-22T16:26:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a5f7a1f127404b75b7aced85d611e7c5\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a5f7a1f127404b75b7aced85d611e7c5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kalendersteuerelement, Teil 2\"}]},{\"@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":"Kalendersteuerelement, Teil 2 - 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\/Kalendersteuerelement_Teil_2\/","og_locale":"de_DE","og_type":"article","og_title":"Kalendersteuerelement, Teil 2","og_description":"Das im ersten Teil dieser Ausgabe beschriebene Kalendersteuerelement eignet sich vornehmlich zur Auswahl eines Datums. Ben&ouml;tigen Sie aber eine &Uuml;bersicht, wie die Termine des Outlook-Kalenders mit der Markierung von Datumsbereichen, etwa zur Darstellung Ihrer Urlaubsplanung, so sind die Anforderungen ganz andere. Auch f&uuml;r diesen Zweck stellen wir ein Pseudo-Steuerelement vor, das allein mit Access-Bordmitteln realisiert ist.","og_url":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-03-22T16:26:47+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kalendersteuerelement, Teil 2","datePublished":"2021-03-22T16:26:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/"},"wordCount":2439,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5","articleSection":["2017","5\/2017","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/","url":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/","name":"Kalendersteuerelement, Teil 2 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5","datePublished":"2021-03-22T16:26:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/a5f7a1f127404b75b7aced85d611e7c5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kalendersteuerelement, Teil 2"}]},{"@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\/55001100","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=55001100"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001100\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}