Validering av brukerinput
Sveip for å vise menyen
Lagre-knappen fra forrige kapittel vil uten videre skrive et tomt firmanavn eller en ugyldig e-postadresse inn i Customers-tabellen, fordi ingenting i cmdSave_Click sjekker dataene først. Validering er steget som kjøres før lagring — fanger opp problemer mens de fortsatt er enkle å rette, i stedet for etter at de har blitt dårlige data i et regneark.
Obligatoriske felt
Den enkleste sjekken: er denne TextBox-en fortsatt tom?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim er viktigere her enn det kanskje virker — en bruker som skriver inn noen mellomrom og ingenting annet, ville passert en vanlig = ""-sjekk, siden " " teknisk sett ikke er en tom streng, men det er like ubrukelig som ekte tomhet. SetFocus flytter den blinkende markøren direkte til det aktuelle feltet, slik at brukeren slipper å lete etter hvilket felt som må rettes — en liten detalj som gjør at et skjema føles merkbart mer gjennomført.
Numerisk validering
IsNumeric sjekker om en verdi kan konverteres til et tall, uten faktisk å forsøke konverteringen og risikere en feil:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Dette er sjekken som ville fanget opp "twenty" skrevet inn i et numerisk felt, akkurat som vist på skjermbildet over. Først etter at denne sjekken er bestått, er det trygt å skrive kode som CInt(txtReorderLevel.Value) lenger ned i Sub-en — å validere først og konvertere etterpå betyr at konverteringen aldri kan feile uventet.
Dato-validering
IsDate er samme idé, brukt på datoer i stedet for tall:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Feilmeldinger som samler alle problemer på én gang
De tre sjekkene over bruker alle Exit Sub så snart de finner ett problem — greit for et kort skjema, men frustrerende på et lengre, der brukeren retter én feil bare for å støte på den neste med en gang. Et mer gjennomført mønster bygger opp en liste over alle problemer før det vises én samlet melding:
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 strengbyggingsteknikken som i lagerbeholdningsmakroen fra forrige kapittel — errors starter tom, og hver mislykket sjekk legger til én linje til i stedet for å avslutte umiddelbart. Først etter at alle sjekkene er kjørt, ser Sub-en om errors endte opp tom eller ikke, noe som lar brukeren se alle problemer med inndataene sine på én gang i stedet for én frustrerende runde per feil.
Oppgave
- Skriv om
cmdSave_Clickfra forrige kapitteloppgave slik at den bygger opp en feilmeldingstreng, og sjekker at Firmanavn, Kontaktperson og E-post ikke er tomme. - Legg til en fjerde tekstboks, txtReorderLevel, kun for denne øvelsen, og valider den med IsNumeric.
- Vis én samlet meldingsboks (MsgBox) som lister opp alle problemer, bruk vbExclamation som ikon, og gå kun videre til selve ListRows.Add-koden hvis feilmeldingsstrengen er tom.
- Test ved å la alle feltene stå tomme og klikk på Lagre — bekreft at alle forventede feilmeldingslinjer vises i én enkelt melding.
1. Bygge opp en feilmeldingstreng
- Deklarer én
String-variabel (errors) øverst icmdSave_Click, startende som tom. - For hvert av de tre feltene, bruk samme
Trim(...) = ""-sjekk som i seksjon 5.3 — hvis det er tomt, legg til én linje ierrorsi stedet for å vise enMsgBoxmed en gang eller avslutte Sub-en. vbNewLinepå slutten av hver linje sørger for at hvert problem havner på egen linje i den endelige meldingen.
2. Legge til txtReorderLevel
- Dette er en tekstboks kun for å øve på numerisk validering — den tilsvarer ikke en ekte kolonne i
tblCustomers, så ikke prøv å skrive den inn inewRowsenere. - Legg den til i skjemaet i Design-visning (Shift+F7) med tilhørende etikett, på samme måte som du la til de tre andre tekstboksene.
IsNumericsjekker råteksten i.Value— hvis den feiler, legg til en linje ierrorspå samme måte som for de tomme feltene.
3. Én samlet MsgBox, deretter fortsette
- Alt fra seksjon 5.3 sitt gjennomgåtte eksempel gjelder direkte her — sjekk
If errors <> "" Then, vis énMsgBoxmedvbExclamation, ogExit Sub. ListRows.Add-koden kjøres kun hvis denneIf-blokken ikke avsluttet — det betyr at den må stå fysisk etter hele valideringsblokken, ikke inne i enElse.
4. Testing med alt tomt
- Klikk Lagre uten å skrive inn noe som helst.
- Du skal se nøyaktig én
MsgBoxsom lister opp alle fire problemene (Firmanavn, Kontaktperson, E-post, Reorder Level) i stedet for å stoppe etter det første — denne samlede meldingen er selve poenget med øvelsen, sammenlignet med den tidligere versjonen som avsluttet etter første feil.
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
Kjør skjemaet, la alle feltene stå tomme, og klikk Lagre — du skal se én MsgBox med et varselsikon som lister opp alle fire manglende/ugyldige felter samtidig, og ingen rad legges til i tblCustomers før alt er fylt ut korrekt.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår