{"id":55001099,"date":"2017-10-01T00:00:00","date_gmt":"2020-05-13T21:26:43","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1099"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kalendersteuerelement_Teil_1","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/","title":{"rendered":"Kalendersteuerelement, Teil 1"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Zur Ein- oder Ausgabe eines Datums macht sich ein geeignetes Kalendersteuerelement im Formular besser als ein schn&ouml;des Textfeld. Das kann fest im Formular integriert sein, oder als Popup zur Auswahl erscheinen. In Buchungssystemen im Web sind solche Kalenderelemente allgegenw&auml;rtig. Auch Access wurde mit der Version 2007 ein solches Popup-Element spendiert, welches sich aber leider in keiner Weise steuern l&auml;sst. Grund genug also, um sich nach Alternativen umzuschauen.<\/b><\/p>\n<h2>Existierende Kalenderelemente<\/h2>\n<p>Einst war ein Kalendersteuerelement in Form der <b>ActiveX-Datei mscal.ocx<\/b> optionaler Bestandteil der <b>Office<\/b>-Installation. Das hat sich seit einiger Zeit ge&auml;ndert. Man ist nunmehr allein auf das Popup angewiesen, das bei Datumsfeldern zur Auswahl erscheint, wenn in das zugeh&ouml;rige Textfeld geklickt wird. Eine dauerhafte Ansicht des Kalenders ist somit verwehrt.<\/p>\n<p>Bild 1 zeigt das alte Kalender-ActiveX-Steuerelement links oben im Formular. Aus irgendeinem Grund befand es sich, m&ouml;glicherweise aus &auml;lteren Office-Installationen, noch bei uns in englischer Version im System. Seine Darstellung l&auml;sst sich im Formularentwurf oder auch per VBA steuern. Das betrifft die Schriftarten und die Farbgebung. Es l&ouml;st bei einigen Aktionen ein Ereignis aus und spiegelt in der Eigenschaft <b>Value<\/b> das markierte Datum wieder. Sollte auf ihrem System die ActiveX-Datei nicht installiert sein, so meldet Access beim Aufruf des Formulars der Beispieldatenbank den etwas eigenartigen Fehler <b>In diesem Formular befindet sich kein Steuerelement<\/b>. Entfernen Sie in diesem Fall im Entwurf des Formulars <b>frmCalendarTest<\/b> einfach den Platzhalter des Steuerelements.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmCalendarsTest.png\" alt=\"Demo einiger Datums- und Kalendersteuerelemente im Testformular\" width=\"649,559\" height=\"376,6611\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Demo einiger Datums- und Kalendersteuerelemente im Testformular<\/span><\/b><\/p>\n<p>Da von diesem Fall auszugehen ist, fragt sich, wie mit anderen Mitteln eine &auml;hnliche Darstellung und Funktion zu erreichen w&auml;re. Testweise haben wir ein Listenfeld (rechts unten in der Abbildung) und ein <b>Microsoft Listview Control <\/b>(links unten) als Kalender zu gestalten versucht. Mit einigen Zeilen Code und den entsprechenden Einstellungen f&uuml;r die Steuerelemente gelingt dies auch. Der inakzeptable Nachteil der L&ouml;sungen besteht darin, dass sich in diesen Steuerelementen nur ganze Zeilen markieren lassen, nicht aber einzelne Zellen. Eine Auswahl per Maus scheidet deshalb aus. Derlei lie&szlig;e sich also lediglich zur Anzeige der Tage eines Monats verwenden. Doch das brauchen Sie wohl h&ouml;chst selten. Bleiben noch zwei Alternativen: das Microsoft <b>DateTime Picker Control<\/b> und die Access-Textbox mit Datumsformatierung. Ersteres zeigt sich im Formular rechts oben. Es entspringt der ActiveX-Datei <b>mscomct2.ocx<\/b>, die fr&uuml;her ebenfalls mit Office installiert wurde (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/DTpic_1099_kerOCX.png\" alt=\"Das Microsoft DateTime-Picker- ActiveX-Steuerelement\" width=\"349,7625\" height=\"318,1955\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das Microsoft DateTime-Picker- ActiveX-Steuerelement<\/span><\/b><\/p>\n<p>Wir erw&auml;hnen es nur der Vollst&auml;ndigkeit halber, denn au&szlig;er einer abweichenden Gestalt bietet es gegen&uuml;ber der dem Popup von Access (s. Bild 3) keine sonderlichen Vorteile. Nur die Schriftarten und Farben k&ouml;nnen hier zus&auml;tzlich eingestellt werden. Die Funktionalit&auml;t ist bei beiden jedoch gleich.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/AccessDate.png\" alt=\"Das Popup-Element zur Datumsauswahl bei Access-Textboxen\" width=\"349,7625\" height=\"269,7515\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Popup-Element zur Datumsauswahl bei Access-Textboxen<\/span><\/b><\/p>\n<p>Normalerweise &ouml;ffnet sich das Kalenderelement einer Textbox mit Datumsformatierung dann, wenn Sie auf das Symbol rechts neben dem Textfeld klicken. Es gibt aber eine Anweisung, die die Anzeige des Kalender-Popups erzwingt. M&ouml;chten Sie etwa, dass es sofort beim Eintritt in das Feld erscheint, oder auch beim Klicken in das Textfeld, so schreiben Sie die folgende Zeile in die entsprechenden Ereignisprozeduren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtDate_Click()\r\n     RunCommand acCmdShowDatePicker\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtDate_Enter()\r\n     RunCommand acCmdShowDatePicker\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese <b>RunCommand<\/b>-Anweisung erm&ouml;glicht das &ouml;ffnen des Popups per Code, falls die Datums-Textbox gerade den Fokus besitzt. Andernfalls ereignet sich eine Fehlermeldung. Verwenden Sie sie deshalb besser nur in den Ereignissen der Textbox selbst.<\/p>\n<p>Sicher finden Sie auch noch weitere Fremdsteuerelemente in Form von ActiveX-Dateien bei Drittanbietern. Es gilt jedoch die Maxime, wegen der m&ouml;glichen Registrierungsprobleme solche ActiveX-Komponenten nur dann einzusetzen, wenn es absolut notwendig ist. Und das ist hier nicht gegeben, denn ein Kalendersteuerelement l&auml;sst sich gut auch mit Access-Bordmitteln selbst erstellen!<\/p>\n<h2>Kalender im Eigenbau<\/h2>\n<p>Nat&uuml;rlich k&ouml;nnte man einfach 31 Steuerelemente, etwa Buttons oder Textboxen, in einem Formular so anordnen, dass diese einen Kalender erg&auml;ben. Um auf eine Datumsauswahl zu reagieren, br&auml;uchte es daf&uuml;r dann eben auch 31 Ereignisprozeduren. Das w&auml;re zwar recht unkompliziert, ist aber wenig elegant.<\/p>\n<p>Dabei reicht es im Prinzip ja f&uuml;r die Tage der Woche nur sieben Steuerelemente im Detailbereich zu platzieren und diese Wochen untereinander zu wiederholen. Damit sind wir allerdings auf eine Tabelle angewiesen, die die Datens&auml;tze f&uuml;r alle Wochen eines Monats bereitstellt. Nur eine Tabelle oder Abfrage als Datensatzherkunft kann bewirken, dass sich der Detailbereich wiederholt.<\/p>\n<p>Bevor es Schritt f&uuml;r Schritt an die Entwicklung des Kalenderformulars geht, sollte noch definiert werden, was der Ausdruck <b>Steuerelement<\/b> in unserem Zusammenhang bedeutet. Ein wirklich neues Steuerelement kann nun mal mit Access nicht erzeugt werden. Sie k&ouml;nnen lediglich aus bestehenden Elementen eine neue Funktionsgruppe erstellen, die den Anschein eines einzelnen Steuerelements erweckt. Damit das Ganze wiederverwendbar ist, sollte diese Funktionsgruppe m&ouml;glichst in einem Formular ohne weitere Abh&auml;ngigkeiten untergebracht werden, welches Sie sp&auml;ter als Unterformular in andere einsetzen. Dieses Unterformular stellt dann quasi ein Pseudo-Steuerelement dar. In der Beispieldatenbank nennt es sich <b>sfrmCalendar<\/b>. Das Pr&auml;fix <b>s<\/b> steht f&uuml;r <b>Subform<\/b>.<\/p>\n<h2>Wochentabelle f&uuml;r einen Monat<\/h2>\n<p>Die Basistabelle <b>tblCalendar<\/b> f&uuml;r das Kalenderformular in Bild 4 weist lediglich die sieben Datenfelder <b>D1<\/b> bis <b>D7<\/b> von Typ <b>Long<\/b> f&uuml;r die einzelnen Tage der Woche auf. F&uuml;r die Namen der Felder kann man eher nicht K&uuml;rzel f&uuml;r Wochentage, wie <b>Mo<\/b> bis <b>So<\/b>, verwenden, da der Erste eines Monats eben selten ein Montag ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/tblCalendar_DS.png\" alt=\"Die Tabelle tblCalendar als Basis f&uuml;r den Kalender im Eigenbau\" width=\"599,593\" height=\"330,0615\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle tblCalendar als Basis f&uuml;r den Kalender im Eigenbau<\/span><\/b><\/p>\n<p>Die Nummerierung in den Namen der Felder erm&ouml;glicht sp&auml;ter den gezielten Zugriff auf die Spalten der Tabelle. Ein Blick auf Bild 5 zeigt, was dahinter steckt. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/tblCalendar_RT.png\" alt=\"Die gef&uuml;llte Tabelle tblCalendar im Datenblatt\" width=\"499,6607\" height=\"243,0043\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die gef&uuml;llte Tabelle tblCalendar im Datenblatt<\/span><\/b><\/p>\n<p>Die Datens&auml;tze f&uuml;llt n&auml;mlich eine VBA-Routine des Formulars zur Laufzeit unter Angabe des gew&uuml;nschten Jahrs und Monats. Sie ordnet die Zahlen f&uuml;r die Tage so an, dass sich links immer die Montage befinden. Der Erste des Monats wiederum soll in der ersten Zeile auftauchen. Ist das kein Montag, so sind links von diesem Feld die Tage des Vormonats einzusetzen. Hier sind das der <b>28.<\/b> bis <b>31.<\/b>. &auml;hnliches gilt f&uuml;r den Letzten des Monats, welcher sich im letzten Datensatz befinden soll, aber in der Regel kein Sonntag ist. Folglich ergeben sich in der letzten Zeile rechts vom Monatsletzten meist noch weitere Tage des Folgemonats. Je nach Monat und Jahr sind in der Tabelle mindestens vier, maximal sechs, Datens&auml;tze zu erzeugen.<\/p>\n<p>Meist sind die Tage, welche nicht zum angezeigten Monat geh&ouml;ren, also jene des Vor- und Folgemonats, in Kalendern ausgegraut dargestellt. Um dieses Feature auch unserem Kalender zu spendieren, verwenden wir f&uuml;r die Textfelder im Formular eine <b>Bedingte Formatierung<\/b>. Denn per VBA-Code kann zwar die Hintergrundfarbe einer Textbox &uuml;ber die Eigenschaft <b>BackgroundColor<\/b> gesteuert werden, doch das betrifft dann s&auml;mtliche Zellen einer Spalte, die sich von diesem Datenfeld ableiten, nicht jedoch einzelne Zellen.<\/p>\n<p>Um <b>Bedingte Formatierung<\/b> kommt man hier also nicht herum. Da diese einen Vergleichsausdruck f&uuml;r die Steuerung des Formats verwendet, ben&ouml;tigen wir irgendein Indiz, welches die nicht zum Monat geh&ouml;rigen Tage definiert. Und das ist hier das Minuszeichen. Alle auszugrauenden Tage haben einen negativen Wert. Damit ist auch klar, weshalb hier keine Datumstypen f&uuml;r die Felder der Tabelle zum Einsatz kommen, denn deren Werte k&ouml;nnen nicht negativ sein. Ein <b>Long<\/b>&#8211; oder ein <b>Integer<\/b>-Wert reichen zur Kennzeichnung aus.<\/p>\n<p>Der direkte Bezug des Kalenders zu einer Tabelle bringt allerdings einen Nachteil mit sich. Ben&ouml;tigen Sie etwa zwei Kalendersteuerelemente in Ihrem Hauptformular, so w&auml;ren diese ohne weiteres Zutun beide an dieselbe Tabelle gebunden und zeigten in der Folge auch die gleichen Daten an. In diesem Fall erstellen Sie eine Kopie der Tabelle und bezeichnen diese etwa mit <b>tblCalendar2<\/b>. Die folgend beschriebene Routine zum F&uuml;llen der Tabelle kann unterschiedliche Tabellen ber&uuml;cksichtigen.<\/p>\n<h2>F&uuml;llen der Tabelle per VBA<\/h2>\n<p>Die daf&uuml;r verantwortliche Routine nennt sich <b>FillCalendar<\/b> und ist in Listing 1 abgebildet, wobei hier einige Teile entfernt wurden, die nicht unmittelbar zum Erzeugen der Datens&auml;tze geh&ouml;ren.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Table<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Property Get <\/span>Table()<span style=\"color:blue;\"> As String<\/span>\r\n     Table = m_Table\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Property Let <\/span>Table(ByVal Value<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Table = Value\r\n     FillCalendar\r\n<span style=\"color:blue;\">End Property<\/span> \r\n<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>\r\n     <span style=\"color:blue;\">Dim <\/span>n<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>StartDate<span style=\"color:blue;\"> As Date<\/span>\r\n     Me.RecordSource = m_Table\r\n     n = Weekday(DateSerial(m_Year, m_Month, 1), vbMonday)\r\n     StartDate = DateSerial(m_Year, m_Month, 1) - n\r\n     CurrentDb.Execute \"DELETE FROM \" & m_Table\r\n     <span style=\"color:blue;\">Set<\/span> rs = CurrentDb.OpenRecordset(\"SELECT * FROM \" & m_Table, dbOpenDynaset)\r\n     For j = 0 To 5\r\n         rs.Add<span style=\"color:blue;\">New<\/span>\r\n         For i = 0 To 6\r\n             StartDate = StartDate + 1\r\n             n = VBA.Month(StartDate)\r\n             rs.Fields(\"D\" & CStr(1 + i)).Value = Day(StartDate) * IIf(n &lt;&gt; m_Month, -1, 1)\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         rs.Update\r\n         <span style=\"color:blue;\">If <\/span>n &lt;&gt; m_Month<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit For<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> j\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: F&uuml;llen einer Kalendertabelle &uuml;ber VBA-Code<\/span><\/b><\/p>\n<p>Der Name der zu f&uuml;llenden Tabelle steht im Kopf in der Eigenschaftsvariablen <b>m_Table<\/b> des Formularmoduls. Dieser Variablen muss also erst ein Wert zugewiesen werden, was die <b>Property-Let<\/b>-Prozedur <b>Table<\/b> &uuml;bernimmt:<\/p>\n<pre>frm.Table = \"tblCalendar\"<\/pre>\n<p>Erst dann kann die eigentliche Routine aufgerufen werden. Sie weist dem Formular selbst zun&auml;chst als Datensatzherkunft (<b>RecordSource<\/b>) die nun in <b>m_Table<\/b> stehende Tabelle zu. Das Formular ist im Entwurf also noch nicht zwingend an eine Tabelle gebunden, sondern das geschieht hier zu Laufzeit.<\/p>\n<p>Nun ben&ouml;tigen wir jenes Datum, welches in der linken oberen Ecke des Kalenders steht. &uuml;ber <b>Property<\/b>-Prozeduren (hier nicht im Listing), wurde in den Variablen <b>m_Month<\/b> und <b>m_Year<\/b> der gew&uuml;nschte Monat und das Jahr f&uuml;r den Kalender abgespeichert. Den Ersten dieses Monats erhalten Sie &uuml;ber die VBA-Funktion <b>DateSerial<\/b>:<\/p>\n<pre>DateSerial(m_Year, m_Month, 1)<\/pre>\n<p>Das ist indessen noch nicht das Datum, welches links oben steht. Um zu ermitteln, wie viele Tage des Vormonats zu ber&uuml;cksichtigen sind, kommt die VBA-Funktion <b>Weekday<\/b> zum Einsatz. Sie gibt eine Zahl zur&uuml;ck, die den Wochentag symbolisiert. Die <b>1<\/b> entspricht dabei <b>Montag<\/b>, die <b>7<\/b> dem <b>Sonntag<\/b>. Nun muss vom Ersten des Monats lediglich diese Zahl subtrahiert werden, und schon steht das Datum links oben fest. Es wird der Variablen <b>StartDate<\/b> vom Type <b>Date<\/b> zugewiesen. Nach diesen Vorarbeiten kann die Tabelle <b>m_Table<\/b> &uuml;ber zwei verschachtelte Schleifen mit Daten versehen werden.<\/p>\n<p>Doch vorher muss die Tabelle noch &uuml;ber die <b>Execute<\/b>-Anweisung und den <b>SQL-DELETE<\/b>-Ausdruck geleert werden. Anschlie&szlig;end &ouml;ffnet ein Recordset <b>rs<\/b> die Datens&auml;tze zum Beschreiben.<\/p>\n<p>Die Z&auml;hlervariable f&uuml;r die Schleife zum Hinzuf&uuml;gen von Datens&auml;tzen ist <b>j<\/b>. Da maximal sechs Zeilen im Kalender stehen k&ouml;nnen, ist ihr Bereich auf <b>0<\/b> bis <b>5<\/b> eingestellt. Nach jedem Durchlauf wird per <b>AddNew<\/b> ein neuer Datensatz erzeugt. F&uuml;r den Zugriff auf die Feldwerte eines Datensatzes gibt es dann die folgende Schleife auf den Z&auml;hler <b>i<\/b>, deren Bereich sich f&uuml;r die einzelnen Wochentage von <b>0<\/b> bis <b>6<\/b> erstreckt. In dieser wird fortlaufend der Wert des Kalenderdatums in <b>StartDate<\/b> um eins erh&ouml;ht.  Das ist statthaft, weil ein <b>Date<\/b>-Type imgrunde ein <b>Double<\/b>-Wert ist, wobei die Nachkommastellen die Tageszeit angeben, die Vorkommastellen die Tage. Also f&uuml;hrt Addition von <b>1<\/b> zum n&auml;chsten Tag.<\/p>\n<p>Der Zugriff auf die Datenfelder geschieht namentlich &uuml;ber das Pr&auml;fix <b>D<\/b> und den Zahler <b>i<\/b>, zu dem noch <b>1<\/b> addiert werden muss, weil die Felder von <b>1<\/b> bis <b>7<\/b> nummeriert sind, nicht von <b>0<\/b> bis <b>6<\/b>. Der Wert eines Felds errechnet sich aus dem Tagesanteil des Datums, welchen die VBA-Funktion <b>Day<\/b> zur&uuml;ckgibt.<\/p>\n<p><!--30percent--><\/p>\n<p>Im Prinzip w&auml;re es das auch schon, wollten wir nicht die Tage au&szlig;erhalb des Zielmonats mit einem Minuszeichen versehen werden. Um jene zu eruieren, wird in der Variablen <b>n<\/b> der Monatsanteil des Datums &uuml;ber die Funktion <b>Month()<\/b> zwischengespeichert. Weicht dieser Wert vom Zielmonat ab (<b>n <> m_Month<\/b>), so greift die <b>IIf<\/b>-Bedingungsfunktion (entspricht <b>Wenn()<\/b> in Abfragen), die entweder eine &#8211;<b>1<\/b> oder eine <b>1<\/b> als Ergebnis zeitigt. Und das ist eben der Multiplikator f&uuml;r den Tageswert.<\/p>\n<p>Da die &auml;u&szlig;ere Schleife immer von <b>0<\/b> bis <b>5<\/b> z&auml;hlt, w&uuml;rden auch immer sechs Zeilen im Kalender stehen. Um das etwa f&uuml;r den Monat <b>Februar<\/b> zu verhindern, vergleicht die Zeile nach der inneren Schleife die Monate abermals und verl&auml;sst die &auml;u&szlig;ere, sobald der Folgemonat erreicht ist.<\/p>\n<p>Damit ist das Werk vollbracht. Die <b>Requery<\/b>-Anweisung auf das Formular (<b>Me<\/b>) baut die Ansicht auf Grundlage der neuen Datens&auml;tze nun neu auf.<\/p>\n<h2>Entwurf des Kalenderformulars<\/h2>\n<p>Neben den eigentlichen Tagen des Kalenders im Detailbereich soll das Formular noch in den Spaltenk&ouml;pfen die Wochentage anzeigen. Au&szlig;erdem dienen zwei Kombinationsfelder im Formularkopf der Auswahl des gew&uuml;nschten Jahres und Monats. Als zus&auml;tzliche Navigationselemente k&ouml;nnen die Werte dieser Comboboxen &uuml;ber darunter liegende Buttons jeweils um eins vor oder zur&uuml;ckgeschaltet werden. Bild 6 demonstriert den Aufbau.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/sfrmCalendar_DS.png\" alt=\"Entwurfsansicht des Endlosformulars sfrmCalendar\" width=\"349,7625\" height=\"302,4637\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurfsansicht des Endlosformulars sfrmCalendar<\/span><\/b><\/p>\n<p>Die Spalten&uuml;berschriften sind durch Labels realisiert, die hier mit festen Wochentagen versehen sind. Im Detailbereich gibt es sieben Textboxen, die anf&auml;nglich an die Datenfelder <b>D1<\/b> bis <b>D7<\/b> der Tabelle <b>tblCalendar<\/b> gebunden waren. Das aber muss umgangen werden, weil sonst ja negative Tageswerte erschienen. Der Ausdruck <b>Abs<\/b> aber macht aus negativen Zahlen positive, l&auml;sst positive aber unver&auml;ndert. Also ist der <b>Steuerelementinhalt<\/b> der ersten beiden Textboxen dieser:<\/p>\n<pre>= Abs([D1])\r\n= Abs([D2])\r\n...<\/pre>\n<p>Damit werden die Tage korrekt ausgegeben. Fehlt nur noch die graue Hinterlegung der nicht zum Monat geh&ouml;rigen Tage des Kalenders &uuml;ber die <b>Bedingte Formatierung<\/b>.<\/p>\n<h2>Bedingte Formatierung der Tageswerte<\/h2>\n<p>Klicken Sie auf die erste Textbox im Detailbereich rechts und w&auml;hlen im Kontextmen&uuml; den Eintrag <b>Bedingte Formatierung&#8230;<\/b>. Das ruft einen Dialog, wie in Bild 7, auf den Plan.  Hier sind zun&auml;chst eine oder mehrere Bedingungsregeln anzulegen. Uns reicht eine. Mit Klick auf <b>Neue Regel <\/b>&ouml;ffnet sich ein zweiter Dialog. Im Bereich f&uuml;r den Vergleichsausdruck d&uuml;rfen Sie nicht die Option <b>Feldwert<\/b> w&auml;hlen, welche sich auf den Wert bez&ouml;ge, den das Textfeld gerade anzeigt. Und das ist ja &uuml;ber die <b>Abs<\/b>-Funktion immer ein positiver. Stattdessen w&auml;hlen Sie <b>Ausdruck<\/b> und setzen in das nebenstehende Feld den String <b>[D1]<0<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/FormatConditions.png\" alt=\"Dialoge zur Bedingten Formatierung der Datumtextfelder\" width=\"649,559\" height=\"445,2701\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Dialoge zur Bedingten Formatierung der Datumtextfelder<\/span><\/b><\/p>\n<p>Immer dann, wenn das Datenfeld <b>D1<\/b> kleiner ist, als <b>0<\/b>, greift die Bedingung und damit die darunter eingestellte Formatierung. F&uuml;r den Hintergrund wurde ein leichtes Grau genommen und f&uuml;r die Schriftfarbe ein Dunkelgrau, damit diese Tageswerte zur Laufzeit erscheinen, wie deaktivierte Steuerelemente. Nach dem Schlie&szlig;en beider Dialoge ist die <b>Bedingte Formatierung<\/b> abgeschlossen.<\/p>\n<p>Den Vorgang wiederholen Sie f&uuml;r die weiteren Textboxen des Detailbereichs, wobei hier nat&uuml;rlich jeweils das richtige Datenfeld im Vergleichsausdruck gew&auml;hlt werden muss. Also die Felder <b>D2<\/b> bis <b>D7<\/b>. Das Ergebnis der Angelegenheit k&ouml;nnen Sie schon einmal in Bild 8 begutachten. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/sfrmCalendar_RT.png\" alt=\"Das Formular sfrmCalendar zur Laufzeit ist hier standalone aufgerufen\" width=\"349,7625\" height=\"364,2688\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das Formular sfrmCalendar zur Laufzeit ist hier standalone aufgerufen<\/span><\/b><\/p>\n<p>Manche Kalender hinterlegen die Spalten f&uuml;r das Wochenende ebenfalls grau. Daf&uuml;r braucht es keine <b>Bedingte Formatierung<\/b>, weil es sich hier immer um die Textboxen <b>txtD6<\/b> und <b>txtD7<\/b> handelt. Setzen Sie also gegebenenfalls einfach den Hintergrund dieser Textfelder auf einen festen Wert abweichend von Wei&szlig;.<\/p>\n<h2>Navigation und Ereignisse<\/h2>\n<p>Die beiden oberen Kombinationsfelder m&uuml;ssen eingangs mit den passenden Eintr&auml;gen versehen werden. Das geschieht im Ereignis <b>Beim Laden<\/b> (<b>Form_Load<\/b>) des Formulars &uuml;ber zwei Schleifen.<\/p>\n<p>Die einfachere ist dabei die zum Setzen der Jahreszahlen:<\/p>\n<pre>For i= 1950 To 2030\r\n     Me!cbYear.AddItem i\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Die Monatsnamen k&ouml;nnen Sie auch fest im Entwurf des Formulars festlegen, indem Sie die Eigenschaft <b>Herkunftstyp<\/b> der Combobox auf <b>Wertliste<\/b> einstellen und in der Eigenschaft <b>Datensatzherkunft<\/b> die Monatsnamen semikolon-getrennt hineinschrieben. Dann aber g&auml;be das Kombinationsfeld <b>cbMonth<\/b> nach Auswahl eines Eintrags nur den Monatsnamen als Wert aus. F&uuml;r die Variable <b>m_Month<\/b> zum Anlegen der Datens&auml;tze ben&ouml;tigen wir aber eher eine Zahl. Daher ist die Combobox auch zweispaltig ausgelegt. Die erste versteckte Spalte, an die auch der Wert des Steuerelements gebunden ist, enth&auml;lt die Zahlen, die zweite Spalte die Monatsnamen. Auch dies k&ouml;nnte &uuml;ber die Eigenschaft <b>Datensatzherkunft <\/b>geschehen, was zu diesem String f&uuml;hrt:<\/p>\n<pre>1;Januar;2;Februar;3;M&auml;rz;4;April;5;Mai;...<\/pre>\n<p>In unserer Version &uuml;bernimmt das jedoch dieser Schleifen-Code in <b>Form_Load<\/b>:<\/p>\n<pre>For i = 1 To 12\r\n     Me!cbMonth.AddItem CStr(i) & \";\" & _\r\n                              Format(DateSerial(m_Year, i, 1), \"mmmm\") & \";\"\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Jede Zeile der Combobox bekommt in der ersten Spalte &uuml;ber String-Verkettung den Schleifenz&auml;hler <b>i<\/b> verabreicht, gefolgt von einem Semikolon, an das sich der Monatsname anschlie&szlig;t. Den berechnen Sie einfach &uuml;ber ein k&uuml;nstliches Datum, welches die <b>DateSerial<\/b>-Funktion zur&uuml;ckgibt. Aus dem Datum erhalten Sie per Format-Funktion und den Formatierungsausdruck <b>mmmm<\/b> dann den Monatsnamen im Volltext als Anteil. Der Ausdruck <b>mmm<\/b> hingegen f&uuml;hrt zu abgek&uuml;rzten Monaten:<\/p>\n<pre>Jan; Feb; Mar; Apr; ...<\/pre>\n<p>Die Auswahl eines Eintrags aus diesen Comboboxen l&ouml;st ein Ereignis aus, das zum erneuten Bef&uuml;llen der Tabelle und Neuzeichnen des Kalenders &uuml;ber die Routine <b>FillCalendar<\/b> f&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbMonth_AfterUpdate()\r\n     m_Month = Me!cbMonth.Value\r\n     &lt;b&gt;FillCalendar&lt;\/b&gt;\r\n     RaiseEvent MonthChanged(m_Month)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cbYear_AfterUpdate()\r\n     m_Year = Me!cbYear.Value\r\n     &lt;b&gt;FillCalendar&lt;\/b&gt;\r\n     RaiseEvent YearChanged(m_Year)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die entsprechenden <b>Member<\/b>-Variablen <b>m_Year<\/b> und <b>m_Month<\/b> werden also mit neuen Werten versehen, die die Grundlage f&uuml;r die weiteren Vorg&auml;nge bilden.<\/p>\n<p>Nachdem der Kalender neu angelegt ist, kommt jeweils die Anweisung <b>RaiseEvent<\/b> ins Spiel. Dies l&ouml;st ein Ereignis aus, das vom Formular, welches das Unterformularelement enth&auml;lt, sp&auml;ter abgefangen werden kann. Dazu sind zun&auml;chst &uuml;ber das Schl&uuml;sselwort <b>Event<\/b> Ereignisse im Kopf des Kalenderformulars deklariert:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event YearChanged(ByVal NewYear<span style=\"color:blue;\"> As Long<\/span>)\r\n<span style=\"color:blue;\">Public <\/span>Event MonthChanged(ByVal NewMonth<span style=\"color:blue;\"> As Long<\/span>)<\/pre>\n<p>Diese Ereignisse k&ouml;nnen dezidiert mit <b>RaiseEvent<\/b> aufgerufen werden, wobei als Parameter das ge&auml;nderte Jahr oder der ge&auml;nderte Monat &uuml;bergeben werden. Um auf diese Ereignisse reagieren zu k&ouml;nnen, muss das Hauptformular das Kalenderunterformular dergestalt instanziieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents oCalendar<span style=\"color:blue;\"> As <\/span>Form_sfrmCalendar<\/pre>\n<p>Dadurch l&auml;sst sich eine Ereignisprozedur f&uuml;r die Objektinstanz <b>oCalender<\/b> generieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>oCalendar_MonthChanged(ByVal NewMonth<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Neuer Kalendermonat: \" & NewMonth\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im VBA-Direktfenster wird damit der neu im Kalendersteuerelement gew&auml;hlte Monat zur Information ausgegeben. Nat&uuml;rlich kann der Wert anschlie&szlig;end auch f&uuml;r beliebige weitere Vorg&auml;nge im Hauptformular genutzt werden.<\/p>\n<p>Die vier Schaltfl&auml;chen zum Weiter- oder Zur&uuml;ckschalten von Jahr und Monat wirken &auml;hnlich, wie die Auswahl eines Combobox-Eintrags. Sie f&uuml;hren ebenfalls zum Neuanlegen des Kalenders und zum Ausl&ouml;sen der Ereignisse. Die <b>Click<\/b>-Prozedur f&uuml;r den Button <b>cmdMonthNext<\/b> zum Weiterschalten des Monats etwa sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdMonthNext_Click()\r\n     m_Month = m_Month + 1\r\n     <span style=\"color:blue;\">If <\/span>m_Month =13<span style=\"color:blue;\"> Then<\/span> m_Month = 12\r\n     Me!cbMonth.Value = m_Month\r\n     FillCalendar\r\n     RaiseEvent MonthChanged(m_Month)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>m_Month<\/b> wird um eins erh&ouml;ht. F&uuml;r den <b>Dezember<\/b> w&uuml;rde das bedeuten, dass nun die ung&uuml;ltige Zahl <b>13<\/b> herauskommt. Deshalb ber&uuml;cksichtigt die Routine diesen Umstand und macht &uuml;ber die <b>If<\/b>-Zeile aus der <b>13<\/b> eine eins f&uuml;r den folgenden <b>Januar<\/b>. Dem Monatskombinationsfeld <b>cbMonth<\/b> wird dann der neue Wert zugewiesen, damit sich die Auswahl auch in diesem zeigt. Der Rest verl&auml;uft analog dem schon Dargestellten.<\/p>\n<p>Den Code f&uuml;r die weiteren Schaltfl&auml;chen f&uuml;hren wir hier nicht auf, weil er prinzipiell gleich aufgebaut ist.<\/p>\n<h2>Reaktion auf Datumsauswahl im Kalender<\/h2>\n<p>Beim Klick auf einen Tag des Kalendersteuerelements soll dieses ein Ereignis ausl&ouml;sen, das das gew&auml;hlte Datum als Parameter &uuml;bergibt. Deshalb ist ein weiteres Ereignis im Modulkopf deklariert:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event DateSelected(ByVal Value<span style=\"color:blue;\"> As Date<\/span>)<\/pre>\n<p>Dieses Ereignis soll per <b>RaiseEvent<\/b> aufgerufen werden, wenn auf eine der sieben Textfelder geklickt wird. Die Ereignisprozeduren f&uuml;r die beiden ersten Textfelder:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtD1_Click()\r\n     fuClick\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtD2_Click()\r\n     fuClick\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier passiert weiter nichts, als dass die Hilfsprozedur <b>fuClick<\/b> aufgerufen wird. Die n&auml;mlich berechnet das Datum eigenst&auml;ndig (s. Listing 2). Dass die Routine keine Parameter&uuml;bergabe ben&ouml;tigt, sieht man an ihrer ersten Zeile. Die spricht das im Formular gerade aktive Steuerelement an (<b>ActiveControl<\/b>), was infolge des Klicks eben das entsprechende Textfeld ist. Ihr Wert ist der &uuml;ber die <b>Abs<\/b>-Funktion des Steuerelementinhalts erhaltene Tag des Monats.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>fuClick()\r\n     <span style=\"color:blue;\">Dim <\/span>n<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>nAdd<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     n = Me.ActiveControl.Value\r\n     <span style=\"color:blue;\">If <\/span>(Me.CurrentRecord &lt; 2) And (n &gt; 20)<span style=\"color:blue;\"> Then<\/span> nAdd = -1\r\n     <span style=\"color:blue;\">If <\/span>(Me.CurrentRecord &gt; 5) And (n &lt; 8)<span style=\"color:blue;\"> Then<\/span> nAdd = 1\r\n     m_SelectedDate = DateSerial(m_Year, m_Month + nAdd, n)\r\n     Me!LblDate.Caption = Format(m_SelectedDate, \"dddd\\, dd.mm.yyyy\")\r\n     RaiseEvent DateSelected(m_SelectedDate)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ermitteln des Datums aus der aktiven Textbox<\/span><\/b><\/p>\n<p>Das Datum kann damit auf einfache Weise berechnet werden. Es ergibt sich &uuml;ber <b>DateSerial<\/b> aus dem Jahr (<b>m_Year<\/b>), Monat (<b>m_Month<\/b>), plus dem Offset des in <b>n<\/b> zwischengespeicherten Tags. Allerdings f&uuml;hrt das zu einem Fehler, wenn ein au&szlig;erhalb des Monats liegender Tag angeklickt wird. Das ist zum einen dann der Fall, wenn die Position des aktiven Datensatz (<b>CurrentRecord<\/b>) kleiner ist, als <b>2<\/b> und der Tageswert in <b>n<\/b> gr&ouml;&szlig;er, als <b>20<\/b>. Dann handelt es sich um den Vormonat und in die Variable <b>nAdd<\/b> wird der Wert <b>-1<\/b> gesetzt. Zum anderen bedeutet eine Datensatzposition von gr&ouml;&szlig;er als <b>5<\/b> und ein Tageswert von kleiner als <b>8<\/b>, dass es sich um den Folgemonat handeln muss. Dann steht in <b>nAdd<\/b> der Wert <b>1<\/b>, der ansonsten <b>0<\/b> betr&auml;gt, wenn keine der beiden Bedingungen erf&uuml;llt ist. Der Wert von <b>nAdd<\/b> wird schlie&szlig;lich dem Monat in <b>m_Month<\/b> hinzuaddiert, wodurch <b>DateSerial<\/b> wieder das korrekte Datum berechnet.<\/p>\n<p>Die Routine l&ouml;st am Ende das Ereignis <b>DateSelected<\/b> aus, schreibt aber zuvor noch in ein Label, welches sich im Fu&szlig;bereich des Kalenderformulars befindet, das Datum formatiert aus, damit hier ein Feedback &uuml;ber die Auswahl geschieht. Ein letztes Ereignis gibt es noch:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event NewHeight(ByVal H<span style=\"color:blue;\"> As Long<\/span>)<\/pre>\n<p>Es wird immer dann ausgel&ouml;st, wenn sich die H&ouml;he des Kalendersteuerelements &auml;ndert. Grund daf&uuml;r ist der Umstand, dass, je nach Monat, der Kalender vier bis sechs Zeilen hoch sein kann. Durch die Endlosdarstellung der Datens&auml;tze &auml;ndert sich folglich die Gesamth&ouml;he des Formulars. Im Ereignis <b>NewHeight<\/b> &uuml;bergibt die Variable <b>H<\/b> dann diese H&ouml;he. Darauf kann das Hauptformular reagieren und f&uuml;r das Unterformular eine neue Ausdehnung anweisen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>oCalendar_NewHeight(ByVal H<span style=\"color:blue;\"> As Long<\/span>)\r\n     Me!ctlCalendar.Height = H\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ob die fortw&auml;hrende &auml;nderung der H&ouml;he des Kalendersteuerelements im Hauptformular besonders chic ist, m&uuml;ssen Sie entscheiden. Zwar eliminieren Sie damit seinen manchmal auftauchenden grauen Hintergrund, aber im Sinne von Oberfl&auml;chenergonomie ist das Flackern des Elements nicht unbedingt.<\/p>\n<p>Die H&ouml;he <b>H<\/b> f&uuml;r das Event wird &uuml;brigens in der Prozedur <b>FillCalendar<\/b> so berechnet:<\/p>\n<pre>H = Me.Section(acHeader).Height + Me.Section(acFooter).Height    H = H + Me.Recordset.RecordCount * Me.Section(acDetail).Height<\/pre>\n<p>Zun&auml;chst werden H&ouml;he des Formularkopfs (<b>adHeader<\/b>) und -fu&szlig;es (<b>acFooter<\/b>) zusammengez&auml;hlt. Dann wird die H&ouml;he des Detailbereichs (<b>acDetail<\/b>) mit der Anzahl der Datens&auml;tze multipliziert und der Gesamth&ouml;he hinzuaddiert.<\/p>\n<h2>Vorauswahl eines Datums<\/h2>\n<p>Unter Umst&auml;nden m&ouml;chten Sie im Kalender per Code visuell ein Datum voreinstellen. &uuml;ber die Eigenschaften <b>Month<\/b> und <b>Year<\/b> des Moduls lassen sich zwar Monat und Jahr voreinstellen, nicht aber der Tag. Daf&uuml;r gibt es die &ouml;ffentliche Prozedur <b>SelectDate<\/b> im Formular. Auch ihr Aufruf f&uuml;hrt zu einem Neuzeichnen des Kalenders, wie die folgenden Zeilen belegen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SelectDate(ByVal D<span style=\"color:blue;\"> As Date<\/span>)\r\n     Me.Year = VBA.Year(D)\r\n     Me.Month = VBA.Month(D)\r\n     m_SelectedDate = D\r\n     FillCalendar D\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Jahr wird aus dem in <b>D<\/b> &uuml;bergebenen Datum &uuml;ber die Funktion <b>VBA.Year<\/b> ermittelt, der Monat &uuml;ber <b>VBA.Month<\/b>. Ohne diese Bibliothekspr&auml;fixe w&uuml;rde VBA denken, dass die im Formularcode deklarierten Prozeduren <b>Year<\/b> und <b>Month<\/b> gemeint sind. Die Werte werden nun aber diesen <b>Property<\/b>-Prozeduren <b>Year<\/b> und <b>Month<\/b> tats&auml;chlich zugewiesen. Die zus&auml;tzliche Formularvariable <b>m_SelectedDate<\/b> erh&auml;lt au&szlig;erdem dieses Datum. Schlie&szlig;lich wird <b>FillCalendar<\/b> wieder aufgerufen, wobei in diesem speziellen Fall im optionalen Parameter das auszuw&auml;hlende Datum <b>D<\/b> &uuml;bergeben wird. Deren Deklarationszeile hat n&auml;mlich in der Beispieldatenbank, abweichend von Listing 1, diese Syntax:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FillCalendar(<span style=\"color:blue;\">Optional<\/span> SelDate<span style=\"color:blue;\"> As Variant<\/span>)<\/pre>\n<p>Der Teil in <b>FillCalendar<\/b>, welcher dieses Datum ber&uuml;cksichtig: <\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsMissing(SelDate)<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">If <\/span>StartDate = SelDate<span style=\"color:blue;\"> Then<\/span> x = i + 1: y = j\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Wird <b>FillCalendar<\/b> ohne Parameter aufgerufen, dann trifft <b>IsMissing<\/b> zu und die Bedingung wird &uuml;bergangen. Andernfalls schaut die n&auml;chste Zeile darauf, ob das in <b>SelDate<\/b> &uuml;bergebene Datum mit dem von <b>StartDate<\/b> &uuml;bereinstimmt. Zur Erinnerung: <b>StartDate<\/b> wird in einer Schleife andauernd erh&ouml;ht, bis alle Tage des Kalendermonats durchlaufen sind. Ist das passende Datum identifiziert, so speichert die Routine die Zahler <b>i<\/b> und <b>j<\/b>  in den Variablen <b>x<\/b> und <b>y<\/b> zwischen. Dabei entspricht <b>x<\/b> der Nummerierung der auszuw&auml;hlenden Textbox und <b>y<\/b> der Position des Datensatzes im Endlosformular. Nach Durchlaufen aller Monatstage und damit der Neuanlage der Datens&auml;tze in der Tabelle kommt es zu einem Zweig, der die richtige Textbox anhand der Koordinaten ausw&auml;hlt:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsMissing(SelDate)<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.TextBox\r\n     Me.Recordset.AbsolutePosition = y\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Me.Controls(\"txtD\" & CStr(x))\r\n     ctl.SetFocus\r\n     ctl.SelStart = 1: ctl.SelLength = 2\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Der Datenbankzeiger wird &uuml;ber die Eigenschaft <b>AbsolutePosition<\/b> des Formular-Recordsets zun&auml;chst auf die Koordinate <b>y<\/b> eingestellt. Das aktiviert automatisch den entsprechenden Datensatz im Formular. Die Objektvariable <b>ctl<\/b> vom Typ <b>Textbox<\/b> wird nun auf das durch <b>x<\/b> identifizierte Steuerelement gesetzt, also eines der Textfelder <b>txtD1<\/b> bis <b>txtD7<\/b>. <b>SetFocus<\/b> selektiert schlie&szlig;lich das Textfeld, wobei das erst dann sichtbar wird, nachdem eine Markierung des Textinhalts &uuml;ber die Eigenschaften <b>SelStart<\/b> und <b>SelLength<\/b> vorgenommen wurde.<\/p>\n<h2>&auml;nderungen am Layout<\/h2>\n<p>Die Gestalt des Kalendersteuerelements kann rudiment&auml;r beeinflusst werden. Das betrifft die Schriftart und -gr&ouml;&szlig;e f&uuml;r alle enthaltenen Steuerelemente, sowie die Hintergrundfarbe. Sie setzen dazu Werte f&uuml;r die Eigenschaften <b>FontName<\/b>, <b>FontSize<\/b> und <b>BackColor<\/b>, welche intern in die <b>Member<\/b>-Variablen <b>m_Fontname<\/b>, <b>m_Fontsize<\/b> und <b>m_BackColor<\/b> abgespeichert werden. Das Setzen von <b>BackColor<\/b> wird in der Eigenschaftsprozedur direkt f&uuml;r die Hintergrundbereiche durchgef&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Property Let <\/span>BackColor(ByVal Value<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_Backcolor = Value\r\n     Me.Section(acDetail).BackColor = Value\r\n     Me.Section(acFooter).BackColor = Value\r\n     Me.Section(acHeader).BackColor = Value\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Zum Formatieren aller weiteren Steuerelemente gibt es eine Hilfsroutine <b>FormatControls<\/b>, die alle im Formular enthaltenen anhand der <b>Controls<\/b>-Auflistung in einer <b>For-Each<\/b>-Schleife durchl&auml;uft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FormatControls()\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.Control\r\n     \r\n     For Each ctl In Me.Controls\r\n         Select Case ctl.ControlType\r\n         <span style=\"color:blue;\">Case <\/span>acTextBox, acLabel, acCheckBox\r\n             ctl.FontName = m_Fontname\r\n             ctl.FontSize = m_FontSize\r\n             ctl.BackColor = m_Backcolor\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dabei werden nur Textboxen, Labels und Checkboxen ber&uuml;cksichtig, denn andere Steuerelementtypen (<b>ControlType<\/b>), wie Linien, weisen etwa eventuell die Eigenschaft <b>FontName<\/b> nicht auf.<\/p>\n<p>Die Hilfsroutine wird immer dann aufgerufen, wenn Sie den <b>Let<\/b>-Prozeduren f&uuml;r <b>FontName<\/b>, <b>FontSize<\/b> oder <b>BackColor<\/b> neue Werte zuweisen.<\/p>\n<h2>Einbau des Kalenders in Hauptformulare<\/h2>\n<p>Sie verwenden das Kalendersteuerelement, indem Sie es als Unterformular in ein anderes Formular einsetzen. Also legen Sie ein neues Unterformular an und w&auml;hlen in der Eigenschaft <b>Herkunftsobjekt<\/b> <b>sfrmCalendar<\/b> aus. Positionieren Sie es nach Belieben. Die Abmessungen allerdings m&uuml;ssen etwa 5 cm in der Breite und 5,6 cm in der H&ouml;he betragen. Mehr m&uuml;ssen Sie zun&auml;chst nicht tun. Wenn Sie aber auf die Ereignisse des Steuerelements reagieren oder das Layout beeinflussen m&ouml;chten, so legen Sie besser eine Objektvariable f&uuml;r das Element an, der im Ereignis beim Laden des Hauptformulars der Kalender zugewiesen wird.<\/p>\n<p>Wir m&ouml;chten hier zus&auml;tzlich demonstrieren, wie der Umgang mit zwei Kalenderelementen aussieht. Im Entwurf sieht das aus, wie in Bild 9. Das linke Kalenderunterformular zeigt den erwartungsgem&auml;&szlig;en Inhalt. Das rechte mit den identischen Einstellungen gibt nur einen Platzhaltertext an. Das liegt daran, weil Access ein Unterformular grunds&auml;tzlich editierbar darstellt. Da ein Bearbeiten nur an einer Stelle geschehen kann, zeigt sich dessen Design auch nur in einem Unterformularsteuerelement.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmCalendar_DS.png\" alt=\"Zwei Kalender-Unterformulare befinden sich im Hauptformular neben einem Textfeld zum Loggen der Ereignisse\" width=\"700\" height=\"338,2733\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Zwei Kalender-Unterformulare befinden sich im Hauptformular neben einem Textfeld zum Loggen der Ereignisse<\/span><\/b><\/p>\n<p>&uuml;ber den Kalendern sind Schaltfl&auml;chen untergebracht, die zeigen, wie per VBA zu einem bestimmten Datum in den Kalendern gesprungen werden kann. Das Textfeld ganz rechts loggt zur Kontrolle alle Ereignisse beider Kalender.<\/p>\n<p>Beim Laden des Hauptformulars stellt die Ereignisprozedur einige Eigenschaften der Kalender ein, wobei diese zuerst zwei Objektvariablen <b>oCalendar1<\/b> und <b>oCalendar2<\/b> <b>WithEvents<\/b> zugewiesen werden:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents oCalendar1<span style=\"color:blue;\"> As <\/span>Form_sfrmCalendar\r\n<span style=\"color:blue;\">Private <\/span>WithEvents oCalendar2<span style=\"color:blue;\"> As <\/span>Form_sfrmCalendar\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> oCalendar1 = Me!ctlCalendar1.Form\r\n     <span style=\"color:blue;\">Set<\/span> oCalendar2 = Me!ctlCalendar2.Form<\/pre>\n<p>In zwei <b>With<\/b>-Bl&ouml;cken mit Bezug auf diese Objektvariablen nehmen Sie die gew&uuml;nschten Einstellungen der Kalender vor:<\/p>\n<pre>     <span style=\"color:blue;\">With<\/span> oCalendar1\r\n         .Table = \"tblCalendar\"\r\n         .FontName = \"Arial\"\r\n         .FontSize = 10\r\n         .Year = 2017\r\n         .Month = 6\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">With<\/span> oCalendar2\r\n         .Table = \"tblCalendar2\"\r\n         .FontName = \"Courier New\"\r\n         .FontSize = 10\r\n         .Year = 2018\r\n         .Month = 7\r\n         .BackColor = <span style=\"color:blue;\">RGB<\/span>(200, 208, 255)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Eine Voraussetzung, damit das Ganze funktioniert, ist, dass es die beiden identischen Tabellen <b>tblCalendar<\/b> und <b>tblCalendar2<\/b> gibt, die in der Eigenschaft <b>Table<\/b> angegeben werden. Beiden Kalendern werden unterschiedliche Monate des Jahres <b>2018<\/b> zugewiesen und die Schriftfarben, wie Hintergr&uuml;nde, sollen ebenfalls differieren. Zur Laufzeit zeigt sich das Formular <b>frmCalendar<\/b> schlie&szlig;lich, wie in Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/frmCalendar_RT.png\" alt=\"Das finale Testformular zeigt zwei Kalender auf Basis des sfrmCalendar mit unterschiedlichem Layout an\" width=\"700\" height=\"301,2179\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Das finale Testformular zeigt zwei Kalender auf Basis des sfrmCalendar mit unterschiedlichem Layout an<\/span><\/b><\/p>\n<p>Hier sind bereits die beiden Schaltfl&auml;chen oben bet&auml;tigt worden, was zur Navigation zu den aufgedruckten Jahren und Monaten f&uuml;hrt und den gew&uuml;nschten Tag markiert. Das Datum steht dann jeweils im Label unten. Der linken Schaltfl&auml;che etwa ist diese Zeile hinterlegt:<\/p>\n<pre>oCalendar1.SelectDate \"03.04.2019\"<\/pre>\n<p>Obwohl die Prozedur <b>SelectDate<\/b> eigentlich einen <b>Date<\/b>-Typ als Parameter erwartet, kann man ebenso einen String zuweisen, weil VBA in diesem Fall intern eine Konvertierung vornimmt.<\/p>\n<p>Das Navigieren zu anderen Monaten und Jahren, das Anklicken eines Datums, f&uuml;hren zu Ereignissen, die alle &uuml;ber die Prozedur <b>AddToLog<\/b> in der Textbox rechts geloggt werden, etwa<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>oCalendar1_DateSelected(ByVal Value<span style=\"color:blue;\"> As Date<\/span>)\r\n     AddToLog \"C1, Datum ausgew&auml;hlt: \" & Value\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Sub <\/span>AddToLog(ByVal txt<span style=\"color:blue;\"> As String<\/span>)\r\n     Me!txtInfo.Value = txt & <span style=\"color:blue;\">vbCrLf<\/span> & Me!txtInfo.Value\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>C1<\/b> betrifft dabei den linken, <b>C2<\/b> den rechten Kalender. Sie sehen auch, dass die H&ouml;he der Kalenderunterformulare unterschiedlich ist. Verantwortlich daf&uuml;r ist die Reaktion auf das <b>NewHeight<\/b>-Ereignis:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>oCalendar1_NewHeight(ByVal H<span style=\"color:blue;\"> As Long<\/span>)\r\n     Me!ctlCalendar1.Height = H\r\n     AddToLog \"C1, Neue H&ouml;he: \" & H\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Vielleicht f&auml;llt Ihnen noch auf, dass der Mauszeiger &uuml;ber den Datumsfeldern in ein Hand-Symbol verwandelt. Das liegt daran, dass f&uuml;r alle Textboxen die Eigenschaft <b>Ist Hyperlink<\/b> aktiviert ist und die Eigenschaft <b>Als Hyperlink anzeigen<\/b> auf <b>Immer<\/b> steht. Deshalb sind die Datums-Strings auch unterstrichen dargestellt.<\/p>\n<p>M&ouml;chten Sie das Kalendersteuerelement in eigenen Datenbanken verwenden, so importieren Sie lediglich das Formular <b>sfrmCalendar<\/b> und die Tabelle <b>tblCalendar<\/b> aus der Beispieldatenbank. Zus&auml;tzliche Verweise sind nicht zu setzen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KalenderCtl.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/5184A42D-470C-4EBA-906A-3BF57ED5036A\/aiu_1099.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zur Ein- oder Ausgabe eines Datums macht sich ein geeignetes Kalendersteuerelement im Formular besser, als ein schn&ouml;des Textfeld. Das kann fest im Formular integriert sein, oder als Popup zur Auswahl erscheinen. In Buchungssystemen im Web sind solche Kalenderelemente allgegenw&auml;rtig. Auch Access wurde mit der Version 2007 ein solches Popup-Element spendiert, welches sich aber leider in keiner Weise steuern l&auml;sst. Grund genug also, um sich nach Alternativen umzuschauen.<\/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-55001099","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 1 - 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_1\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kalendersteuerelement, Teil 1\" \/>\n<meta property=\"og:description\" content=\"Zur Ein- oder Ausgabe eines Datums macht sich ein geeignetes Kalendersteuerelement im Formular besser, als ein schn&ouml;des Textfeld. Das kann fest im Formular integriert sein, oder als Popup zur Auswahl erscheinen. In Buchungssystemen im Web sind solche Kalenderelemente allgegenw&auml;rtig. Auch Access wurde mit der Version 2007 ein solches Popup-Element spendiert, welches sich aber leider in keiner Weise steuern l&auml;sst. Grund genug also, um sich nach Alternativen umzuschauen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:26:43+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168\" \/>\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=\"12\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_1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kalendersteuerelement, Teil 1\",\"datePublished\":\"2020-05-13T21:26:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/\"},\"wordCount\":2282,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/975e5e3c823d4459bf2c8804000a0168\",\"articleSection\":[\"2017\",\"5\\\/2017\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/\",\"name\":\"Kalendersteuerelement, Teil 1 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/975e5e3c823d4459bf2c8804000a0168\",\"datePublished\":\"2020-05-13T21:26:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/975e5e3c823d4459bf2c8804000a0168\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/975e5e3c823d4459bf2c8804000a0168\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kalendersteuerelement_Teil_1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kalendersteuerelement, Teil 1\"}]},{\"@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 1 - 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_1\/","og_locale":"de_DE","og_type":"article","og_title":"Kalendersteuerelement, Teil 1","og_description":"Zur Ein- oder Ausgabe eines Datums macht sich ein geeignetes Kalendersteuerelement im Formular besser, als ein schn&ouml;des Textfeld. Das kann fest im Formular integriert sein, oder als Popup zur Auswahl erscheinen. In Buchungssystemen im Web sind solche Kalenderelemente allgegenw&auml;rtig. Auch Access wurde mit der Version 2007 ein solches Popup-Element spendiert, welches sich aber leider in keiner Weise steuern l&auml;sst. Grund genug also, um sich nach Alternativen umzuschauen.","og_url":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:26:43+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kalendersteuerelement, Teil 1","datePublished":"2020-05-13T21:26:43+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/"},"wordCount":2282,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168","articleSection":["2017","5\/2017","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/","url":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/","name":"Kalendersteuerelement, Teil 1 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168","datePublished":"2020-05-13T21:26:43+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/975e5e3c823d4459bf2c8804000a0168"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kalendersteuerelement_Teil_1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kalendersteuerelement, Teil 1"}]},{"@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\/55001099","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=55001099"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001099\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}