Effizientere Dateneingabe in einem Access-Formular

Aufgrund gesundheitlicher Probleme habe ich mir eine Access-Datenbank gebaut, in die ich regelmäßig verschiedene Daten eingebe. Die grundsätzliche Idee war dabei, die Eingabe von bestimmten Wertetypen effizienter zu gestalten. Hierbei geht es zunächst um Datum und Blutdruck. Doch so einfach diese verschiedenen Werte auch aussehen, die Eingabe lässt sich mit wenig Aufwand noch ein wenig effizienter gestalten.

Das Standardverhalten in Excel

Die Idee zu dem in diesem Artikel beschriebenen Verfahren kam mir im Verlauf eines Excel-Grundkurses. In Excel kann man (wie vielleicht bekannt) ein Datum in einer eleganteren Weise als mit den in Deutschland üblichen Punkten eingeben und trotzdem gültige Datumswerte erhalten. So ist es zum Beispiel möglich, statt dem kompletten Datum wie z.B. “5.11.23” einfach nur Tag und Monat (“5.11”) ohne den abschließenden Punkt einzugeben, wobei die aktuelle Jahreszahl automatisch ergänzt wird. Dummerweise wird bei Hinzufügung des Punktes nach dem Monat (“5.11.”) statt dem Datum einfach nur genau dieser Text in der Zelle eingefügt.

Gleichzeitig kann man aber auch die Trennzeichen “Schrägstrich” und “Minus” verwenden, um Tag und Monat zu trennen: “5/11” führt genauso wie “5-11” zu der Datumseingabe “5. November 2023”, allerdings zunächst mit dem Format “05. Nov”, was man aber vorher oder nachher leicht ändern kann. Durch die Verwendung dieser beiden Zeichen lässt sich ein Datum sehr elegant auf dem Nummernblock eingeben, da hier alles auf kurzem Weg erreichbar ist (für den Punkt müsste man in den Bereich der Buchstaben gehen).

Das brachte mich auf die Idee, das auch in einem Access-Formular zu versuchen.

Das Standardverhalten in Access

Wenn ich in einem Access-Formular ein gebundenes Textfeld einfüge, das mit einem Tabellenfeld vom Typ “Datum” verknüpft ist, dann kann ich leicht feststellen, dass das für Excel beschriebene Verfahren “Tag <Schrägstrich> Monat” oder “Tag <Minus> Monat” auch hier funktioniert. Das ist schon mal sehr gut.

Aber da geht noch mehr, oder? Sicher, denn schließlich gibt es ja VBA :-)

Meine Ergänzungen

Bei der Eingabe von Datum, Zeit und Blutdruck gibt es einige Besonderheiten, die wir uns zunutze machen können. Das wichtigste ist: Wer sich an die üblichen Regeln für die Eingabe hält, macht dabei nichts falsch. Aber es kann besser gehen.

Datum

Dass die Datumseingabe in Access durch “Tag <Minus> Monat” bereits recht elegant möglich ist, habe ich oben schon erwähnt.

Die konkrete Eingabe meiner Datumswerte liegt fast immer um den Tag herum, an dem ich die Eingabe durchführe. Aus diesem Grund habe ich in dem Textfeld den Standardwert =Datum()-1 vorgegeben, wodurch bei einem neuen Datensatz immer das Datum von “gestern” bereits eingetragen ist. Faul wie ich bin, habe ich mir jedoch noch folgendes gedacht: Wieso sollte man nicht eine Methode (er)finden, die den Sprung von Tag zu Tag einfach macht? Und so bin ich auf die folgenden zusätzlichen Tasten gekommen, deren Funktion ich einfach mal etwas umdefiniert habe.

Tastenormale FunktionMeine Funktion
Nächstes Feld1 Tag hinzuzählen
Vorheriges Feld1 Tag abziehen
PgUpVorheriger Datensatz1 Woche hinzuzählen
PgDnNächster Datensatz1 Woche abziehen

Das Standardverhalten dieser vier Tastencodes brauche ich nicht wirklich. Zum nächsten Feld gelange ich mit der TAB-Taste, zum vorherigen mit ⇧+TAB. Und die beiden Tasten Bild hoch/runter nutze ich in dieser Eingabeweise nicht. Wer diese jedoch braucht, kann z.B. auch die Shift-Taste bei den Tasten Cursor hoch/runter mit auswerten.

Natürlich führe ich die Aktionen in der Subroutine “EingabeoptimierungDatum” aus, damit ich diese leicht in jedes Control einbauen kann.

Die Parameter sind genauso definiert wie die der Ereignisprozedur, werden hier allerdings mit “ByRef” deklariert. Dadurch habe ich die Möglichkeit, in der Subroutine eine Veränderung durchzuführen und die neuen Werte zurückzugeben. Dieses Konzept brauche ich, weil ich den KeyCode nach meiner Auswertung wieder auf 0 setzen muss (andernfalls würde die Standardaktion doch noch erfolgen). Die eigentliche Routine ist nur abhängig von dem aktuellen Control, an das ich mit Screen.ActiveControl herankomme.

Und dann sind es nur noch ein paar Datumsfunktionen:

Public Sub EingabeoptimierungDatum(ByRef KeyCode As Integer, ByRef Shift As Integer)

Dim ctrl As control

'--------------------

Set ctrl = Screen.ActiveControl

If IsDate(ctrl.text) Then
    Select Case KeyCode
        Case 33 ' Page up
            ctrl.text = DateAdd("ww", 1, ctrl.text)
            KeyCode = 0
            
        Case 34 ' Page down
            ctrl.text = DateAdd("ww", -1, ctrl.text)
            KeyCode = 0
        
        Case 38 ' Cursor up
            ctrl.text = DateAdd("d", 1, ctrl.text)
            KeyCode = 0
        
        Case 40 ' Cursor down
            ctrl.text = DateAdd("d", -1, ctrl.text)
            KeyCode = 0
    End Select
End If

Set ctrl = Nothing

End Sub

Diese Subroutine rufe ich in dem Ereignis “KeyDown” des jeweiligen Controls auf und übergebe die beiden dort erhaltenen Parameter:

Private Sub Datum_KeyDown(KeyCode As Integer, Shift As Integer)

EingabeoptimierungDatum KeyCode, Shift

End Sub

Blutdruck

Bei der Eingabe der Blutdruckwerte muss man sich zunächst vor Augen halten, dass es jeweils zwei Werte sind, die man “systolisch” und “diastolisch” nennt. Die übliche Schreibweise dafür ist “120/80”, also mit einem Schrägstrich in der Mitte. Auch diese Eingabeform lässt sich sehr leicht über den Nummernblock vornehmen, gleicht allerdings einer oben beschrieben Form der Datumseingabe.

Gemäß der 1. Normalform sollten diese beiden Teile der Blutdruckmessung in zwei verschiedene Felder eingegeben werden. Dennoch ist die beschriebene Schreibweise so schön, dass ich ungern darauf verzichten möchte. Ich möchte also “120/80” so auftrennen, dass die “120” im ersten Feld bleibt, der Schrägstrich verschwindet und die “80” in das nächste Feld geschrieben wird.

Dazu habe ich mir folgende Subroutine erstellt:

Public Sub EingabeoptimierungBlutdruck(ByRef NextCtrl As control)

Dim CurrentCtrl As control

'--------------------

Set CurrentCtrl = Screen.ActiveControl

If Right(CurrentCtrl.text, 1) = "/" Then
    CurrentCtrl.text = Left(CurrentCtrl.text, Len(CurrentCtrl.text) - 1)
    NextCtrl.SetFocus
End If

Set CurrentCtrl = Nothing

End Sub

Hier übernehme ich “ByRef” ein Control, und zwar das dem aktuellen nachfolgende. Wenn ich eine Möglichkeit finde, das in der Tab-Reihenfolge nächste Control mit VBA zu ermitteln, könnte sogar darauf verzichtet werden.

Der Aufruf erfolgt dann im Ereignis “Change” des ersten Controls. Dadurch wird diese Routine bei jedem eingegebenen Zeichen erneut aufgerufen.

Private Sub RR_syst_vorher_Change()

EingabeoptimierungBlutdruck Me.RR_diast_vorher

End Sub

Das war’s für’s erste. Vielleicht finde ich noch ein paar Möglichkeiten, die Eingabe von Werten effizienter zu gestalten. Demnächst in diesem Theater :-)

Ähnliche Artikel:

2 Kommentare

    • Axel Fritsche auf 5. November 2023 bei 14:37
    • Antworten

    Hallo Christoph, echt jetzt, du gibst deine Messdaten noch manuell in den Computer ein? Spannende Retro-Sache
    Gruß Axel

    1. :-)))

      Nur bei den Dialysevorgängen, da ich leider keine Möglichkeit habe, die Fresenius-Karte auszulesen. Und Withings bietet leider nur ein total umständliches Verfahren an, die eigenen Daten herunterzuladen :-(

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

zwei × 5 =