Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Validering av användarinmatning | Användarinteraktion
Excel VBA för affärsautomatisering

Validering av användarinmatning

Svep för att visa menyn

Spara-knappen från föregående kapitel kommer utan problem att skriva in ett tomt företagsnamn eller en felaktig e-postadress i Customers-tabellen, eftersom inget i cmdSave_Click kontrollerar datan först. Validering är steget som körs innan sparandet — det fångar problem medan de fortfarande är enkla att åtgärda, istället för efter att de blivit dåliga data i ett kalkylblad.

Obligatoriska fält

Den enklaste kontrollen: är denna TextBox fortfarande tom?

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

Trim är viktigare här än det kanske verkar — en användare som skriver några mellanslag och inget annat skulle klara en vanlig = ""-kontroll, eftersom " " tekniskt sett inte är en tom sträng, men det är lika oanvändbart som verklig tomhet. SetFocus flyttar den blinkande markören direkt till det felaktiga fältet, så användaren slipper leta efter vilket fält som behöver rättas — en liten detalj som gör att ett formulär känns betydligt mer genomarbetat.

Numerisk validering

IsNumeric kontrollerar om ett värde kan konverteras till ett tal, utan att faktiskt försöka konvertera och riskera ett fel:

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

Detta är kontrollen som skulle ha fångat "twenty" inskrivet i ett numeriskt fält, precis som visas i skärmdumpen ovan. Först när denna kontroll passerar är det säkert att skriva kod som CInt(txtReorderLevel.Value) längre ner i Sub: att validera först och konvertera sedan innebär att konverteringen aldrig kan misslyckas oväntat.

Datumvalidering

IsDate är samma princip, tillämpad på datum istället för tal:

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

Felmeddelanden som samlar alla problem på en gång De tre kontrollerna ovan Exit Sub så fort de hittar ett problem — bra för ett kort formulär, men frustrerande i ett längre, där användaren rättar ett fel bara för att direkt stöta på nästa. Ett mer genomarbetat mönster bygger upp en lista över alla problem innan ett samlat meddelande visas:

Valideringsexempel
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

Detta är samma strängbyggande teknik som i förra kapitlets lagerlarm-makro — errors börjar tom, och varje misslyckad kontroll lägger till en rad istället för att avsluta direkt. Först efter att alla kontroller har körts tittar Sub på om errors blev tom eller inte, vilket gör att användaren kan se alla problem med sin inmatning på en gång istället för en frustrerande omgång per misstag.

Uppgift

  1. Skriv om cmdSave_Click från föregående kapitels uppgift för att bygga upp en felsträng, där du kontrollerar att Företagsnamn, Kontaktperson och E-post inte är tomma.
  2. Lägg till en fjärde TextBox, txtReorderLevel, enbart för denna övning, och validera den med IsNumeric.
  3. Visa ett kombinerat meddelande (MsgBox) som listar alla problem, med vbExclamation som ikon, och fortsätt till ListRows.Add-koden först när felsträngen är tom.
  4. Testa genom att lämna alla fält tomma och klicka på Spara — bekräfta att alla förväntade felrader visas i ett enda meddelande.
Tips
expand arrow

1. Bygga upp en felsträng

  • Deklarera en String-variabel (errors) högst upp i cmdSave_Click, och låt den börja som tom.
  • För vart och ett av de tre fälten, använd samma kontroll Trim(...) = "" från avsnitt 5.3 — om det är tomt, lägg till en rad i errors istället för att direkt visa en MsgBox eller avsluta Sub:en.
  • vbNewLine i slutet av varje tillagd rad gör att varje problem hamnar på en egen rad i det slutliga meddelandet.

2. Lägga till txtReorderLevel

  • Detta är en TextBox enbart för att öva numerisk validering — den motsvarar ingen verklig kolumn i tblCustomers, så försök inte skriva in den i newRow senare.
  • Lägg till den i formuläret i Designläge (Shift+F7) med en matchande etikett, på samma sätt som du lade till de andra tre TextBoxarna.
  • IsNumeric kontrollerar den råa texten i .Value — om kontrollen misslyckas, lägg till en rad i errors precis som vid kontrollerna för tomma fält.

3. Ett kombinerat MsgBox, sedan fortsätta

  • Allt från det genomgångna exemplet i avsnitt 5.3 gäller direkt här — kontrollera If errors <> "" Then, visa en MsgBox med vbExclamation och Exit Sub.
  • Koden för ListRows.Add körs bara om det If-blocket inte avslutade — vilket betyder att den måste ligga fysiskt efter hela valideringsblocket, inte inuti en Else.

4. Testa med allt tomt

  • Klicka på Spara utan att skriva in något alls.
  • Du ska se exakt en MsgBox som listar alla fyra problemen (Företagsnamn, Kontaktperson, E-post, Reorder Level) istället för att stanna efter det första — det är just det kombinerade meddelandet som är poängen med denna övning, jämfört med den tidigare versionen som avslutade efter första felet.
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 formuläret, lämna alla fält tomma och klicka på Spara — du ska se en MsgBox med en varningsikon som listar alla fyra saknade/ogiltiga fält på en gång, och ingen rad läggs till i tblCustomers förrän du faktiskt fyllt i allt korrekt.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Validering av användarinmatning

Spara-knappen från föregående kapitel kommer utan problem att skriva in ett tomt företagsnamn eller en felaktig e-postadress i Customers-tabellen, eftersom inget i cmdSave_Click kontrollerar datan först. Validering är steget som körs innan sparandet — det fångar problem medan de fortfarande är enkla att åtgärda, istället för efter att de blivit dåliga data i ett kalkylblad.

Obligatoriska fält

Den enklaste kontrollen: är denna TextBox fortfarande tom?

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

Trim är viktigare här än det kanske verkar — en användare som skriver några mellanslag och inget annat skulle klara en vanlig = ""-kontroll, eftersom " " tekniskt sett inte är en tom sträng, men det är lika oanvändbart som verklig tomhet. SetFocus flyttar den blinkande markören direkt till det felaktiga fältet, så användaren slipper leta efter vilket fält som behöver rättas — en liten detalj som gör att ett formulär känns betydligt mer genomarbetat.

Numerisk validering

IsNumeric kontrollerar om ett värde kan konverteras till ett tal, utan att faktiskt försöka konvertera och riskera ett fel:

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

Detta är kontrollen som skulle ha fångat "twenty" inskrivet i ett numeriskt fält, precis som visas i skärmdumpen ovan. Först när denna kontroll passerar är det säkert att skriva kod som CInt(txtReorderLevel.Value) längre ner i Sub: att validera först och konvertera sedan innebär att konverteringen aldrig kan misslyckas oväntat.

Datumvalidering

IsDate är samma princip, tillämpad på datum istället för tal:

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

Felmeddelanden som samlar alla problem på en gång De tre kontrollerna ovan Exit Sub så fort de hittar ett problem — bra för ett kort formulär, men frustrerande i ett längre, där användaren rättar ett fel bara för att direkt stöta på nästa. Ett mer genomarbetat mönster bygger upp en lista över alla problem innan ett samlat meddelande visas:

Valideringsexempel
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

Detta är samma strängbyggande teknik som i förra kapitlets lagerlarm-makro — errors börjar tom, och varje misslyckad kontroll lägger till en rad istället för att avsluta direkt. Först efter att alla kontroller har körts tittar Sub på om errors blev tom eller inte, vilket gör att användaren kan se alla problem med sin inmatning på en gång istället för en frustrerande omgång per misstag.

Uppgift

  1. Skriv om cmdSave_Click från föregående kapitels uppgift för att bygga upp en felsträng, där du kontrollerar att Företagsnamn, Kontaktperson och E-post inte är tomma.
  2. Lägg till en fjärde TextBox, txtReorderLevel, enbart för denna övning, och validera den med IsNumeric.
  3. Visa ett kombinerat meddelande (MsgBox) som listar alla problem, med vbExclamation som ikon, och fortsätt till ListRows.Add-koden först när felsträngen är tom.
  4. Testa genom att lämna alla fält tomma och klicka på Spara — bekräfta att alla förväntade felrader visas i ett enda meddelande.
Tips
expand arrow

1. Bygga upp en felsträng

  • Deklarera en String-variabel (errors) högst upp i cmdSave_Click, och låt den börja som tom.
  • För vart och ett av de tre fälten, använd samma kontroll Trim(...) = "" från avsnitt 5.3 — om det är tomt, lägg till en rad i errors istället för att direkt visa en MsgBox eller avsluta Sub:en.
  • vbNewLine i slutet av varje tillagd rad gör att varje problem hamnar på en egen rad i det slutliga meddelandet.

2. Lägga till txtReorderLevel

  • Detta är en TextBox enbart för att öva numerisk validering — den motsvarar ingen verklig kolumn i tblCustomers, så försök inte skriva in den i newRow senare.
  • Lägg till den i formuläret i Designläge (Shift+F7) med en matchande etikett, på samma sätt som du lade till de andra tre TextBoxarna.
  • IsNumeric kontrollerar den råa texten i .Value — om kontrollen misslyckas, lägg till en rad i errors precis som vid kontrollerna för tomma fält.

3. Ett kombinerat MsgBox, sedan fortsätta

  • Allt från det genomgångna exemplet i avsnitt 5.3 gäller direkt här — kontrollera If errors <> "" Then, visa en MsgBox med vbExclamation och Exit Sub.
  • Koden för ListRows.Add körs bara om det If-blocket inte avslutade — vilket betyder att den måste ligga fysiskt efter hela valideringsblocket, inte inuti en Else.

4. Testa med allt tomt

  • Klicka på Spara utan att skriva in något alls.
  • Du ska se exakt en MsgBox som listar alla fyra problemen (Företagsnamn, Kontaktperson, E-post, Reorder Level) istället för att stanna efter det första — det är just det kombinerade meddelandet som är poängen med denna övning, jämfört med den tidigare versionen som avslutade efter första felet.
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 formuläret, lämna alla fält tomma och klicka på Spara — du ska se en MsgBox med en varningsikon som listar alla fyra saknade/ogiltiga fält på en gång, och ingen rad läggs till i tblCustomers förrän du faktiskt fyllt i allt korrekt.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 3
some-alt