Flexible Datumstextfelder

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).

pic001.png

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

Schreibe einen Kommentar