Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Gebruikersinvoer Valideren | Gebruikersinteractie
Excel VBA voor Bedrijfsautomatisering

Gebruikersinvoer Valideren

Veeg om het menu te tonen

De Opslaan-knop uit het vorige hoofdstuk schrijft zonder problemen een leeg Bedrijfsnaam-veld of een ongeldige e-mail in de Customers-tabel, omdat er in cmdSave_Click niets wordt gecontroleerd voordat de gegevens worden opgeslagen. Validatie is de stap die vóór het opslaan wordt uitgevoerd — problemen worden zo opgevangen terwijl ze nog eenvoudig te herstellen zijn, in plaats van dat ze als foutieve gegevens in een werkblad terechtkomen.

Verplichte velden

De eenvoudigste controle: is dit TextBox-veld nog leeg?

If Trim(txtCompanyName.Value) = "" Then
    MsgBox "Company Name is required."
    txtCompanyName.SetFocus
    Exit Sub
End If

Trim is hier belangrijker dan het lijkt — een gebruiker die alleen spaties typt, zou een gewone = ""-controle passeren, omdat " " technisch gezien geen lege string is, maar het is net zo onbruikbaar als echte leegte. SetFocus plaatst de knipperende cursor direct in het betreffende veld, zodat de gebruiker niet hoeft te zoeken welk veld gecorrigeerd moet worden — een kleine verbetering die een formulier merkbaar professioneler laat aanvoelen.

Numerieke validatie

IsNumeric controleert of een waarde kan worden omgezet naar een getal, zonder daadwerkelijk de conversie te proberen en zo een fout te riskeren:

If Not IsNumeric(txtReorderLevel.Value) Then
    MsgBox "Reorder Level must be a number."
    txtReorderLevel.SetFocus
    Exit Sub
End If

Dit is de controle die "twintig" in een numeriek veld zou hebben opgevangen, precies zoals te zien is in de bovenstaande schermafbeelding. Pas nadat deze controle is geslaagd, is het veilig om code zoals CInt(txtReorderLevel.Value) verderop in de Sub te schrijven — eerst valideren en daarna converteren betekent dat de conversie nooit onverwacht kan mislukken.

Datumvalidatie

IsDate werkt op dezelfde manier, maar dan voor datums in plaats van getallen:

If Not IsDate(txtOrderDate.Value) Then
    MsgBox "Order Date must be a valid date."
    txtOrderDate.SetFocus
    Exit Sub
End If

Foutmeldingen die alle problemen tegelijk verzamelen De drie bovenstaande controles voeren direct een Exit Sub uit zodra er een probleem wordt gevonden — prima voor een kort formulier, maar frustrerend bij een langer formulier, waarbij een gebruiker telkens één fout herstelt om direct de volgende tegen te komen. Een meer verfijnd patroon bouwt een lijst op van alle problemen voordat er één gecombineerde melding wordt getoond:

Validatievoorbeeld
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

Dit is dezelfde string-opbouwtechniek als in de voorraadwaarschuwing-macro uit het vorige hoofdstuk — errors begint leeg, en elke mislukte controle voegt één regel toe in plaats van direct te stoppen. Pas nadat alle controles zijn uitgevoerd, kijkt de Sub of errors leeg is of niet, waardoor de gebruiker in één keer alle problemen met de invoer ziet in plaats van bij elke fout een nieuwe ronde te moeten doorlopen.

Taak

  1. Herschrijf cmdSave_Click uit de opdracht van het vorige hoofdstuk om een foutmelding-string op te bouwen, waarbij gecontroleerd wordt dat Bedrijfsnaam, Contactpersoon en E-mail allemaal niet leeg zijn.
  2. Voeg een vierde TextBox toe, txtReorderLevel, uitsluitend voor deze oefening, en valideer deze met IsNumeric.
  3. Toon één gecombineerde MsgBox waarin alle problemen worden opgesomd, gebruikmakend van vbExclamation als pictogram, en ga pas verder met de ListRows.Add-code als de errors-string leeg is.
  4. Test dit door elk veld leeg te laten en op Opslaan te klikken — controleer of alle verwachte foutregels in één bericht verschijnen.
Hint
expand arrow

1. Opbouwen van een foutmelding-string

  • Declareer één String-variabele (errors) bovenaan in cmdSave_Click, beginnend als leeg.
  • Gebruik voor elk van de drie velden dezelfde Trim(...) = ""-controle als in sectie 5.3 — als het veld leeg is, voeg dan één regel toe aan errors in plaats van direct een MsgBox te tonen of de Sub te verlaten.
  • vbNewLine aan het einde van elke toegevoegde regel zorgt ervoor dat elk probleem op een eigen regel in het uiteindelijke bericht staat.

2. Toevoegen van txtReorderLevel

  • Dit is een TextBox uitsluitend om te oefenen met numerieke validatie — het komt niet overeen met een echte kolom in tblCustomers, dus probeer het later niet in newRow te schrijven.
  • Voeg het toe aan het formulier in de Ontwerpweergave (Shift+F7) met een bijpassend label, op dezelfde manier als de andere drie TextBoxes.
  • IsNumeric controleert de ruwe tekst in .Value — als deze faalt, voeg dan een regel toe aan errors, net als bij de controles op lege velden.

3. Eén gecombineerde MsgBox, daarna doorgaan

  • Alles uit het uitgewerkte voorbeeld van sectie 5.3 is hier direct van toepassing — controleer If errors <> "" Then, toon één MsgBox met vbExclamation en Exit Sub.
  • De ListRows.Add-code wordt alleen uitgevoerd als dat If-blok niet is verlaten — dit betekent dat deze fysiek na het hele validatieblok moet staan, niet binnen een Else.

4. Testen met alles leeg

  • Klik op Opslaan zonder iets in te vullen.
  • Je zou precies één MsgBox moeten zien, waarin alle vier de problemen (Bedrijfsnaam, Contactpersoon, E-mail, Reorder Level) worden opgesomd, in plaats van te stoppen na het eerste probleem — dat ene gecombineerde bericht is het eigenlijke doel van deze oefening, vergeleken met de eerdere versie die stopte na de eerste mislukte controle.
Oplossing
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

Voer het formulier uit, laat elk veld leeg en klik op Opslaan — je zou één MsgBox moeten zien met een waarschuwingspictogram waarin alle vier de ontbrekende/ongeldige velden tegelijk worden opgesomd, en er wordt pas een rij aan tblCustomers toegevoegd als je alles correct invult.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 3

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Gebruikersinvoer Valideren

De Opslaan-knop uit het vorige hoofdstuk schrijft zonder problemen een leeg Bedrijfsnaam-veld of een ongeldige e-mail in de Customers-tabel, omdat er in cmdSave_Click niets wordt gecontroleerd voordat de gegevens worden opgeslagen. Validatie is de stap die vóór het opslaan wordt uitgevoerd — problemen worden zo opgevangen terwijl ze nog eenvoudig te herstellen zijn, in plaats van dat ze als foutieve gegevens in een werkblad terechtkomen.

Verplichte velden

De eenvoudigste controle: is dit TextBox-veld nog leeg?

If Trim(txtCompanyName.Value) = "" Then
    MsgBox "Company Name is required."
    txtCompanyName.SetFocus
    Exit Sub
End If

Trim is hier belangrijker dan het lijkt — een gebruiker die alleen spaties typt, zou een gewone = ""-controle passeren, omdat " " technisch gezien geen lege string is, maar het is net zo onbruikbaar als echte leegte. SetFocus plaatst de knipperende cursor direct in het betreffende veld, zodat de gebruiker niet hoeft te zoeken welk veld gecorrigeerd moet worden — een kleine verbetering die een formulier merkbaar professioneler laat aanvoelen.

Numerieke validatie

IsNumeric controleert of een waarde kan worden omgezet naar een getal, zonder daadwerkelijk de conversie te proberen en zo een fout te riskeren:

If Not IsNumeric(txtReorderLevel.Value) Then
    MsgBox "Reorder Level must be a number."
    txtReorderLevel.SetFocus
    Exit Sub
End If

Dit is de controle die "twintig" in een numeriek veld zou hebben opgevangen, precies zoals te zien is in de bovenstaande schermafbeelding. Pas nadat deze controle is geslaagd, is het veilig om code zoals CInt(txtReorderLevel.Value) verderop in de Sub te schrijven — eerst valideren en daarna converteren betekent dat de conversie nooit onverwacht kan mislukken.

Datumvalidatie

IsDate werkt op dezelfde manier, maar dan voor datums in plaats van getallen:

If Not IsDate(txtOrderDate.Value) Then
    MsgBox "Order Date must be a valid date."
    txtOrderDate.SetFocus
    Exit Sub
End If

Foutmeldingen die alle problemen tegelijk verzamelen De drie bovenstaande controles voeren direct een Exit Sub uit zodra er een probleem wordt gevonden — prima voor een kort formulier, maar frustrerend bij een langer formulier, waarbij een gebruiker telkens één fout herstelt om direct de volgende tegen te komen. Een meer verfijnd patroon bouwt een lijst op van alle problemen voordat er één gecombineerde melding wordt getoond:

Validatievoorbeeld
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

Dit is dezelfde string-opbouwtechniek als in de voorraadwaarschuwing-macro uit het vorige hoofdstuk — errors begint leeg, en elke mislukte controle voegt één regel toe in plaats van direct te stoppen. Pas nadat alle controles zijn uitgevoerd, kijkt de Sub of errors leeg is of niet, waardoor de gebruiker in één keer alle problemen met de invoer ziet in plaats van bij elke fout een nieuwe ronde te moeten doorlopen.

Taak

  1. Herschrijf cmdSave_Click uit de opdracht van het vorige hoofdstuk om een foutmelding-string op te bouwen, waarbij gecontroleerd wordt dat Bedrijfsnaam, Contactpersoon en E-mail allemaal niet leeg zijn.
  2. Voeg een vierde TextBox toe, txtReorderLevel, uitsluitend voor deze oefening, en valideer deze met IsNumeric.
  3. Toon één gecombineerde MsgBox waarin alle problemen worden opgesomd, gebruikmakend van vbExclamation als pictogram, en ga pas verder met de ListRows.Add-code als de errors-string leeg is.
  4. Test dit door elk veld leeg te laten en op Opslaan te klikken — controleer of alle verwachte foutregels in één bericht verschijnen.
Hint
expand arrow

1. Opbouwen van een foutmelding-string

  • Declareer één String-variabele (errors) bovenaan in cmdSave_Click, beginnend als leeg.
  • Gebruik voor elk van de drie velden dezelfde Trim(...) = ""-controle als in sectie 5.3 — als het veld leeg is, voeg dan één regel toe aan errors in plaats van direct een MsgBox te tonen of de Sub te verlaten.
  • vbNewLine aan het einde van elke toegevoegde regel zorgt ervoor dat elk probleem op een eigen regel in het uiteindelijke bericht staat.

2. Toevoegen van txtReorderLevel

  • Dit is een TextBox uitsluitend om te oefenen met numerieke validatie — het komt niet overeen met een echte kolom in tblCustomers, dus probeer het later niet in newRow te schrijven.
  • Voeg het toe aan het formulier in de Ontwerpweergave (Shift+F7) met een bijpassend label, op dezelfde manier als de andere drie TextBoxes.
  • IsNumeric controleert de ruwe tekst in .Value — als deze faalt, voeg dan een regel toe aan errors, net als bij de controles op lege velden.

3. Eén gecombineerde MsgBox, daarna doorgaan

  • Alles uit het uitgewerkte voorbeeld van sectie 5.3 is hier direct van toepassing — controleer If errors <> "" Then, toon één MsgBox met vbExclamation en Exit Sub.
  • De ListRows.Add-code wordt alleen uitgevoerd als dat If-blok niet is verlaten — dit betekent dat deze fysiek na het hele validatieblok moet staan, niet binnen een Else.

4. Testen met alles leeg

  • Klik op Opslaan zonder iets in te vullen.
  • Je zou precies één MsgBox moeten zien, waarin alle vier de problemen (Bedrijfsnaam, Contactpersoon, E-mail, Reorder Level) worden opgesomd, in plaats van te stoppen na het eerste probleem — dat ene gecombineerde bericht is het eigenlijke doel van deze oefening, vergeleken met de eerdere versie die stopte na de eerste mislukte controle.
Oplossing
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

Voer het formulier uit, laat elk veld leeg en klik op Opslaan — je zou één MsgBox moeten zien met een waarschuwingspictogram waarin alle vier de ontbrekende/ongeldige velden tegelijk worden opgesomd, en er wordt pas een rij aan tblCustomers toegevoegd als je alles correct invult.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 3
some-alt