Programm ändern Schritt 2

Ein VBA-Programm ändern: Plausibilisierung der Postleitzahl

Um dies zu erreichen, müssen wir auf jeden Tastendruck reagieren. Das zugehörige Ereignis heißt KeyPress. Im Code-Editor müssen wir also in der linken Liste das Objekt txtPlz und in der rechten Liste das Ereignis KeyPress auswählen; VBA erzeugt sofort den notwendigen Prozedurkorpus:

Beispiel:

Private Sub txtPlz_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
End Sub

Neu sind hier die Angaben in der Klammer hinter der Ereignisbezeichnung KeyPress:

ByVal KeyAscii As MSForms.ReturnInteger

Interessant ist hier zunächst nur die Variable KeyAscii, die nichts anderes zu tun hat, als der Ereignisprozedur den sog. ASCII-Wert der gerade gedrückten Taste zu übergeben.

Jedes Zeichen auf der Tastatur lässt sich numerisch eindeutig darstellen; man spricht auch von dem ASCII-Code des Zeichens. Es mag etwas verwirrend sein, aber auch die numerischen Werte auf der Tastatur besitzen einen eigenen ASCII-Code. Wird also die Taste 5 gedrückt, übergibt die Variable KeyAscii nicht den Wert 5 sondern den ASCII-Code 53!

Von diesen Codes interessieren uns für unsere Prüfung zunächst nur die Codes für die die Wert 0 bis 9 (= 48 bis 57). Also müssen wir überprüfen, ob entsprechende Tasten gedrückt worden sind.
Dies erfolgt über die sog. Select Case – Anweisung; also ungefähr so:

Beispiel:

' Beispiel-Select
Select Case KeyAscii
           Case 48
           Case 49
           Case 50
           Case 51
           Case 52
           Case 53
           Case 54
           Case 55
           Case 56
           Case 57
End Select

Jetzt können wir jede einzelne numerische Eingabe von 0 bis 9 abfangen; nur hilft uns das eigentlich nicht, denn diese Eingaben sind ja OK. Hier benötigen wir also einen Fall (Case) für „den Rest“. Dies wird als Case Else dargestellt. Außerdem ist es unschön, 10 Zeilen schreiben zu müssen, die alle „nichts bewirken“; aber auch hier gibt es Abhilfe:

Beispiel:

' Beispiel-Select
Select Case KeyAscii
           Case 48 To 57
           Case Else
End Select

Jetzt wissen wir wann eine Zahl zwischen 0 und 9 oder eine andere Taste gedrückt wurde und können entsprechend reagieren. Zum einen können wir bei jeder Falscheingabe eine Nachricht anzeigen, die auf die Falscheingabe hinweist, nur verhindern wir sie dadurch nicht.

Deutlich eleganter ist es, nur Werte zwischen 0 und 9 zu akzeptieren und alle anderen Werte zu verwerfen. Dies erfolgt durch einen Trick: die Variable KeyAscii liefert nicht nur den aktuellen Zeichen-Code, sondern nimmt auch veränderte Werte entgegen und setzt diese um.

Theoretisch könnten wir also jede Falscheingabe durch die Rückgabe in einen anderen Wert verändern, nur macht das hier keinen Sinn. Das Steuerelement soll lediglich Zahlen zwischen 0 und 9 zulassen, alle anderen Zeichen müssen verworfen werden; dies erfolgt durch den ASCII-Code 0!

Die fertige Routine sieht dann so aus:

Beispiel:

Private Sub txtPlz_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    Select Case KeyAscii
           Case 48 To 57 'nichts zu tun
           Case Else     'alles andere verwerfen
                KeyAscii = 0
    End Select
 
End Sub

Es kann also bei diesem Steuerelement niemals zur Falscheingabe kommen!