Introduction to UserForms
Pyyhkäise näyttääksesi valikon
UserForm-lomakkeiden toiminnallisuus on rajoitettua tai puuttuu kokonaan Excel for Macissa — VBA IDE Macilla ei tue UserForm-lomakkeiden suunnittelua täysimääräisesti monissa versioissa, mikä voi aiheuttaa juuri tällaisia selittämättömiä ongelmia.
MsgBox ja InputBox soveltuvat yksinkertaisiin kyllä/ei-kysymyksiin ja yhden rivin vastauksiin, mutta asiakkaan lisääminen vaatii usein useita kenttiä kerralla — esimerkiksi yrityksen nimi, yhteyshenkilö, kaupunki, tila. Tätä varten käytetään UserForm-lomaketta: pieni mukautettu ikkuna, jossa on omat otsikot, tekstikentät, pudotusvalikot ja painikkeet, jotka rakennetaan VBE:ssä ja joita ohjataan kokonaan omalla koodilla.
Lomakkeen luominen
VBE:ssä napsauta hiiren oikealla projektiasi Project Explorerissa ja valitse Insert → UserForm. Näytölle ilmestyy tyhjä suunnittelupinta sekä kelluva työkalupakki, josta voit vetää ohjausobjekteja lomakkeelle.
Tunnisteet, tekstikentät, yhdistelmäruudut ja painikkeet
Jokainen ohjausobjekti, jonka vedät lomakkeelle, saa oletusnimen kuten TextBox1 tai CommandButton1 — toimiva, mutta merkityksetön, kun lomakkeella on kuusi tai seitsemän ohjausobjektia. Tärkein tapa tässä osiossa näkyy Ominaisuudet-ikkunassa: nimeä jokainen ohjausobjekti välittömästi lisäämisen jälkeen lyhyellä etuliitteellä ja kuvaavalla nimellä (esim. txt tekstikentälle (TextBox), cbo yhdistelmäruudulle (ComboBox), cmd painikkeelle (CommandButton), opt valintapainikkeelle (OptionButton), chk valintaruudulle (CheckBox), lst luetteloruudulle (ListBox)). txtCompanyName on koodissa yksiselitteinen vielä kolmen viikon päästäkin; TextBox1 ei ole.
Tunnisteet ovat tavallisia, ei-interaktiivisia tekstikuvauksia ("Yrityksen nimi:") — käyttäjä näkee ne, mutta ei voi kirjoittaa niihin tai klikata niitä. Tekstikenttiin kirjoitetaan vapaamuotoista tekstiä. Yhdistelmäruudut tarjoavat avattavan valikon vaihtoehdoista, mikä on juuri cboCity- ja cboStatus-kenttien tarkoitus — rajoittaa Kaupunki ja Tila tunnettuun listaan sen sijaan, että käyttäjä voisi kirjoittaa "chicago", "Chicago,IL" ja "CHI" eri muodoissa eri tietueisiin.
Koodin kirjoittaminen lomakkeen taakse
Kaksoisnapsauta mitä tahansa ohjausobjektia suunnittelunäkymässä siirtyäksesi suoraan sen koodiin — VBA luo automaattisesti tapahtumakäsittelijän nimellä ControlName_EventName, ja kirjoittamalla koodia sen sisään varmistat, että koodi suoritetaan aina, kun kyseinen tapahtuma tapahtuu kyseiselle ohjausobjektille. Painikkeen oletustapahtuma on Click:
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
UserForm_Initialize on erityinen tapahtumakäsittelijä, joka käynnistyy automaattisesti heti, kun lomake ladataan — ennen kuin käyttäjä näkee mitään — joten se on oikea paikka täyttää ComboBoxit .AddItem-komennolla sen sijaan, että syöttäisit vaihtoehdot Properties-ikkunaan käsin, erityisesti silloin kun vaihtoehdot voivat muuttua tai tulla laskentataulukosta. Unload Me komennossa cmdCancel_Click sulkee lomakkeen kokonaan; Me viittaa aina siihen lomakkeeseen, jonka sisällä koodi parhaillaan suoritetaan, joten tämä rivi toimii sellaisenaan riippumatta siitä, mihin nimeen lomake myöhemmin muutetaan.
Esimerkkitapaus: Uuden asiakkaan tallentaminen
Tämä on Save-painikkeen taustalla oleva proseduuri — se, joka todella kirjoittaa uuden rivin tblCustomers-tauluun:
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
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
- Komento
tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")ulottuu lomakkeelta takaisin työkirjaan — UserForm on vain toinen koodin osa, joten kaikki ListObjecteihin liittyvä pätee siihen sellaisenaan; tbl.ListRows.Addlisää aidosti uuden rivin taulukon sisälle sen rajojen mukaisesti sen sijaan, että kirjoitettaisiin viimeisen käytetyn solun ohi käsin;txtCompanyName.Value,cboCity.Valueja muut lukevat sen, mitä käyttäjä on sillä hetkellä kirjoittanut tai valinnut kyseisessä ohjausobjektissa —.Valueon yleinen lähes kaikille ohjausobjekteille, minkä vuoksi sama toimintamalli toimii sekä TextBoxeille että ComboBoxeille;- Luotu asiakasnumero on yksinkertaistettu esimerkkiä varten — todellinen tunnisteen luonti vaatisi aukkojen ja uudelleenkäytettyjen tunnisteiden tarkistamista, mitä tämä rivi ei tee;
- Unload Me lopussa sulkee lomakkeen vasta, kun rivi on kirjoitettu — jos lomake suljettaisiin aiemmin,
txtCompanyName.Valueja muiden ohjausobjektien arvot eivät olisi enää luettavissa, koska ohjausobjektit lakkaavat olemasta lomakkeen sulkeuduttua.
Lomakkeen "Yrityksen nimi" -otsikko on vain käyttäjäystävällisempi nimi taulukon Customer-sarakkeelle — koodi kirjoittaa txtCompanyName.Value kyseiseen sarakkeeseen otsikosta riippumatta, koska VBA:ssa vain TextBoxin nimi on merkityksellinen, ei sen näytöllä näkyvä otsikko.
Customer ID ei ole lomakkeella, koska se luodaan automaattisesti koodilla ("C0" & (tbl.ListRows.Count + 100)), eikä käyttäjä syötä sitä itse — tämä vastaa todellisten järjestelmien toimintaa, joissa uudet tunnisteet numeroidaan automaattisesti sen sijaan, että käyttäjä valitsisi yksilöllisen tunnisteen.
Tehtävä
- Lisää uusi UserForm, nimeä se
frmAddCustomer, ja lisää kolme TextBoxia (txtCompanyName,txtContact,txtEmail) sekä kaksi ComboBoxia (cboCity, cboStatus), jokaiselle oma Label. - Lisää kaksi CommandButtonia,
cmdSavejacmdCancel, ja kirjoitaUserForm_Initialize- jacmdCancel_Click-proseduurit täsmälleen ohjeen mukaan. - Kirjoita
cmdSave_Clickannetun esimerkin mukaisesti ja lisää tilapäinen painike muualle työkirjaan koodillafrmAddCustomer.Showtestataksesi lomakkeen avaamista. - Täytä lomake kuvitteelliselle kuudennelle asiakkaalle ja napsauta Tallenna — varmista, että tblCustomers-tauluun ilmestyy uusi rivi syöttämilläsi arvoilla.
1. Lomakkeen rakentaminen
- Lisää → UserForm VBE:ssä, nimeä se sitten uudelleen Ominaisuudet-ikkunan
(Name)-kentässä nimelläfrmAddCustomer— älä Caption-kentässä, joka muuttaa vain otsikkopalkin tekstin. - Vedä yksi Label + yksi TextBox -pari kullekin: Yrityksen nimi, Yhteyshenkilö ja Sähköposti; yksi Label + yksi ComboBox -pari Kaupunki ja Tila -kentille.
- Nimeä jokainen ohjausobjekti heti lisäämisen jälkeen — tämä on tapa, jota kappale korosti. Labeleille ei tarvitse antaa koodiin sopivia nimiä, koska niitä ei viitata koodissa, mutta jokainen TextBox/ComboBox/Painike tarvitsee.
2. UserForm_Initialize ja cmdCancel_Click
- Kaksoisnapsauta lomakkeen tyhjää taustaa (ei ohjausobjektia) päästäksesi
UserForm_Initialize-menetelmään — kaksoisnapsauttamallacmdCancelpääset suoraancmdCancel_Click-menetelmään. - Molemmat proseduurit annettiin sinulle täsmälleen kappaleessa — kirjoita ne muuttamatta.
3. Testaus väliaikaisella painikkeella
- Tämän painikkeen ei tarvitse olla lomakkeella — lisää se mille tahansa laskentataulukolle kohdasta Kehittäjä → Lisää → Painike (Lomakeohjaus), tai suorita yksirivinen
SubVBE:stä ilman laskentataulukon painiketta. frmAddCustomer.Showon koko koodi lomakkeen näyttämiseen.
4. Koko tallennuksen testaus
- Täytä kaikki kentät ja valitse arvot molemmista pudotusvalikoista ennen Tallenna-painikkeen painamista — tyhjä ComboBox-valinta kirjoittaa tyhjän solun.
- Tarkista
tblCustomersjälkeenpäin, että uusi rivi, jossa onC00x-tyylinen ID, on lisätty.
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
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
Testataksesi tämän, suorita tämä mistä tahansa tavallisesta moduulista (ei UserFormin omasta koodista):
Sub ShowAddCustomerForm()
frmAddCustomer.Show
End Sub
Paina F5, kun kohdistin on ShowAddCustomerForm-aliohjelman sisällä — lomakkeen pitäisi avautua, ja sen täyttäminen ja Tallenna-painikkeen painaminen lisää uuden rivin tblCustomers-taulukkoon.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Introduction to UserForms
UserForm-lomakkeiden toiminnallisuus on rajoitettua tai puuttuu kokonaan Excel for Macissa — VBA IDE Macilla ei tue UserForm-lomakkeiden suunnittelua täysimääräisesti monissa versioissa, mikä voi aiheuttaa juuri tällaisia selittämättömiä ongelmia.
MsgBox ja InputBox soveltuvat yksinkertaisiin kyllä/ei-kysymyksiin ja yhden rivin vastauksiin, mutta asiakkaan lisääminen vaatii usein useita kenttiä kerralla — esimerkiksi yrityksen nimi, yhteyshenkilö, kaupunki, tila. Tätä varten käytetään UserForm-lomaketta: pieni mukautettu ikkuna, jossa on omat otsikot, tekstikentät, pudotusvalikot ja painikkeet, jotka rakennetaan VBE:ssä ja joita ohjataan kokonaan omalla koodilla.
Lomakkeen luominen
VBE:ssä napsauta hiiren oikealla projektiasi Project Explorerissa ja valitse Insert → UserForm. Näytölle ilmestyy tyhjä suunnittelupinta sekä kelluva työkalupakki, josta voit vetää ohjausobjekteja lomakkeelle.
Tunnisteet, tekstikentät, yhdistelmäruudut ja painikkeet
Jokainen ohjausobjekti, jonka vedät lomakkeelle, saa oletusnimen kuten TextBox1 tai CommandButton1 — toimiva, mutta merkityksetön, kun lomakkeella on kuusi tai seitsemän ohjausobjektia. Tärkein tapa tässä osiossa näkyy Ominaisuudet-ikkunassa: nimeä jokainen ohjausobjekti välittömästi lisäämisen jälkeen lyhyellä etuliitteellä ja kuvaavalla nimellä (esim. txt tekstikentälle (TextBox), cbo yhdistelmäruudulle (ComboBox), cmd painikkeelle (CommandButton), opt valintapainikkeelle (OptionButton), chk valintaruudulle (CheckBox), lst luetteloruudulle (ListBox)). txtCompanyName on koodissa yksiselitteinen vielä kolmen viikon päästäkin; TextBox1 ei ole.
Tunnisteet ovat tavallisia, ei-interaktiivisia tekstikuvauksia ("Yrityksen nimi:") — käyttäjä näkee ne, mutta ei voi kirjoittaa niihin tai klikata niitä. Tekstikenttiin kirjoitetaan vapaamuotoista tekstiä. Yhdistelmäruudut tarjoavat avattavan valikon vaihtoehdoista, mikä on juuri cboCity- ja cboStatus-kenttien tarkoitus — rajoittaa Kaupunki ja Tila tunnettuun listaan sen sijaan, että käyttäjä voisi kirjoittaa "chicago", "Chicago,IL" ja "CHI" eri muodoissa eri tietueisiin.
Koodin kirjoittaminen lomakkeen taakse
Kaksoisnapsauta mitä tahansa ohjausobjektia suunnittelunäkymässä siirtyäksesi suoraan sen koodiin — VBA luo automaattisesti tapahtumakäsittelijän nimellä ControlName_EventName, ja kirjoittamalla koodia sen sisään varmistat, että koodi suoritetaan aina, kun kyseinen tapahtuma tapahtuu kyseiselle ohjausobjektille. Painikkeen oletustapahtuma on Click:
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
UserForm_Initialize on erityinen tapahtumakäsittelijä, joka käynnistyy automaattisesti heti, kun lomake ladataan — ennen kuin käyttäjä näkee mitään — joten se on oikea paikka täyttää ComboBoxit .AddItem-komennolla sen sijaan, että syöttäisit vaihtoehdot Properties-ikkunaan käsin, erityisesti silloin kun vaihtoehdot voivat muuttua tai tulla laskentataulukosta. Unload Me komennossa cmdCancel_Click sulkee lomakkeen kokonaan; Me viittaa aina siihen lomakkeeseen, jonka sisällä koodi parhaillaan suoritetaan, joten tämä rivi toimii sellaisenaan riippumatta siitä, mihin nimeen lomake myöhemmin muutetaan.
Esimerkkitapaus: Uuden asiakkaan tallentaminen
Tämä on Save-painikkeen taustalla oleva proseduuri — se, joka todella kirjoittaa uuden rivin tblCustomers-tauluun:
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
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
- Komento
tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")ulottuu lomakkeelta takaisin työkirjaan — UserForm on vain toinen koodin osa, joten kaikki ListObjecteihin liittyvä pätee siihen sellaisenaan; tbl.ListRows.Addlisää aidosti uuden rivin taulukon sisälle sen rajojen mukaisesti sen sijaan, että kirjoitettaisiin viimeisen käytetyn solun ohi käsin;txtCompanyName.Value,cboCity.Valueja muut lukevat sen, mitä käyttäjä on sillä hetkellä kirjoittanut tai valinnut kyseisessä ohjausobjektissa —.Valueon yleinen lähes kaikille ohjausobjekteille, minkä vuoksi sama toimintamalli toimii sekä TextBoxeille että ComboBoxeille;- Luotu asiakasnumero on yksinkertaistettu esimerkkiä varten — todellinen tunnisteen luonti vaatisi aukkojen ja uudelleenkäytettyjen tunnisteiden tarkistamista, mitä tämä rivi ei tee;
- Unload Me lopussa sulkee lomakkeen vasta, kun rivi on kirjoitettu — jos lomake suljettaisiin aiemmin,
txtCompanyName.Valueja muiden ohjausobjektien arvot eivät olisi enää luettavissa, koska ohjausobjektit lakkaavat olemasta lomakkeen sulkeuduttua.
Lomakkeen "Yrityksen nimi" -otsikko on vain käyttäjäystävällisempi nimi taulukon Customer-sarakkeelle — koodi kirjoittaa txtCompanyName.Value kyseiseen sarakkeeseen otsikosta riippumatta, koska VBA:ssa vain TextBoxin nimi on merkityksellinen, ei sen näytöllä näkyvä otsikko.
Customer ID ei ole lomakkeella, koska se luodaan automaattisesti koodilla ("C0" & (tbl.ListRows.Count + 100)), eikä käyttäjä syötä sitä itse — tämä vastaa todellisten järjestelmien toimintaa, joissa uudet tunnisteet numeroidaan automaattisesti sen sijaan, että käyttäjä valitsisi yksilöllisen tunnisteen.
Tehtävä
- Lisää uusi UserForm, nimeä se
frmAddCustomer, ja lisää kolme TextBoxia (txtCompanyName,txtContact,txtEmail) sekä kaksi ComboBoxia (cboCity, cboStatus), jokaiselle oma Label. - Lisää kaksi CommandButtonia,
cmdSavejacmdCancel, ja kirjoitaUserForm_Initialize- jacmdCancel_Click-proseduurit täsmälleen ohjeen mukaan. - Kirjoita
cmdSave_Clickannetun esimerkin mukaisesti ja lisää tilapäinen painike muualle työkirjaan koodillafrmAddCustomer.Showtestataksesi lomakkeen avaamista. - Täytä lomake kuvitteelliselle kuudennelle asiakkaalle ja napsauta Tallenna — varmista, että tblCustomers-tauluun ilmestyy uusi rivi syöttämilläsi arvoilla.
1. Lomakkeen rakentaminen
- Lisää → UserForm VBE:ssä, nimeä se sitten uudelleen Ominaisuudet-ikkunan
(Name)-kentässä nimelläfrmAddCustomer— älä Caption-kentässä, joka muuttaa vain otsikkopalkin tekstin. - Vedä yksi Label + yksi TextBox -pari kullekin: Yrityksen nimi, Yhteyshenkilö ja Sähköposti; yksi Label + yksi ComboBox -pari Kaupunki ja Tila -kentille.
- Nimeä jokainen ohjausobjekti heti lisäämisen jälkeen — tämä on tapa, jota kappale korosti. Labeleille ei tarvitse antaa koodiin sopivia nimiä, koska niitä ei viitata koodissa, mutta jokainen TextBox/ComboBox/Painike tarvitsee.
2. UserForm_Initialize ja cmdCancel_Click
- Kaksoisnapsauta lomakkeen tyhjää taustaa (ei ohjausobjektia) päästäksesi
UserForm_Initialize-menetelmään — kaksoisnapsauttamallacmdCancelpääset suoraancmdCancel_Click-menetelmään. - Molemmat proseduurit annettiin sinulle täsmälleen kappaleessa — kirjoita ne muuttamatta.
3. Testaus väliaikaisella painikkeella
- Tämän painikkeen ei tarvitse olla lomakkeella — lisää se mille tahansa laskentataulukolle kohdasta Kehittäjä → Lisää → Painike (Lomakeohjaus), tai suorita yksirivinen
SubVBE:stä ilman laskentataulukon painiketta. frmAddCustomer.Showon koko koodi lomakkeen näyttämiseen.
4. Koko tallennuksen testaus
- Täytä kaikki kentät ja valitse arvot molemmista pudotusvalikoista ennen Tallenna-painikkeen painamista — tyhjä ComboBox-valinta kirjoittaa tyhjän solun.
- Tarkista
tblCustomersjälkeenpäin, että uusi rivi, jossa onC00x-tyylinen ID, on lisätty.
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
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
Testataksesi tämän, suorita tämä mistä tahansa tavallisesta moduulista (ei UserFormin omasta koodista):
Sub ShowAddCustomerForm()
frmAddCustomer.Show
End Sub
Paina F5, kun kohdistin on ShowAddCustomerForm-aliohjelman sisällä — lomakkeen pitäisi avautua, ja sen täyttäminen ja Tallenna-painikkeen painaminen lisää uuden rivin tblCustomers-taulukkoon.
Kiitos palautteestasi!