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:
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
- Skriv om
cmdSave_Clickfrå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. - Lägg till en fjärde TextBox, txtReorderLevel, enbart för denna övning, och validera den med IsNumeric.
- 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.
- 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.
1. Bygga upp en felsträng
- Deklarera en
String-variabel (errors) högst upp icmdSave_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 ierrorsistället för att direkt visa enMsgBoxeller avsluta Sub:en. vbNewLinei 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 inewRowsenare. - 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.
IsNumerickontrollerar den råa texten i.Value— om kontrollen misslyckas, lägg till en rad ierrorsprecis 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 enMsgBoxmedvbExclamationochExit Sub. - Koden för
ListRows.Addkörs bara om detIf-blocket inte avslutade — vilket betyder att den måste ligga fysiskt efter hela valideringsblocket, inte inuti enElse.
4. Testa med allt tomt
- Klicka på Spara utan att skriva in något alls.
- Du ska se exakt en
MsgBoxsom 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.
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.
Tack för dina kommentarer!
Fråga AI
Fråga AI
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:
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
- Skriv om
cmdSave_Clickfrå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. - Lägg till en fjärde TextBox, txtReorderLevel, enbart för denna övning, och validera den med IsNumeric.
- 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.
- 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.
1. Bygga upp en felsträng
- Deklarera en
String-variabel (errors) högst upp icmdSave_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 ierrorsistället för att direkt visa enMsgBoxeller avsluta Sub:en. vbNewLinei 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 inewRowsenare. - 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.
IsNumerickontrollerar den råa texten i.Value— om kontrollen misslyckas, lägg till en rad ierrorsprecis 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 enMsgBoxmedvbExclamationochExit Sub. - Koden för
ListRows.Addkörs bara om detIf-blocket inte avslutade — vilket betyder att den måste ligga fysiskt efter hela valideringsblocket, inte inuti enElse.
4. Testa med allt tomt
- Klicka på Spara utan att skriva in något alls.
- Du ska se exakt en
MsgBoxsom 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.
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.
Tack för dina kommentarer!