Bis Access 2003 wiesen Textfelder, die an Datumsfelder gebunden waren, überhaupt keine besonderen Eigenschaften auf. Mit Access 2007 änderte sich dies: Immerhin erscheint hier ein Kalender-Symbol neben dem Textfeld, wenn dieses den Fokus hat, und bietet eine Hilfe für die schnelle Datumsauswahl an. Mit der Lösung aus diesem Beitrag statten Sie Datumstextfelder aller Access-Versionen seit 2000 mit weiteren nützlichen Features aus.
Beispieldatenbank
Die Beispieltabelle zu diesem Beitrag tblDatum enthält schlicht zwei Felder: DatumID dient als Primärschlüssel und Beispieldatum enthält das Feld, an das wir gleich das Datumstextfeld des Beispielformulars binden. Dieses Formular heißt frmDatum und ist über die Eigenschaft Datenherkunft an die Tabelle tblDatum gebunden. Im Detailbereich zeigt es die beiden einzigen Felder dieser Tabelle an (siehe Bild 1).
Bild 1: Entwurfsansicht des Beispielformulars zur Eingabe von Datumsangaben
Vereinfachungen für die Datumseingabe
Wir schauen uns im Rahmen dieses Beitrags drei kleine Hilfen für die einfache Datumseingabe an:
- Eingabe des aktuellen Datums per Leertaste
- ändern eines Datumselements mit der Nach oben-Taste
- ändern eines Datumselements mit der Nach unten-Taste
Die Funktion, die wir mit der Leertaste abbilden möchten, ist eigentlich bereits in Access eingebaut: Sie brauchen einfach nur die Tastenkombination Strg + Umschalt + Komma (,) zu betätigen, schon fügt Access das Datum in das aktuelle Steuerelement ein. Für die Uhrzeit erreichen Sie dies übrigens mit Strg + Umschalt + Punkt (.). Beide Tastenkombinationen sind, das erkennt auch der Laie schnell, nur schwer zu merken, wenn man nicht täglich damit arbeitet.
Aktuelles Datum per Leerzeile
Also verwenden wir einfach die Leertaste als Tastenkombination für die Eingabe des aktuellen Datums. Dies können wir uns erlauben, denn in einer Datumsangabe hat ein Leerzeichen natürlich nichts zu suchen.
Tasteneingaben fangen wir generell mit den KeyDown– und KeyUp-Methoden von Formularen und Steuerelementen ab. Wann welches dieser Ereignisse ausgelöst wird, finden Sie am einfachsten heraus, indem Sie die folgenden beiden Ereignisprozeduren für die entsprechenden Ereigniseigenschaften des Textfelds Beispieldatum hinterlegen:
Private Sub Beispieldatum_KeyDown(KeyCode _ As Integer, Shift As Integer) Debug.Print "KeyDown", KeyCode, Shift End Sub Private Sub Beispieldatum_KeyUp(KeyCode _ As Integer, Shift As Integer) Debug.Print "KeyUp", KeyCode, Shift End Sub
Nun platzieren Sie das Access-Fenster so über (oder auch neben) das VBA-Fenster, dass der Direktbereich des VBA-Fensters sichtbar ist. Wenn Sie den Fokus auf das Textfeld Beispieldatum legen und Zeichen mit der Tastatur eingeben, sehen Sie nicht nur, wann welches Ereignis ausgelöst wird, sondern auch, welche Werte die Parameter Keycode und Shift dieser Prozeduren liefern – die Leertaste entspricht beispielsweise dem KeyCode 32. Auf diese Weise erkennen wir außerdem, zu welchem Zeitpunkt ein Zeichen im Textfeld erscheint, nämlich nach dem Herunterdrücken der betroffenen Taste.
Dies nutzen wir aus, um bei Betätigung der Leertaste das aktuelle Datum einzufügen, und zwar durch folgende änderung der Ereignisprozedur Beispieldatum_KeyDown:
Private Sub Beispieldatum_KeyDown(KeyCode _ As Integer, Shift As Integer) Select Case KeyCode Case 32 Me!Beispieldatum = Date KeyCode = 0 Case Else Debug.Print KeyCode, Shift End Select End Sub
Dadurch füllt die Prozedur das Textfeld mit dem aktuellen Datum und setzt den Parameter KeyCode auf den Wert 0. Indem Sie diesen Parameter innerhalb der Ereignisprozedur ändern, können Sie in die Nachrichtenkette eingreifen: Statt des ursprünglichen Werts, beispielsweise 32 für ein Leerzeichen, wird dann der Wert 0 als betätigte Taste weitergeleitet – was bedeutet, dass keine Taste gedrückt wurde.
Dies ist unbedingt nötig, weil Access sonst zuerst, wie gewünscht, das Datum in das Textfeld einträgt, dann aber das ursprüngliche Zeichen, also das Leerzeichen, an das Textfeld schickt. Dies kann je nach Einstellung dazu führen, dass das Leerzeichen das gerade eingegebene Datum überschreibt.
Vor und zurück
Nun fügen wir eine weitere Vereinfachung hinzu: Der Benutzer soll durch Betätigen der Nach oben– und Nach unten-Tasten das Datum einstellen können. Dabei soll das Element, auf dem sich die Einfügemarke aktuell befindet, jeweils um eins erhöht oder vermindert werden.
Wenn sich der Cursor also auf dem Monat befindet und der Benutzer auf Nach oben drückt, soll der Monat um eins erhöht werden.
Mit der Ausgabe der obigen Prozedur im Direktfenster ermitteln wir, welche Werte für den Parameter KeyCode der Nach oben– und Nach unten-Taste entsprechen. Dann erweitern wir die Select Case-Anweisung wie in Listing 1.
Listing 1: Einstellen des Datums in einem Textfeld per Nach oben- und Nach unten-Taste
Private Sub Beispieldatum_KeyDown(KeyCode As Integer, Shift As Integer) Dim intSelStart As Integer Dim intPosDate As Integer Dim intFaktor As Integer Dim strIntervall As String Select Case KeyCode Case 32 Me!Beispieldatum = Date KeyCode = 0 Case 38, 40 Select Case KeyCode Case 38 ''Nach oben intFaktor = 1 Case 40 ''Nach unten intFaktor = -1 End Select intSelStart = Me!Beispieldatum.SelStart intPosDate = Len(Left(Me!Beispieldatum, intSelStart)) _ - Len(Replace(Left(Me!Beispieldatum, intSelStart), ".", "")) Select Case intPosDate Case 0 strIntervall = "d" Case 1 strIntervall = "m" Case 2 strIntervall = "yyyy" End Select Me!Beispieldatum = DateAdd(strIntervall, intFaktor, Me!Beispieldatum) KeyCode = 0 Me.Beispieldatum.SelStart = intSelStart Case Else Debug.Print "KeyDown", KeyCode, Shift End Select Debug.Print Beispieldatum.Format End Sub
Da fast alle Anweisungen, die beim Betätigen der Nach oben– oder der Nach unten-Taste aufgerufen werden, identisch sind, enthält die Prozedur zunächst einen Case-Zweig, der KeyCode auf die Werte 38 (Nach oben) und 40 (Nach unten) prüft. Darin befindet sich eine weitere Select Case-Anweisung, welche die Variable intFaktor je nach gedrückter Taste auf 1 (Nach oben) oder -1 (Nach unten) einstellt. Dieser Faktor legt fest, ob eine Einheit (ein Tag, ein Monat oder ein Jahr) zum angezeigten Datum hinzugefügt oder davon abgezogen wird.
Als Nächstes ermittelt die Prozedur, an welcher Stelle innerhalb des Datums sich die Einfügemarke befindet: auf dem Tag, dem Monat oder dem Jahr Die Vorgehensweise geht davon aus, dass das Datum im Format dd.mm.yyyy angezeigt wird. Eine für andere Formate geeignete Variante müsste entweder umgeschrieben oder aber wesentlich flexibler gestaltet werden, was den Rahmen dieses Beitrags sprengen würde.
Wir ermitteln also mit der Eigenschaft SelStart die aktuelle Position der Einfügemarke und berechnen dann, welcher Datumsteil sich auf der aktuellen Position befindet. Dazu schneiden wir den Teil links von der Einfügemarke aus und untersuchen, wie viele Punkte sich in diesem Bereich befinden. Dazu subtrahieren wir die Zeichenkettenlänge ohne Punkte von der Zeichenkettenlänge mit Punkten. Ergibt dies den Wert 0, dann befindet sich die Einfügemarke auf dem Tag, bei 1 auf dem Monat und bei 2 auf dem Jahr.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo