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!