| home |  
  

   © 2005 by Friedel Schmidt •  E-Mail  •                      Top  

   | impressum | feedback | home |  


Inhaltsverzeichnis

Suchen

Links
  

Benutzereingaben in UserForms prüfen
Versionen: Excel 97, 2000 und 2002

Wie kann man die Gültigkeit von Textfeld-Eingaben in einer UserForm überprüfen? Ich möchte erreichen, dass in ein Textfeld beispielsweise nur Datumswerte eingegeben werden dürfen und in ein anderes nur vierstellige Zahlenangaben - gegebenenfalls mit führenden Nullen.

Da Textfelder in einem benutzerdefinierten VBA-Formular keine automatische Gültigkeitsprüfung besitzen, muss man selbst Programmcode schreiben, der die Benutzereingaben überprüft. Man muss nur entscheiden, wann die Überprüfung stattfinden soll: direkt bei jedem Tastenanschlag oder erst nach vollständiger Werteeingabe. Manchmal ist es auch sinnvoll, beide Ereignisse miteinander zu verknüpfen.

Legen Sie zur Veranschaulichung ein neues Formular an, indem Sie im Visual Basic-Editor Einfügen-UserForm anwählen. Fügen Sie mit Hilfe der Werkzeugsammlung zwei Textfelder ein. Standardmäßig erhalten sie die Namen "TextBox1" und "TextBox2", wovon auch die folgenden Codebeispiele ausgehen.

In "TextBox1" soll die Eingabe auf Datumswerte beschränkt sein. Ob ein gültiges Datum vorliegt, kann man erst prüfen, nachdem ein vollständiger Wert eingegeben wurde. Am besten eignet sich dafür das "Exit"-Ereignis, das automatisch beim Verlassen des Textfeldes ausgeführt wird. Der Vorteil des Exit-Ereignisses liegt darin, dass es über einen "Cancel"-Parameter verfügt, mit dem man den Wechsel zu einem anderen Textfeld unterbinden kann. Die fertige Ereignisprozedur zur Datumsprüfung sieht dann folgendermaßen aus:

Private Sub TextBox1_Exit(ByVal Cancel As _
MSForms.ReturnBoolean)
  With Me.TextBox1
    If Not IsDate(.Text) And Not .Text = "" Then
      .Text = ""
      MsgBox "Bitte ein gültiges Datum eingeben!"
      Cancel = True
    Else
On Error Resume Next
.Text = CDate(.Text)
    End If
  End With
End Sub

Falls der eingegebene Text nicht als Datumswert zu interpretieren ist oder falls das Textfeld nicht leer ist, setzt die Prozedur den Inhalt wieder auf eine leere Zeichenfolge zurück und gibt eine Fehlermeldung aus. Mit der Zeile "Cancel = True" verhindert sie außerdem, dass das Textfeld verlassen werden kann. - Nur bei einer gültigen Eingabe setzt die Prozedur den Feldinhalt ins Excel-typische Datumsformat. Das ist insofern sinnvoll, als auch "12.13.2002" als gültiger Datumswert erkannt wird. Der "Else"-Zweig macht daraus das hierzulande passende Datum "13.12.02".

Im zweiten Textfeld der UserForm sollen immer vierstellige Zahlenangaben stehen. Das bedeutet, dass nicht nur die Eingabe geprüft sondern auch eine Formatierung zugewiesen werden muss.

Die Eingabeprüfung kann in diesem Fall bei jedem Tastenanschlag erfolgen, da nur Ziffern von 0 bis 9 zulässig sind. Dafür verwendet man das "KeyPress"-Ereignis. Die entsprechende Prozedur arbeitet mit einem Parameter, der den Ascii-Code des eingegebenen Zeichens liefert. So kann man mit einer "Select-Case-Anweisung" prüfen, ob es sich um eine Ziffer handelt:

Private Sub TextBox2_KeyPress(ByVal KeyAscii As _
MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 48 To 57
    Case Else
      KeyAscii = 0
  End Select
End Sub

Ziffern entsprechen den Ascii-Codes 48 bis 57. Bei Eingabe eines solchen Zeichens passiert nichts, - das heißt, der Benutzer merkt gar nicht, dass eine Fehlerprüfung stattfindet. Nur wenn zum Beispiel ein Buchstabe eingegeben wird, tritt der "Case Else"-Zweig mit der Anweisung "KeyAscii = 0" in Aktion. Das führt dazu, dass der aktuelle Tastenanschlag rückgängig gemacht wird und das jeweilige Zeichen gar nicht erst im Textfeld erscheint. Auf eine explizite Fehlermeldung per "MsgBox"-Funktion wurde hier verzichtet.

Bleibt noch die Formatierung als vierstellige Zahl mit führenden Nullen. Damit der Benutzer das Resultat schon während der Eingabe sieht, erledigt man diese Aufgabe am besten im "Change"-Ereignis des Textfeldes. Darin kann man gleichzeitig dafür sorgen, dass nicht mehr als vier Zeichen eingegeben werden:

Private Sub TextBox2_Change()
  With Me.TextBox2
    .Text = Format(.Text, "0000")
    If Len(.Text) > 4 Then
      .Text = Left(.Text, 4)
    End If
  End With
End Sub