Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Validering av brukerinput | Brukerinteraksjon
Excel VBA for Forretningsautomatisering

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:

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

  1. Skriv om cmdSave_Click fra forrige kapitteloppgave slik at den bygger opp en feilmeldingstreng, og sjekker at Firmanavn, Kontaktperson og E-post ikke er tomme.
  2. Legg til en fjerde tekstboks, txtReorderLevel, kun for denne øvelsen, og valider den med IsNumeric.
  3. 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.
  4. Test ved å la alle feltene stå tomme og klikk på Lagre — bekreft at alle forventede feilmeldingslinjer vises i én enkelt melding.
Tips
expand arrow

1. Bygge opp en feilmeldingstreng

  • Deklarer én String-variabel (errors) øverst i cmdSave_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 i errors i stedet for å vise en MsgBox med en gang eller avslutte Sub-en.
  • vbNewLine på 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 i newRow senere.
  • 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.
  • IsNumeric sjekker råteksten i .Value — hvis den feiler, legg til en linje i errors på 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 én MsgBox med vbExclamation, og Exit Sub.
  • ListRows.Add-koden kjøres kun hvis denne If-blokken ikke avsluttet — det betyr at den må stå fysisk etter hele valideringsblokken, ikke inne i en Else.

4. Testing med alt tomt

  • Klikk Lagre uten å skrive inn noe som helst.
  • Du skal se nøyaktig én MsgBox som 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.
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

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.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 3

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 5. Kapittel 3
some-alt