Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Käyttäjän Syötteen Validointi | Käyttäjän vuorovaikutus
Excel VBA Liiketoiminnan Automaatioon

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:

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

  1. Kirjoita uudelleen cmdSave_Click edellisen 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ä.
  2. Lisää neljäs tekstikenttä, txtReorderLevel, vain tätä harjoitusta varten, ja validoi se IsNumeric-funktiolla.
  3. Näytä yksi yhdistetty MsgBox, jossa luetellaan kaikki ongelmat, käyttäen vbExclamation-kuvaketta, ja jatka ListRows.Add-koodiin vain, jos virheviesti on tyhjä.
  4. Testaa jättämällä kaikki kentät tyhjiksi ja klikkaamalla Tallenna — varmista, että kaikki odotetut virherivit näkyvät yhdessä viestissä.
Vihje
expand arrow

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 rivi errors-muuttujaan sen sijaan, että näyttäisit heti MsgBox-viestin tai poistuisit aliohjelmasta.
  • Lisää vbNewLine jokaisen 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 tallentaa newRow-muuttujaan myöhemmin.
  • Lisää kenttä lomakkeelle suunnittelutilassa (Shift+F7) ja sille sopiva nimilappu, samalla tavalla kuin muut kolme tekstikenttää.
  • IsNumeric tarkistaa raakatiedon .Value-ominaisuudesta — jos tarkistus epäonnistuu, lisää rivi errors-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ä yksi MsgBox käyttäen vbExclamation-kuvaketta ja Exit Sub.
  • ListRows.Add-koodi suoritetaan vain, jos kyseinen If-lohko ei poistunut — eli sen tulee sijaita fyysisesti koko validointilohkon jälkeen, ei Else-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.
Ratkaisu
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

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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:

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

  1. Kirjoita uudelleen cmdSave_Click edellisen 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ä.
  2. Lisää neljäs tekstikenttä, txtReorderLevel, vain tätä harjoitusta varten, ja validoi se IsNumeric-funktiolla.
  3. Näytä yksi yhdistetty MsgBox, jossa luetellaan kaikki ongelmat, käyttäen vbExclamation-kuvaketta, ja jatka ListRows.Add-koodiin vain, jos virheviesti on tyhjä.
  4. Testaa jättämällä kaikki kentät tyhjiksi ja klikkaamalla Tallenna — varmista, että kaikki odotetut virherivit näkyvät yhdessä viestissä.
Vihje
expand arrow

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 rivi errors-muuttujaan sen sijaan, että näyttäisit heti MsgBox-viestin tai poistuisit aliohjelmasta.
  • Lisää vbNewLine jokaisen 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 tallentaa newRow-muuttujaan myöhemmin.
  • Lisää kenttä lomakkeelle suunnittelutilassa (Shift+F7) ja sille sopiva nimilappu, samalla tavalla kuin muut kolme tekstikenttää.
  • IsNumeric tarkistaa raakatiedon .Value-ominaisuudesta — jos tarkistus epäonnistuu, lisää rivi errors-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ä yksi MsgBox käyttäen vbExclamation-kuvaketta ja Exit Sub.
  • ListRows.Add-koodi suoritetaan vain, jos kyseinen If-lohko ei poistunut — eli sen tulee sijaita fyysisesti koko validointilohkon jälkeen, ei Else-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.
Ratkaisu
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

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3
some-alt