Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Validering af Brugerinput | Brugerinteraktion
Excel VBA til Forretningsautomatisering

Validering af Brugerinput

Stryg for at vise menuen

Gem-knappen fra det forrige kapitel vil uden problemer skrive et tomt firmanavn eller en ugyldig e-mail ind i Customers-tabellen, fordi intet i cmdSave_Click tjekker dataene først. Validering er det trin, der kører før gemning — fanger problemer, mens de stadig er nemme at rette, i stedet for efter de er blevet dårlige data i et regneark.

Påkrævede felter

Den simpleste kontrol: er denne TextBox stadig tom?

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

Trim er vigtigere her, end det måske ser ud — en bruger, der kun indtaster mellemrum, vil bestå en almindelig = ""-kontrol, da " " teknisk set ikke er en tom streng, men det er lige så ubrugeligt som ægte tomhed. SetFocus flytter den blinkende markør direkte til det problematiske felt, så brugeren ikke skal lede efter, hvilket felt der skal rettes — en lille detalje, der gør en formular mærkbart mere gennemført.

Numerisk validering

IsNumeric kontrollerer, om en værdi kan konverteres til et tal, uden faktisk at forsøge konverteringen og risikere en fejl:

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

Dette er kontrollen, der ville have fanget "twenty" indtastet i et numerisk felt, præcis som vist på skærmbilledet ovenfor. Først når denne kontrol er bestået, er det sikkert at skrive kode som CInt(txtReorderLevel.Value) længere nede i Sub'en — validering først og konvertering bagefter betyder, at konverteringen aldrig uventet kan fejle.

Dato-validering

IsDate er samme idé, anvendt på datoer i stedet for tal:

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

Fejlmeddelelser, der samler alle problemer på én gang De tre kontroller ovenfor bruger alle Exit Sub i det øjeblik, de finder et problem — fint til en kort formular, men frustrerende i en længere, hvor brugeren retter én fejl for straks at støde på den næste. Et mere gennemført mønster opbygger en liste over alle problemer, før der vises én samlet besked:

Valideringseksempel
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

Dette er den samme strengopbygningsteknik som i sidste kapitel med lageradvarselsmakroen — errors starter tom, og hver mislykket kontrol tilføjer endnu en linje i stedet for straks at afslutte. Først efter alle kontroller er kørt, ser Sub'en på, om errors endte tom eller ej, hvilket gør det muligt for brugeren at se alle problemer med deres input på én gang i stedet for én frustrerende omgang pr. fejl.

Opgave

  1. Omskriv cmdSave_Click fra opgaven i forrige kapitel, så der opbygges en fejlstreng, hvor det kontrolleres, at Company Name, Contact og Email alle er udfyldt.
  2. Tilføj en fjerde TextBox, txtReorderLevel, kun til denne øvelse, og valider den med IsNumeric.
  3. Vis én samlet MsgBox, der oplister alle problemer, brug vbExclamation som ikon, og fortsæt kun til selve ListRows.Add-koden, når errors er tom.
  4. Test ved at lade alle felter være tomme og klik på Save — bekræft, at alle forventede fejllinjer vises i én samlet besked.
Tip
expand arrow

1. Opbygning af en fejlstreng

  • Deklarér én String-variabel (errors) øverst i cmdSave_Click, startende som tom.
  • For hvert af de tre felter bruges samme Trim(...) = ""-tjek som i afsnit 5.3 — hvis det er tomt, tilføjes én linje til errors i stedet for straks at vise en MsgBox eller afslutte Sub'en.
  • vbNewLine i slutningen af hver tilføjet linje sikrer, at hvert problem står på sin egen linje i den endelige besked.

2. Tilføjelse af txtReorderLevel

  • Dette er en TextBox kun til øvelse i numerisk validering — den svarer ikke til en rigtig kolonne i tblCustomers, så den skal ikke skrives ind i newRow senere.
  • Tilføj den til formularen i Design-visning (Shift+F7) med en tilsvarende Label, på samme måde som de tre andre TextBoxes blev tilføjet.
  • IsNumeric tjekker den rå tekst i .Value — hvis det fejler, tilføjes en linje til errors ligesom ved tjek af tomme felter.

3. Én samlet MsgBox, derefter fortsættes

  • Alt fra det gennemarbejdede eksempel i afsnit 5.3 gælder direkte her — tjek If errors <> "" Then, vis én MsgBox med vbExclamation, og Exit Sub.
  • Koden med ListRows.Add køres kun, hvis denne If-blok ikke afslutter — det betyder, at den fysisk skal stå efter hele valideringsblokken, ikke inde i en Else.

4. Test med alt tomt

  • Klik Save uden at indtaste noget.
  • Du bør se præcis én MsgBox, der oplister alle fire problemer (Company Name, Contact, Email, Reorder Level) i stedet for at stoppe efter det første — denne samlede besked er selve pointen med øvelsen, sammenlignet med den tidligere version, der afsluttede efter første fejl.
Løsning
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

Kør formularen, lad alle felter være tomme, og klik på Save — du bør se én MsgBox med et advarselsikon, der oplister alle fire manglende/ugyldige felter på én gang, og ingen række tilføjes til tblCustomers, før alt er udfyldt korrekt.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Validering af Brugerinput

Gem-knappen fra det forrige kapitel vil uden problemer skrive et tomt firmanavn eller en ugyldig e-mail ind i Customers-tabellen, fordi intet i cmdSave_Click tjekker dataene først. Validering er det trin, der kører før gemning — fanger problemer, mens de stadig er nemme at rette, i stedet for efter de er blevet dårlige data i et regneark.

Påkrævede felter

Den simpleste kontrol: er denne TextBox stadig tom?

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

Trim er vigtigere her, end det måske ser ud — en bruger, der kun indtaster mellemrum, vil bestå en almindelig = ""-kontrol, da " " teknisk set ikke er en tom streng, men det er lige så ubrugeligt som ægte tomhed. SetFocus flytter den blinkende markør direkte til det problematiske felt, så brugeren ikke skal lede efter, hvilket felt der skal rettes — en lille detalje, der gør en formular mærkbart mere gennemført.

Numerisk validering

IsNumeric kontrollerer, om en værdi kan konverteres til et tal, uden faktisk at forsøge konverteringen og risikere en fejl:

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

Dette er kontrollen, der ville have fanget "twenty" indtastet i et numerisk felt, præcis som vist på skærmbilledet ovenfor. Først når denne kontrol er bestået, er det sikkert at skrive kode som CInt(txtReorderLevel.Value) længere nede i Sub'en — validering først og konvertering bagefter betyder, at konverteringen aldrig uventet kan fejle.

Dato-validering

IsDate er samme idé, anvendt på datoer i stedet for tal:

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

Fejlmeddelelser, der samler alle problemer på én gang De tre kontroller ovenfor bruger alle Exit Sub i det øjeblik, de finder et problem — fint til en kort formular, men frustrerende i en længere, hvor brugeren retter én fejl for straks at støde på den næste. Et mere gennemført mønster opbygger en liste over alle problemer, før der vises én samlet besked:

Valideringseksempel
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

Dette er den samme strengopbygningsteknik som i sidste kapitel med lageradvarselsmakroen — errors starter tom, og hver mislykket kontrol tilføjer endnu en linje i stedet for straks at afslutte. Først efter alle kontroller er kørt, ser Sub'en på, om errors endte tom eller ej, hvilket gør det muligt for brugeren at se alle problemer med deres input på én gang i stedet for én frustrerende omgang pr. fejl.

Opgave

  1. Omskriv cmdSave_Click fra opgaven i forrige kapitel, så der opbygges en fejlstreng, hvor det kontrolleres, at Company Name, Contact og Email alle er udfyldt.
  2. Tilføj en fjerde TextBox, txtReorderLevel, kun til denne øvelse, og valider den med IsNumeric.
  3. Vis én samlet MsgBox, der oplister alle problemer, brug vbExclamation som ikon, og fortsæt kun til selve ListRows.Add-koden, når errors er tom.
  4. Test ved at lade alle felter være tomme og klik på Save — bekræft, at alle forventede fejllinjer vises i én samlet besked.
Tip
expand arrow

1. Opbygning af en fejlstreng

  • Deklarér én String-variabel (errors) øverst i cmdSave_Click, startende som tom.
  • For hvert af de tre felter bruges samme Trim(...) = ""-tjek som i afsnit 5.3 — hvis det er tomt, tilføjes én linje til errors i stedet for straks at vise en MsgBox eller afslutte Sub'en.
  • vbNewLine i slutningen af hver tilføjet linje sikrer, at hvert problem står på sin egen linje i den endelige besked.

2. Tilføjelse af txtReorderLevel

  • Dette er en TextBox kun til øvelse i numerisk validering — den svarer ikke til en rigtig kolonne i tblCustomers, så den skal ikke skrives ind i newRow senere.
  • Tilføj den til formularen i Design-visning (Shift+F7) med en tilsvarende Label, på samme måde som de tre andre TextBoxes blev tilføjet.
  • IsNumeric tjekker den rå tekst i .Value — hvis det fejler, tilføjes en linje til errors ligesom ved tjek af tomme felter.

3. Én samlet MsgBox, derefter fortsættes

  • Alt fra det gennemarbejdede eksempel i afsnit 5.3 gælder direkte her — tjek If errors <> "" Then, vis én MsgBox med vbExclamation, og Exit Sub.
  • Koden med ListRows.Add køres kun, hvis denne If-blok ikke afslutter — det betyder, at den fysisk skal stå efter hele valideringsblokken, ikke inde i en Else.

4. Test med alt tomt

  • Klik Save uden at indtaste noget.
  • Du bør se præcis én MsgBox, der oplister alle fire problemer (Company Name, Contact, Email, Reorder Level) i stedet for at stoppe efter det første — denne samlede besked er selve pointen med øvelsen, sammenlignet med den tidligere version, der afsluttede efter første fejl.
Løsning
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

Kør formularen, lad alle felter være tomme, og klik på Save — du bør se én MsgBox med et advarselsikon, der oplister alle fire manglende/ugyldige felter på én gang, og ingen række tilføjes til tblCustomers, før alt er udfyldt korrekt.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 3
some-alt