Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Viestiruudut ja syöttöruudut | Käyttäjän vuorovaikutus
Excel VBA Liiketoiminnan Automaatioon

Viestiruudut ja syöttöruudut

Pyyhkäise näyttääksesi valikon

Ennen kuin rakennat täyden lomakkeen, kannattaa hallita kaksi yksinkertaisinta tapaa, joilla VBA voi olla vuorovaikutuksessa käyttäjän kanssa: MsgBox, joka näyttää tietoa ja voi tarvittaessa esittää kysymyksen, sekä InputBox, joka pyytää lyhyen tekstivastauksen.

MsgBox

Yksinkertaisimmillaan MsgBox vain näyttää viestin ja odottaa, että käyttäjä napsauttaa OK:

MsgBox "Customer saved successfully."

Tässä käytössä — lauseena, ilman sulkuja ja ilman tuloksen tallentamista — MsgBox on päätepiste: se näyttää viestin ja koodi jatkuu eteenpäin riippumatta siitä, mitä käyttäjä tekee. Heti kun tarvitset tiedon siitä, mitä painiketta napsautettiin, MsgBox muuttuu funktioksi lauseen sijaan, mikä tarkoittaa, että tarvitaan sulut ja jokin muuttuja tuloksen tallentamiseen:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Kuvio 5.1

vbYesNo ja vbQuestion yhdistetään tavallisella +-merkillä, mikä voi aluksi näyttää oudolta, mutta on vain VBA:n tapa yhdistää kaksi erillistä asetusta — mitkä painikkeet näytetään ja mikä kuvake näytetään — MsgBoxin odottamaksi toiseksi argumentiksi. result saa arvokseen yhden VBA:n sisäänrakennetuista vakioista, vbYes tai vbNo, jotka ovat todellisuudessa vain numeroita (6 ja 7, mutta näitä ei kirjoiteta suoraan). Toiminnon ohjaaminen vastauksen perusteella onnistuu tavallisella If-rakenteella:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Missä MsgBox palauttaa aina vain ennalta määritellyn joukon painikekonstantteja, InputBox pyytää käyttäjää kirjoittamaan jotain ja palauttaa juuri sen, mitä käyttäjä syöttää:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Kuvio 5.2

Kolmas argumentti, tässä "Chicago", esitäyttää tekstikentän — hyödyllinen tapa ehdottaa todennäköistä vastausta, jonka käyttäjä voi hyväksyä tai korvata. Kaksi yksityiskohtaa on helppo tehdä väärin ensimmäisellä kerralla: mitä tahansa käyttäjä kirjoittaa, se palautetaan String-muodossa riippumatta siitä, miltä se näyttää, joten esimerkiksi 25 palauttaa tekstin "25", ei lukua 25, ja sinun täytyy käyttää CInt tai CDbl ennen kuin teet sillä laskutoimituksia; ja kun käyttäjä painaa Peruuta, se ei aiheuta virhettä eikä pysäytä koodia — se vain palauttaa tyhjän merkkijonon (""), jonka koodin täytyy tarkistaa erikseen, jos tyhjä vastaus ei ole sallittu.

Käyttäjän kehotteet ja vahvistukset

Näiden kahden yhdistäminen on vakiokaava kaikille toiminnoille, joissa luetaan käyttäjän syöte ja sitten vahvistetaan ennen riskialttiin toiminnon suorittamista:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Huomaa, että confirmMsg on määritelty As VbMsgBoxResult eikä yleisenä tyyppinä — tämä on nimetty tyyppi, jota VBA käyttää MsgBoxin paluuarvolle, ja sen eksplisiittinen määrittely (sen sijaan, että jättäisi sen Variantiksi) mahdollistaa VBE:n tarjoaman automaattisen täydennyksen arvoille kuten vbYes, vbNo ja muille kirjoittaessasi. Tyhjän merkkijonon tarkistus InputBoxin jälkeen ja vbNo-tarkistus MsgBoxin jälkeen käyttävät samaa poistumiskaavaa, Exit Sub, joka pysäyttää proseduurin välittömästi sen sijaan, että koodi jatkaisi eteenpäin olettaen, että syöte on kelvollinen.

Tehtävä

  1. Kirjoita Sub, joka käyttää InputBox-toimintoa kysyäkseen asiakasnumeroa (Customer ID) ja sitten MsgBoxia vahvistaakseen "Poistetaanko asiakas [ID]?" Kyllä/Ei-painikkeilla ja kysymysmerkkikuvakkeella.
  2. Käsittele sekä tyhjän merkkijonon tapaus (käyttäjä painoi Peruuta InputBoxissa) että vbNo-tapaus (käyttäjä hylkäsi vahvistuksen) poistumalla Subista heti ja näyttämällä viesti, jossa kerrotaan ettei mitään tapahtunut.
  3. Vain jos molemmat tarkistukset menevät läpi, näytä lopuksi MsgBox, jossa lukee "Tässä kohtaa asiakas poistettaisiin."
Vihje
expand arrow

1. Asiakasnumeron hakeminen ja vahvistuksen rakentaminen

  • InputBox tarvitsee kehotteen ja voi ottaa otsikon toisena argumenttina — tallenna palautettu arvo String-muuttujaan.
  • Vahvistusviestiin tulee liittää oikea asiakasnumero yhdistämällä se &-operaattorilla, ei kirjoittaa kiinteänä merkkijonona — muuten viesti näyttäisi aina kirjaimellisesti "[ID]".
  • Kun MsgBox-funktiota käytetään tuloksen tallentamiseen, tarvitaan sulut; yhdistä vbYesNo ja vbQuestion yhteen +-merkillä.

2. Peruuta- ja Ei-tapausten käsittely

  • Tarkista tyhjän merkkijonon tapaus heti InputBox-rivin jälkeen, ennen kuin rakennat vahvistusviestiä — ei ole järkeä kysyä "Poistetaanko asiakas?" jos asiakasnumeroa ei ole annettu.
  • Exit Sub lopettaa toimenpiteen välittömästi missä tahansa kohdassa — käytä sitä suoraan jokaisen If-lohkon sisällä, ja näytä juuri ennen sitä MsgBox, jossa kerrotaan ettei mitään tapahtunut.
  • vbNo-tarkistus tehdään vahvistus-MsgBoxin jälkeen vertaamalla tallennettua tulosta vbNo-vakioon.

3. Lopullinen vahvistus

  • Tämä rivi suoritetaan vain, jos suoritus pääsee siihen asti — koska molemmat aiemmat tarkistukset käyttävät Exit Sub-komentoa epäonnistuessaan, riittää että tämä MsgBox sijoitetaan molempien tarkistusten jälkeen, jotta se suoritetaan vain kun molemmat ovat menneet läpi.
Ratkaisu
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Suorita makro (F5) ja kokeile kaikkia kolmea polkua: paina Peruuta InputBox, paina Ei vahvistuksessa ja lopuksi syötä asiakasnumero ja paina Kyllä — jokaisen pitäisi tuottaa eri kolmesta viestistä.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Viestiruudut ja syöttöruudut

Ennen kuin rakennat täyden lomakkeen, kannattaa hallita kaksi yksinkertaisinta tapaa, joilla VBA voi olla vuorovaikutuksessa käyttäjän kanssa: MsgBox, joka näyttää tietoa ja voi tarvittaessa esittää kysymyksen, sekä InputBox, joka pyytää lyhyen tekstivastauksen.

MsgBox

Yksinkertaisimmillaan MsgBox vain näyttää viestin ja odottaa, että käyttäjä napsauttaa OK:

MsgBox "Customer saved successfully."

Tässä käytössä — lauseena, ilman sulkuja ja ilman tuloksen tallentamista — MsgBox on päätepiste: se näyttää viestin ja koodi jatkuu eteenpäin riippumatta siitä, mitä käyttäjä tekee. Heti kun tarvitset tiedon siitä, mitä painiketta napsautettiin, MsgBox muuttuu funktioksi lauseen sijaan, mikä tarkoittaa, että tarvitaan sulut ja jokin muuttuja tuloksen tallentamiseen:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Kuvio 5.1

vbYesNo ja vbQuestion yhdistetään tavallisella +-merkillä, mikä voi aluksi näyttää oudolta, mutta on vain VBA:n tapa yhdistää kaksi erillistä asetusta — mitkä painikkeet näytetään ja mikä kuvake näytetään — MsgBoxin odottamaksi toiseksi argumentiksi. result saa arvokseen yhden VBA:n sisäänrakennetuista vakioista, vbYes tai vbNo, jotka ovat todellisuudessa vain numeroita (6 ja 7, mutta näitä ei kirjoiteta suoraan). Toiminnon ohjaaminen vastauksen perusteella onnistuu tavallisella If-rakenteella:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Missä MsgBox palauttaa aina vain ennalta määritellyn joukon painikekonstantteja, InputBox pyytää käyttäjää kirjoittamaan jotain ja palauttaa juuri sen, mitä käyttäjä syöttää:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Kuvio 5.2

Kolmas argumentti, tässä "Chicago", esitäyttää tekstikentän — hyödyllinen tapa ehdottaa todennäköistä vastausta, jonka käyttäjä voi hyväksyä tai korvata. Kaksi yksityiskohtaa on helppo tehdä väärin ensimmäisellä kerralla: mitä tahansa käyttäjä kirjoittaa, se palautetaan String-muodossa riippumatta siitä, miltä se näyttää, joten esimerkiksi 25 palauttaa tekstin "25", ei lukua 25, ja sinun täytyy käyttää CInt tai CDbl ennen kuin teet sillä laskutoimituksia; ja kun käyttäjä painaa Peruuta, se ei aiheuta virhettä eikä pysäytä koodia — se vain palauttaa tyhjän merkkijonon (""), jonka koodin täytyy tarkistaa erikseen, jos tyhjä vastaus ei ole sallittu.

Käyttäjän kehotteet ja vahvistukset

Näiden kahden yhdistäminen on vakiokaava kaikille toiminnoille, joissa luetaan käyttäjän syöte ja sitten vahvistetaan ennen riskialttiin toiminnon suorittamista:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Huomaa, että confirmMsg on määritelty As VbMsgBoxResult eikä yleisenä tyyppinä — tämä on nimetty tyyppi, jota VBA käyttää MsgBoxin paluuarvolle, ja sen eksplisiittinen määrittely (sen sijaan, että jättäisi sen Variantiksi) mahdollistaa VBE:n tarjoaman automaattisen täydennyksen arvoille kuten vbYes, vbNo ja muille kirjoittaessasi. Tyhjän merkkijonon tarkistus InputBoxin jälkeen ja vbNo-tarkistus MsgBoxin jälkeen käyttävät samaa poistumiskaavaa, Exit Sub, joka pysäyttää proseduurin välittömästi sen sijaan, että koodi jatkaisi eteenpäin olettaen, että syöte on kelvollinen.

Tehtävä

  1. Kirjoita Sub, joka käyttää InputBox-toimintoa kysyäkseen asiakasnumeroa (Customer ID) ja sitten MsgBoxia vahvistaakseen "Poistetaanko asiakas [ID]?" Kyllä/Ei-painikkeilla ja kysymysmerkkikuvakkeella.
  2. Käsittele sekä tyhjän merkkijonon tapaus (käyttäjä painoi Peruuta InputBoxissa) että vbNo-tapaus (käyttäjä hylkäsi vahvistuksen) poistumalla Subista heti ja näyttämällä viesti, jossa kerrotaan ettei mitään tapahtunut.
  3. Vain jos molemmat tarkistukset menevät läpi, näytä lopuksi MsgBox, jossa lukee "Tässä kohtaa asiakas poistettaisiin."
Vihje
expand arrow

1. Asiakasnumeron hakeminen ja vahvistuksen rakentaminen

  • InputBox tarvitsee kehotteen ja voi ottaa otsikon toisena argumenttina — tallenna palautettu arvo String-muuttujaan.
  • Vahvistusviestiin tulee liittää oikea asiakasnumero yhdistämällä se &-operaattorilla, ei kirjoittaa kiinteänä merkkijonona — muuten viesti näyttäisi aina kirjaimellisesti "[ID]".
  • Kun MsgBox-funktiota käytetään tuloksen tallentamiseen, tarvitaan sulut; yhdistä vbYesNo ja vbQuestion yhteen +-merkillä.

2. Peruuta- ja Ei-tapausten käsittely

  • Tarkista tyhjän merkkijonon tapaus heti InputBox-rivin jälkeen, ennen kuin rakennat vahvistusviestiä — ei ole järkeä kysyä "Poistetaanko asiakas?" jos asiakasnumeroa ei ole annettu.
  • Exit Sub lopettaa toimenpiteen välittömästi missä tahansa kohdassa — käytä sitä suoraan jokaisen If-lohkon sisällä, ja näytä juuri ennen sitä MsgBox, jossa kerrotaan ettei mitään tapahtunut.
  • vbNo-tarkistus tehdään vahvistus-MsgBoxin jälkeen vertaamalla tallennettua tulosta vbNo-vakioon.

3. Lopullinen vahvistus

  • Tämä rivi suoritetaan vain, jos suoritus pääsee siihen asti — koska molemmat aiemmat tarkistukset käyttävät Exit Sub-komentoa epäonnistuessaan, riittää että tämä MsgBox sijoitetaan molempien tarkistusten jälkeen, jotta se suoritetaan vain kun molemmat ovat menneet läpi.
Ratkaisu
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Suorita makro (F5) ja kokeile kaikkia kolmea polkua: paina Peruuta InputBox, paina Ei vahvistuksessa ja lopuksi syötä asiakasnumero ja paina Kyllä — jokaisen pitäisi tuottaa eri kolmesta viestistä.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 1
some-alt