Käyttäjän Syötteen Validointi
Pyyhkäise näyttääksesi valikon
Tallenna-painike edellisestä luvusta tallentaa iloisesti tyhjän yrityksen nimen tai virheellisen sähköpostiosoitteen Customers-tauluun, koska mikään cmdSave_Click-rutiinissa ei tarkista tietoja etukäteen. Validointi on vaihe, joka suoritetaan ennen tallennusta — ongelmien havaitseminen silloin, kun ne on vielä helppo korjata, sen sijaan että ne muuttuisivat huonoiksi tiedoiksi laskentataulukossa.
Pakolliset kentät
Yksinkertaisin tarkistus: onko tämä TextBox yhä tyhjä?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim on tässä tärkeämpi kuin miltä se vaikuttaa — käyttäjä, joka syöttää vain välilyöntejä, läpäisisi pelkän = "" -tarkistuksen, koska " " ei teknisesti ole tyhjä merkkijono, mutta se on aivan yhtä käyttökelvoton kuin oikea tyhjyys. SetFocus siirtää vilkkuvan kohdistimen suoraan kyseiseen kenttään, joten käyttäjän ei tarvitse etsiä, mikä kenttä vaatii korjausta — pieni yksityiskohta, joka tekee lomakkeesta huomattavasti viimeistellymmän tuntuisen.
Numeraalinen validointi
IsNumeric tarkistaa, voiko arvo olla numero, yrittämättä kuitenkaan muuntaa sitä ja aiheuttaa virhettä:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Tämä tarkistus olisi havainnut "twenty"-tekstin syötettynä numeeriseen kenttään, kuten yllä olevassa kuvakaappauksessa. Vasta tämän tarkistuksen jälkeen on turvallista kirjoittaa koodia kuten CInt(txtReorderLevel.Value) myöhemmin Sub-rutiinissa — ensin validoidaan ja sitten muunnetaan, jolloin muunnos ei voi epäonnistua odottamattomasti.
Päivämäärän validointi
IsDate toimii samalla periaatteella, mutta päivämäärille numeroiden sijaan:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Virheilmoitukset, jotka keräävät kaikki ongelmat kerralla
Kolme yllä olevaa tarkistusta käyttävät Exit Sub heti, kun yksi ongelma löytyy — tämä sopii lyhyelle lomakkeelle, mutta pidemmällä lomakkeella on turhauttavaa, jos käyttäjä korjaa yhden virheen ja törmää heti seuraavaan. Viimeistellympi tapa kerää kaikki ongelmat listaksi ennen kuin näyttää yhdistetyn viestin:
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
Tämä on sama merkkijonon rakentamistekniikka kuin edellisen luvun varastohälytysmakrossa — errors alkaa tyhjänä, ja jokainen epäonnistunut tarkistus lisää siihen uuden rivin sen sijaan, että poistuttaisiin heti. Vasta kun kaikki tarkistukset on suoritettu, Sub tarkistaa, jäikö errors tyhjäksi vai ei, mikä mahdollistaa sen, että käyttäjä näkee kaikki syötteensä ongelmat yhdellä kertaa eikä joudu korjaamaan niitä yksi kerrallaan.
Tehtävä
- Kirjoita uudelleen
cmdSave_Clickedellisen luvun tehtävästä siten, että virheviestit kerätään yhteen merkkijonoon, tarkistaen että Yrityksen nimi, Yhteyshenkilö ja Sähköposti eivät ole tyhjiä. - Lisää neljäs tekstikenttä, txtReorderLevel, vain tätä harjoitusta varten, ja validoi se IsNumeric-funktiolla.
- Näytä yksi yhdistetty MsgBox, jossa luetellaan kaikki ongelmat, käyttäen vbExclamation-kuvaketta, ja jatka ListRows.Add-koodiin vain, jos virheviesti on tyhjä.
- Testaa jättämällä kaikki kentät tyhjiksi ja klikkaamalla Tallenna — varmista, että kaikki odotetut virherivit näkyvät yhdessä viestissä.
1. Virheviestin kokoaminen
- Määrittele yksi
String-muuttuja (errors)cmdSave_Click-aliohjelman alkuun, aluksi tyhjäksi. - Jokaiselle kolmelle kentälle käytä samaa
Trim(...) = ""-tarkistusta kuin kohdassa 5.3 — jos kenttä on tyhjä, lisää yksi rivierrors-muuttujaan sen sijaan, että näyttäisit hetiMsgBox-viestin tai poistuisit aliohjelmasta. - Lisää
vbNewLinejokaisen lisätyn rivin loppuun, jotta jokainen ongelma näkyy omalla rivillään lopullisessa viestissä.
2. txtReorderLevelin lisääminen
- Tämä on tekstikenttä, jonka tarkoitus on harjoitella numeerista validointia — se ei vastaa oikeaa saraketta
tblCustomers-taulussa, joten sitä ei tarvitse tallentaanewRow-muuttujaan myöhemmin. - Lisää kenttä lomakkeelle suunnittelutilassa (Shift+F7) ja sille sopiva nimilappu, samalla tavalla kuin muut kolme tekstikenttää.
IsNumerictarkistaa raakatiedon.Value-ominaisuudesta — jos tarkistus epäonnistuu, lisää rivierrors-muuttujaan samalla tavalla kuin tyhjien kenttien tarkistuksissa.
3. Yhdistetty MsgBox ja jatkaminen
- Kaikki kohdan 5.3 esimerkin vaiheet pätevät suoraan myös tässä — tarkista
If errors <> "" Then, näytä yksiMsgBoxkäyttäenvbExclamation-kuvaketta jaExit Sub. ListRows.Add-koodi suoritetaan vain, jos kyseinenIf-lohko ei poistunut — eli sen tulee sijaita fyysisesti koko validointilohkon jälkeen, eiElse-osion sisällä.
4. Testaus kaikki kentät tyhjinä
- Klikkaa Tallenna ilman, että kirjoitat mitään kenttiin.
- Näet täsmälleen yhden
MsgBox-viestin, jossa luetellaan kaikki neljä ongelmaa (Yrityksen nimi, Yhteyshenkilö, Sähköposti, Reorder Level) sen sijaan, että tarkistus pysähtyisi ensimmäiseen virheeseen — tämä yhdistetty viesti on tämän harjoituksen varsinainen tavoite verrattuna aiempaan versioon, joka poistui heti ensimmäisen virheen jälkeen.
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
Suorita lomake, jätä kaikki kentät tyhjiksi ja klikkaa Tallenna — näet yhden MsgBox-viestin, jossa varoituskuvake ja kaikki neljä puuttuvaa/virheellistä kenttää lueteltuna, eikä yhtään riviä lisätä tblCustomers-tauluun ennen kuin kaikki kentät on täytetty oikein.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Käyttäjän Syötteen Validointi
Tallenna-painike edellisestä luvusta tallentaa iloisesti tyhjän yrityksen nimen tai virheellisen sähköpostiosoitteen Customers-tauluun, koska mikään cmdSave_Click-rutiinissa ei tarkista tietoja etukäteen. Validointi on vaihe, joka suoritetaan ennen tallennusta — ongelmien havaitseminen silloin, kun ne on vielä helppo korjata, sen sijaan että ne muuttuisivat huonoiksi tiedoiksi laskentataulukossa.
Pakolliset kentät
Yksinkertaisin tarkistus: onko tämä TextBox yhä tyhjä?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim on tässä tärkeämpi kuin miltä se vaikuttaa — käyttäjä, joka syöttää vain välilyöntejä, läpäisisi pelkän = "" -tarkistuksen, koska " " ei teknisesti ole tyhjä merkkijono, mutta se on aivan yhtä käyttökelvoton kuin oikea tyhjyys. SetFocus siirtää vilkkuvan kohdistimen suoraan kyseiseen kenttään, joten käyttäjän ei tarvitse etsiä, mikä kenttä vaatii korjausta — pieni yksityiskohta, joka tekee lomakkeesta huomattavasti viimeistellymmän tuntuisen.
Numeraalinen validointi
IsNumeric tarkistaa, voiko arvo olla numero, yrittämättä kuitenkaan muuntaa sitä ja aiheuttaa virhettä:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Tämä tarkistus olisi havainnut "twenty"-tekstin syötettynä numeeriseen kenttään, kuten yllä olevassa kuvakaappauksessa. Vasta tämän tarkistuksen jälkeen on turvallista kirjoittaa koodia kuten CInt(txtReorderLevel.Value) myöhemmin Sub-rutiinissa — ensin validoidaan ja sitten muunnetaan, jolloin muunnos ei voi epäonnistua odottamattomasti.
Päivämäärän validointi
IsDate toimii samalla periaatteella, mutta päivämäärille numeroiden sijaan:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Virheilmoitukset, jotka keräävät kaikki ongelmat kerralla
Kolme yllä olevaa tarkistusta käyttävät Exit Sub heti, kun yksi ongelma löytyy — tämä sopii lyhyelle lomakkeelle, mutta pidemmällä lomakkeella on turhauttavaa, jos käyttäjä korjaa yhden virheen ja törmää heti seuraavaan. Viimeistellympi tapa kerää kaikki ongelmat listaksi ennen kuin näyttää yhdistetyn viestin:
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
Tämä on sama merkkijonon rakentamistekniikka kuin edellisen luvun varastohälytysmakrossa — errors alkaa tyhjänä, ja jokainen epäonnistunut tarkistus lisää siihen uuden rivin sen sijaan, että poistuttaisiin heti. Vasta kun kaikki tarkistukset on suoritettu, Sub tarkistaa, jäikö errors tyhjäksi vai ei, mikä mahdollistaa sen, että käyttäjä näkee kaikki syötteensä ongelmat yhdellä kertaa eikä joudu korjaamaan niitä yksi kerrallaan.
Tehtävä
- Kirjoita uudelleen
cmdSave_Clickedellisen luvun tehtävästä siten, että virheviestit kerätään yhteen merkkijonoon, tarkistaen että Yrityksen nimi, Yhteyshenkilö ja Sähköposti eivät ole tyhjiä. - Lisää neljäs tekstikenttä, txtReorderLevel, vain tätä harjoitusta varten, ja validoi se IsNumeric-funktiolla.
- Näytä yksi yhdistetty MsgBox, jossa luetellaan kaikki ongelmat, käyttäen vbExclamation-kuvaketta, ja jatka ListRows.Add-koodiin vain, jos virheviesti on tyhjä.
- Testaa jättämällä kaikki kentät tyhjiksi ja klikkaamalla Tallenna — varmista, että kaikki odotetut virherivit näkyvät yhdessä viestissä.
1. Virheviestin kokoaminen
- Määrittele yksi
String-muuttuja (errors)cmdSave_Click-aliohjelman alkuun, aluksi tyhjäksi. - Jokaiselle kolmelle kentälle käytä samaa
Trim(...) = ""-tarkistusta kuin kohdassa 5.3 — jos kenttä on tyhjä, lisää yksi rivierrors-muuttujaan sen sijaan, että näyttäisit hetiMsgBox-viestin tai poistuisit aliohjelmasta. - Lisää
vbNewLinejokaisen lisätyn rivin loppuun, jotta jokainen ongelma näkyy omalla rivillään lopullisessa viestissä.
2. txtReorderLevelin lisääminen
- Tämä on tekstikenttä, jonka tarkoitus on harjoitella numeerista validointia — se ei vastaa oikeaa saraketta
tblCustomers-taulussa, joten sitä ei tarvitse tallentaanewRow-muuttujaan myöhemmin. - Lisää kenttä lomakkeelle suunnittelutilassa (Shift+F7) ja sille sopiva nimilappu, samalla tavalla kuin muut kolme tekstikenttää.
IsNumerictarkistaa raakatiedon.Value-ominaisuudesta — jos tarkistus epäonnistuu, lisää rivierrors-muuttujaan samalla tavalla kuin tyhjien kenttien tarkistuksissa.
3. Yhdistetty MsgBox ja jatkaminen
- Kaikki kohdan 5.3 esimerkin vaiheet pätevät suoraan myös tässä — tarkista
If errors <> "" Then, näytä yksiMsgBoxkäyttäenvbExclamation-kuvaketta jaExit Sub. ListRows.Add-koodi suoritetaan vain, jos kyseinenIf-lohko ei poistunut — eli sen tulee sijaita fyysisesti koko validointilohkon jälkeen, eiElse-osion sisällä.
4. Testaus kaikki kentät tyhjinä
- Klikkaa Tallenna ilman, että kirjoitat mitään kenttiin.
- Näet täsmälleen yhden
MsgBox-viestin, jossa luetellaan kaikki neljä ongelmaa (Yrityksen nimi, Yhteyshenkilö, Sähköposti, Reorder Level) sen sijaan, että tarkistus pysähtyisi ensimmäiseen virheeseen — tämä yhdistetty viesti on tämän harjoituksen varsinainen tavoite verrattuna aiempaan versioon, joka poistui heti ensimmäisen virheen jälkeen.
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
Suorita lomake, jätä kaikki kentät tyhjiksi ja klikkaa Tallenna — näet yhden MsgBox-viestin, jossa varoituskuvake ja kaikki neljä puuttuvaa/virheellistä kenttää lueteltuna, eikä yhtään riviä lisätä tblCustomers-tauluun ennen kuin kaikki kentät on täytetty oikein.
Kiitos palautteestasi!