Überprüfung von Benutzereingaben
Swipe um das Menü anzuzeigen
Die Speichern-Schaltfläche aus dem vorherigen Kapitel schreibt problemlos einen leeren Firmennamen oder eine fehlerhafte E-Mail-Adresse in die Customers-Tabelle, da in cmdSave_Click die Daten vorher nicht überprüft werden. Validierung ist der Schritt, der vor dem Speichern ausgeführt wird – Probleme werden erkannt, solange sie noch leicht zu beheben sind, anstatt später als fehlerhafte Daten im Arbeitsblatt zu landen.
Pflichtfelder
Die einfachste Überprüfung: Ist dieses Textfeld noch leer?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim ist hier wichtiger, als es zunächst scheint – ein Benutzer, der nur ein paar Leerzeichen eingibt, würde eine einfache = ""-Prüfung bestehen, da " " technisch gesehen kein leerer String ist, aber genauso unbrauchbar wie echte Leere. SetFocus verschiebt den blinkenden Cursor direkt in das betreffende Steuerelement, sodass der Benutzer nicht suchen muss, welches Feld korrigiert werden muss – ein kleines Detail, das ein Formular deutlich ausgereifter wirken lässt.
Numerische Validierung
IsNumeric prüft, ob ein Wert in eine Zahl umgewandelt werden könnte, ohne die Umwandlung tatsächlich zu versuchen und einen Fehler zu riskieren:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Dies ist die Überprüfung, die "twenty" in einem numerischen Feld erkannt hätte, wie im obigen Screenshot gezeigt. Erst nachdem diese Prüfung bestanden ist, ist es sicher, weiter unten im Sub Code wie CInt(txtReorderLevel.Value) zu schreiben – erst validieren, dann konvertieren bedeutet, dass die Umwandlung nie unerwartet fehlschlagen kann.
Datumsvalidierung
IsDate funktioniert nach dem gleichen Prinzip, angewendet auf Datumswerte anstelle von Zahlen:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Fehlermeldungen, die alle Probleme auf einmal sammeln
Die drei oben genannten Prüfungen führen jeweils sofort ein Exit Sub aus, sobald ein Problem gefunden wird – das ist bei einem kurzen Formular in Ordnung, aber bei einem längeren Formular frustrierend, wenn der Benutzer einen Fehler behebt und sofort auf den nächsten stößt. Ein ausgereifteres Muster sammelt alle Probleme in einer Liste, bevor eine einzige kombinierte Meldung angezeigt wird:
Private Sub cmdSave_Click()
Dim errors As String
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, _
vbExclamation
Exit Sub
End If
' ... all checks passed, safe to save now
End Sub
Dies ist die gleiche String-Verkettungstechnik wie im Lagerbestandswarnungs-Makro des letzten Kapitels – errors startet leer, und jede fehlgeschlagene Prüfung fügt eine weitere Zeile hinzu, anstatt sofort zu beenden. Erst nachdem alle Prüfungen durchlaufen wurden, prüft das Sub, ob errors leer geblieben ist oder nicht. So kann der Benutzer alle Probleme mit seiner Eingabe auf einmal sehen, anstatt bei jedem Fehler eine neue Runde zu drehen.
Aufgabe
- Überarbeitung von
cmdSave_Clickaus der vorherigen Kapitelaufgabe, um einen Fehler-String zu erstellen, der prüft, ob Firmenname, Kontakt und E-Mail nicht leer sind. - Hinzufügen eines vierten Textfelds, txtReorderLevel, ausschließlich für diese Übung, und Validierung mit IsNumeric.
- Anzeige einer kombinierten MsgBox, die alle Probleme auflistet, mit vbExclamation als Symbol, und erst dann zum eigentlichen ListRows.Add-Code übergehen, wenn der Fehler-String leer ist.
- Testen, indem alle Felder leer gelassen und auf Speichern geklickt wird — bestätigen, dass alle erwarteten Fehlermeldungen in einer einzigen Nachricht erscheinen.
1. Aufbau eines Fehler-Strings
- Deklaration einer
String-Variablen (errors) am Anfang voncmdSave_Click, die leer startet. - Für jedes der drei Felder wird die gleiche
Trim(...) = ""-Prüfung aus Abschnitt 5.3 verwendet — wenn das Feld leer ist, wird eine Zeile anerrorsangehängt, anstatt sofort eineMsgBoxanzuzeigen oder das Sub zu verlassen. vbNewLineam Ende jeder angehängten Zeile sorgt dafür, dass jedes Problem in der endgültigen Nachricht in einer eigenen Zeile steht.
2. Hinzufügen von txtReorderLevel
- Dies ist ein Textfeld ausschließlich zum Üben der numerischen Validierung — es entspricht keiner echten Spalte in
tblCustomers, daher sollte es später nicht innewRowgeschrieben werden. - Fügen Sie es im Entwurfsmodus (Shift+F7) mit einem passenden Label hinzu, genauso wie die anderen drei Textfelder.
IsNumericprüft den Rohtext in.Value— wenn die Prüfung fehlschlägt, wird eine Zeile zuerrorshinzugefügt, genau wie bei den Leerfeld-Prüfungen.
3. Eine kombinierte MsgBox, dann Fortfahren
- Alles aus dem Beispiel in Abschnitt 5.3 gilt direkt hier — prüfen Sie
If errors <> "" Then, zeigen Sie eineMsgBoxmitvbExclamationan und führen SieExit Subaus. - Der
ListRows.Add-Code wird nur ausgeführt, wenn dieserIf-Block nicht verlassen wurde — das bedeutet, er muss physisch nach dem gesamten Validierungsblock stehen, nicht innerhalb einesElse.
4. Testen mit allen Feldern leer
- Klicken Sie auf Speichern, ohne etwas einzugeben.
- Es sollte genau eine
MsgBoxerscheinen, die alle vier Probleme (Firmenname, Kontakt, E-Mail, Mindestbestand) auflistet, anstatt nach dem ersten Fehler zu stoppen — diese kombinierte Nachricht ist der eigentliche Zweck dieser Übung, im Vergleich zur früheren Version, die nach der ersten fehlgeschlagenen Prüfung abgebrochen hat.
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Dim errors As String
' --- Validation ---
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Trim(txtContact.Value) = "" Then
errors = errors & "- Contact is required" & vbNewLine
End If
If Trim(txtEmail.Value) = "" Then
errors = errors & "- Email is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, vbExclamation
Exit Sub
End If
' --- All checks passed — safe to save now ---
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Führen Sie das Formular aus, lassen Sie alle Felder leer und klicken Sie auf Speichern — es sollte eine MsgBox mit einem Warnsymbol erscheinen, die alle vier fehlenden/ungültigen Felder gleichzeitig auflistet, und es wird keine Zeile zu tblCustomers hinzugefügt, bis alle Felder korrekt ausgefüllt sind.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen