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:
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
- Omskriv
cmdSave_Clickfra opgaven i forrige kapitel, så der opbygges en fejlstreng, hvor det kontrolleres, at Company Name, Contact og Email alle er udfyldt. - Tilføj en fjerde TextBox, txtReorderLevel, kun til denne øvelse, og valider den med IsNumeric.
- 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.
- Test ved at lade alle felter være tomme og klik på Save — bekræft, at alle forventede fejllinjer vises i én samlet besked.
1. Opbygning af en fejlstreng
- Deklarér én
String-variabel (errors) øverst icmdSave_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 tilerrorsi stedet for straks at vise enMsgBoxeller afslutte Sub'en. vbNewLinei 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 inewRowsenere. - 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.
IsNumerictjekker den rå tekst i.Value— hvis det fejler, tilføjes en linje tilerrorsligesom 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 énMsgBoxmedvbExclamation, ogExit Sub. - Koden med
ListRows.Addkøres kun, hvis denneIf-blok ikke afslutter — det betyder, at den fysisk skal stå efter hele valideringsblokken, ikke inde i enElse.
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.
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
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:
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
- Omskriv
cmdSave_Clickfra opgaven i forrige kapitel, så der opbygges en fejlstreng, hvor det kontrolleres, at Company Name, Contact og Email alle er udfyldt. - Tilføj en fjerde TextBox, txtReorderLevel, kun til denne øvelse, og valider den med IsNumeric.
- 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.
- Test ved at lade alle felter være tomme og klik på Save — bekræft, at alle forventede fejllinjer vises i én samlet besked.
1. Opbygning af en fejlstreng
- Deklarér én
String-variabel (errors) øverst icmdSave_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 tilerrorsi stedet for straks at vise enMsgBoxeller afslutte Sub'en. vbNewLinei 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 inewRowsenere. - 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.
IsNumerictjekker den rå tekst i.Value— hvis det fejler, tilføjes en linje tilerrorsligesom 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 énMsgBoxmedvbExclamation, ogExit Sub. - Koden med
ListRows.Addkøres kun, hvis denneIf-blok ikke afslutter — det betyder, at den fysisk skal stå efter hele valideringsblokken, ikke inde i enElse.
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.
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.
Tak for dine kommentarer!