Das Keypress-Ereignis zur Optimierung von Formularen

Fehler automatisch korrigieren

Sie können aber auch einen Schritt weiter gehen und Fehleingaben korrigieren, indem Sie ein falsches Zeichen durch ein richtiges ersetzen. Welche Zeichen durch was zu ersetzen sind, definieren Sie dabei wieder als Liste in der Marker- Eigenschaft. Geben Sie in der Liste erst das falsche Zeichen und dann das oder die zu ersetzenden Zeichen an. Mit der Angabe ä,ae,ü,ue würden die Umlaute „ä“ und „ü“ durch „ae“und, „ue“ ersetzt.

Bild 2: Bei einer Fehleingabe wird das Zeichen nicht angefügt, stattdessen wird die Fehlermeldung eingeblendet.
Bild 2: Bei einer Fehleingabe wird das Zeichen nicht angefügt, stattdessen wird die Fehlermeldung eingeblendet.

Sie benötigen auch noch eine Funktion, die die Ersetzung vornimmt und das neue Zeichen zurückgibt. Das übernimmt die Funktion ersetzen (Listing 2). Sie durchläuft ebenfalls das Array nach dem gesuchten Zeichen und gibt dann den Wert im Array zurück, der danach folgt. Damit dabei nicht versehentlich die Eingabe von „ae“ durch „ü“, den nächsten Umlaut in der Liste, ersetzt wird, werden nur die Werte des Arrays mit der Eingabe verglichen, die aus einem Zeichen bestehen. Das ist auch deshalb notwendig, weil Sie natürlich nur von einem einzelnen Zeichen den ASCII-Code ermitteln können. Der Rückgabewert ist eine leere Zeichenfolge, wenn ein gültiges, nicht zu ersetzendes Zeichen eingegeben wurde.

Dim boolErsetzen As Boolean
Dim strEingabe As String
Dim lngPos As Long
Private Sub txtErsetzen_Change()
If boolErsetzen = True Then
Me.txtErsetzen.Text = strEingabe
'Cursor am Ende positionieren
Me.txtErsetzen.SelStart = lngPos
End If
End Sub
Private Sub txtErsetzen_KeyPress(KeyAscii As Integer)
lngPos = Me.txtErsetzen.SelStart + 2
strEingabe = Me.txtErsetzen.Text & ersetzen(Me.txtErsetzen.Tag, KeyAscii)
End Sub
Function ersetzen(strDaten As String, intZeichen As Integer) As String
Dim arrZeichen As Variant
Dim varZchn As Variant
Dim intI As Integer
boolErsetzen = False
arrZeichen = Split(strDaten, ",")
intI = 0
For Each varZchn In arrZeichen
If Len(varZchn) = 1 Then
If Asc(varZchn) = intZeichen Then
boolErsetzen = True
ersetzen = arrZeichen(intI + 1)
Exit Function
End If
End If
intI = intI + 1
Next varZchn
End Function

In der Ereignisprozedur für das KeyPress- Ereignis weisen Sie zunächst wieder der Variablen lngPos die aktuelle Cursorposition zu. Anschließend weisen Sie der Variablen strEingabe den aktuellen Wert des Eingabefeldes mit dem Rückgabewert der Funktion ersetzen zu. In der Change-Ereignisprozedur wird dann wieder geprüft, ob die Variable boolErsetzen den Wert True hat. Falls ja, wird dem Steuerelement der Text in der Variablen strEingabe zugewiesen.

Zusammenfassung

Die Nutzung des KeyPress-Ereignisses lässt eine Menge nützlicher Anwendungsmöglichkeit zu. Übertreiben Sie es aber nicht. Je komplexer der Code, desto verzögerter erfolgt die Anzeige der Eingaben. Das kann für den Benutzer auch lästig werden, wenn er sehr schnell tippt.