Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Überprüfung von Benutzereingaben | Benutzerinteraktion
Excel VBA für Geschäftsautomatisierung

Ü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:

Validierungsbeispiel
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

  1. Überarbeitung von cmdSave_Click aus der vorherigen Kapitelaufgabe, um einen Fehler-String zu erstellen, der prüft, ob Firmenname, Kontakt und E-Mail nicht leer sind.
  2. Hinzufügen eines vierten Textfelds, txtReorderLevel, ausschließlich für diese Übung, und Validierung mit IsNumeric.
  3. 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.
  4. Testen, indem alle Felder leer gelassen und auf Speichern geklickt wird — bestätigen, dass alle erwarteten Fehlermeldungen in einer einzigen Nachricht erscheinen.
Hinweis
expand arrow

1. Aufbau eines Fehler-Strings

  • Deklaration einer String-Variablen (errors) am Anfang von cmdSave_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 an errors angehängt, anstatt sofort eine MsgBox anzuzeigen oder das Sub zu verlassen.
  • vbNewLine am 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 in newRow geschrieben werden.
  • Fügen Sie es im Entwurfsmodus (Shift+F7) mit einem passenden Label hinzu, genauso wie die anderen drei Textfelder.
  • IsNumeric prüft den Rohtext in .Value — wenn die Prüfung fehlschlägt, wird eine Zeile zu errors hinzugefü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 eine MsgBox mit vbExclamation an und führen Sie Exit Sub aus.
  • Der ListRows.Add-Code wird nur ausgeführt, wenn dieser If-Block nicht verlassen wurde — das bedeutet, er muss physisch nach dem gesamten Validierungsblock stehen, nicht innerhalb eines Else.

4. Testen mit allen Feldern leer

  • Klicken Sie auf Speichern, ohne etwas einzugeben.
  • Es sollte genau eine MsgBox erscheinen, 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.
Lösung
expand arrow
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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 3

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 5. Kapitel 3
some-alt