De Kursbestillingsskjema er en enkel form som illustrerer prinsippene for UserForm -design og tilhørende VBA -koding.
Den bruker et utvalg kontroller, inkludert tekstbokser, kombinasjonsbokser, alternativknapper gruppert i en ramme, avmerkingsbokser og kommandoknapper.
Når brukeren klikker på OK -knappen, blir innspillingen angitt i neste tilgjengelige rad i regnearket.
Beskrivelse av Excel -skjema:
Det er to enkle tekstbokser (Navn: og Telefon:) der brukeren kan skrive fri tekst og to kombinasjonsbokser (Avdeling og Kurs) som lar brukeren velge et element fra listen.
Det er tre alternativknapper (Introduksjon, Mellom og Avansert) gruppert i en ramme (Nivå) slik at brukeren bare kan velge ett av alternativene.
Det er to avmerkingsbokser (Lunsj påkrevd og Vegetarisk) at fordi de ikke er gruppert i en ramme, kan begge velges om nødvendig. Men hvis personen som bestiller ikke vil ha lunsj, trenger vi ikke å vite om de er vegetarianere eller ikke. Så Vegetarisk avmerkingsboksen er nedtonet til det er nødvendig.
Det er tre kommandoknapper (OK, Avbryt og Klar form) som hver utfører en forhåndsdefinert funksjon når den klikkes.
Innstillingene for kontrollegenskaper:
Kontroll | Type | Eiendom | Omgivelser |
UserForm | UserForm | Navn | frmCourseBooking |
Bildetekst | Kursbestillingsskjema | ||
Navn | Tekstboks | Navn | txtName |
Telefon | Tekstboks | Navn | txtPhone |
Avdeling | Kombinasjonsboks | Navn | cboDepartment |
Kurs | Kombinasjonsboks | Navn | cboCourse |
Nivå | Ramme | Navn | fraLevel |
Bildetekst | Nivå | ||
Introduksjon | Alternativ -knapp | Navn | optIntroduction |
Mellom | Alternativ -knapp | Navn | optIntermediate |
Avansert | Alternativ -knapp | Navn | optAdvanced |
Lunsj påkrevd | Avmerkingsboks | Navn | chkLunch |
Vegetarisk | Avmerkingsboks | Navn | chkVegetarianer |
Aktivert | Falsk | ||
OK | Kommandoknapp | Navn | cmdOk |
Bildetekst | OK | ||
Misligholde | ekte | ||
Avbryt | Kommandoknapp | Navn | cmdCancel |
Bildetekst | Avbryt | ||
Avbryt | ekte | ||
Klar form | Kommandoknapp | Navn | cmdClearForm |
Opprette skjemaer i Excel
Hvis du vil bygge skjemaet selv, kan du bare kopiere oppsettet som er vist i illustrasjonen ovenfor. Følg trinnene nedenfor:
1. Åpne arbeidsboken du vil at skjemaet skal tilhøre (UserForms som makroer må være vedlagt en arbeidsbok) og bytt til Visual Basic Editor.
2. I Visual Basic Editor klikker du på Sett inn UserForm -knappen (eller gå til Sett inn> UserForm).
3. Hvis verktøykassen ikke vises av seg selv (klikk først på skjemaet for å sikre at den ikke gjemmer seg), klikk på Verktøykasse -knappen (eller gå til Vis> Verktøykasse).
4. For å plassere en kontroll på skjemaet, klikk på den riktige knappen i verktøykassen og klikk deretter på skjemaet. Kontroller kan flyttes ved å dra dem i kantene, eller endre størrelse ved å dra knappene rundt omkretsen.
5. Hvis du vil redigere egenskapene til en kontroll, må du kontrollere at den valgte kontrollen er valgt og deretter gjøre de riktige endringene i Egenskaper vindu. Hvis du ikke kan se egenskapsvinduet, gå til Vis> Egenskaper -vinduet.
6. Hvis du vil fjerne en kontroll fra skjemaet, velger du den og klikker på Slett tasten på tastaturet.
En UserForm vil faktisk ikke gjøre noe før koden som driver skjemaet og dets forskjellige kontroller er opprettet. Det neste trinnet er å skrive koden som driver selve skjemaet.
Legge til koden: 1 Initialiserer skjemaet
Initialiserer skjemaet:
De fleste skjemaer trenger en eller annen form for oppsett når de åpnes. Dette kan være å sette standardverdier, kontrollere at feltet er tomt eller bygge lister over kombinasjonsbokser. Denne prosessen kalles Initialiserer skjemaet og det blir tatt hånd om av en makro som heter UserForm_Initialize (i tilfelle du er forvirret av min varierende skrivemåte for ordet "initialis (z) e", er det fordi jeg snakker engelsk og VBA snakker amerikansk - men ikke bekymre deg, VBA vil stave det for deg!). Slik bygger du koden for å initialisere kursbestillingsskjemaet:
1. For å se skjemaets kodevindu, gå til Vis> Kode eller klikk F7.
2. Når kodevinduet først åpnes, inneholder det et tomt UserForm_Click () fremgangsmåte. Bruk rullegardinlistene øverst i kodevinduet for å velge UserForm og Initialiser. Dette vil opprette prosedyren du trenger. Du kan nå slette UserForm_Click () -prosedyren.
3. Skriv inn følgende kode i prosedyren:
Private Sub UserForm_Initialize () txtName.Value = "" txtPhone.Value = "" With cboDepartment .AddItem "Sales" .AddItem "Marketing" .AddItem "Administration" .AddItem "Design" .AddItem "Advertising" .AddItem "Dispatch". AddItem "Transport" avsluttes med cboDepartment.Value = "" Med cboCourse .AddItem "Access" .AddItem "Excel" .AddItem "PowerPoint" .AddItem "Word" .AddItem "FrontPage" End With cboCourse.Value = "" optIntroduction = True chkLunch = Falsk chkVegetarian = Falsk txtName.SetFocus End Sub
Slik fungerer initialiseringskoden:
Formålet med UserForm_Initialize () -prosedyren er å forberede brukerskjemaet i VBA for bruk, angi standardverdiene for de forskjellige kontrollene og lage listene som kombinasjonsboksene vil vise.
Disse linjene setter innholdet i de to tekstboksene til tomt:
txtName.Value = "" txtPhone.Value = ""
Deretter kommer instruksjonene for kombinasjonsboksene. Først og fremst er innholdet i listen spesifisert, deretter er startverdien til kombinasjonsboksen satt til tom.
Med cboDepartment .AddItem "Salg" .AddItem "Markedsføring" (så mange som nødvendig …) Slutt med
cboDepartment.Value = ""
Om nødvendig kan et første valg gjøres fra opsjonsgruppen, i dette tilfellet:
optIntroduction = True
Begge avmerkingsboksene er satt til False (dvs. ingen hake). Sett til True hvis du vil at avmerkingsboksen skal vises allerede merket:
chkLunch = Falsk
chkVegetarian = Falske
Til slutt fokuseres det på den første tekstboksen. Dette plasserer brukernes markør i tekstboksen slik at de ikke trenger å klikke på boksen før de begynner å skrive:
txtName.SetFocus
Legge til koden: 2 Få knappene til å fungere
Det er tre kommandoknapper på skjemaet, og hver må drives av sin egen prosedyre. Starter med de enkle …
Koding av Avbryt -knappen:
Tidligere brukte vi vinduet Egenskaper til å sette Avbryt egenskapen til Avbryt -knappen til ekte. Når du angir egenskapen Avbryt for en kommandoknapp til True, har dette den virkningen at du klikker på knappen når brukeren trykker på Esc tasten på tastaturet. Men dette alene vil ikke føre til at noe skjer med skjemaet. Du må opprette koden for klikkhendelsen på knappen som i dette tilfellet vil lukke skjemaet. Dette er hvordan:
1. Med UserForm åpen for redigering i Visual Basic Editor, dobbeltklikker du på Avbryt-knappen. Skjemaets kodevindu åpnes med cmdCancel_Click () prosedyre klar for redigering.
2. Koden for å lukke et skjema er veldig enkel. Legg til en kodelinje i prosedyren slik at den ser slik ut:
Private Sub cmdCancel_Click () Unload Me End Sub
Koding av Clear Form -knappen:
Jeg la til en knapp for å fjerne skjemaet i tilfelle brukeren ville ombestemme seg og tilbakestille alt, og for å gjøre det lettere hvis de hadde flere bestillinger om gangen. Alt du trenger å gjøre er å kjøre initialiseringsprosedyren igjen. En makro kan få beskjed om å kjøre en annen makro (eller serie makroer om nødvendig) ved å bruke Anrop søkeord:
1. Dobbeltklikk på knappen Slett skjema. Skjemaets kodevindu åpnes med cmdClearForm_Click () prosedyre klar for redigering.
2. Legg til en kodelinje i prosedyren slik at den ser slik ut:
Private Sub cmdClearForm_Click () Ring UserForm_Initialize Slutt Sub
Koding av OK -knappen:
Dette er koden som må gjøre jobben med å overføre brukerens valg og tekstinndata til regnearket. Når vi angir Avbryt -knappens Avbryt -egenskap til True, setter vi også OK -knappen Misligholde eiendom til ekte. Dette må ved å klikke OK -knappen når brukeren trykker på Tast inn (eller Komme tilbake) på tastaturet (forutsatt at de ikke har brukt sitt Tab tasten for å gå til en annen knapp). Her er koden for å få knappen til å fungere:
1. Dobbeltklikk på OK-knappen. Skjemaets kodevindu åpnes med cmdOK_Click () prosedyre klar for redigering.
2. Rediger prosedyren for å legge til følgende kode:
Private sub cmdOK_Click () ActiveWorkbook.Sheets ("Course Bookings"). Aktiver Range ("A1"). Velg Do If IsEmpty (ActiveCell) = FalseThen ActiveCell.Offset (1, 0) .Velg Slutt hvis loop til IsEmpty (ActiveCell) = True ActiveCell.Value = txtName.Value ActiveCell.Offset (0, 1) = txtPhone.Value ActiveCell.Offset (0, 2) = cboDepartment.Value ActiveCell.Offset (0, 3) = cboCourse.Value Hvis optIntroduction = True Then ActiveCell.Offset (0, 4) .Value = "Intro" ElseIf optIntermediate = True Then ActiveCell.Offset (0, 4) .Value = "Intermed" Else ActiveCell.Offset (0, 4) .Value = "Adv" End If If chkLunch = True Then ActiveCell.Offset (0, 5) .Value = "Yes" Else ActiveCell.Offset (0, 5) .Value = "No" End If If chkVegetarian = True Then ActiveCell.Offset (0, 6). Value = "Yes" Else If chkLunch = False Then ActiveCell.Offset (0, 6) .Value = "" Else ActiveCell.Offset (0, 6) .Value = "No" End If End If Range ("A1"). Velg End Sub
Slik fungerer CmdOK_Click -koden:
De to første linjene sørger for at riktig arbeidsbok er aktiv og flytter markeringen til celle A1:
ActiveWorkbook.Sheets ("Course Bookings"). Aktiver Range ("A1"). Velg De neste linjene flytter markeringen nedover regnearket til den finner en tom celle: Do If IsEmpty (ActiveCell) = False Then ActiveCell.Offset (1 , 0) .Velg Slutt hvis loop til IsEmpty (ActiveCell) = True
De neste fire linjene begynner å skrive innholdet i skjemaet til regnearket, ved hjelp av den aktive cellen (som er i kolonne A) som referanse og beveger seg langs rekken en celle om gangen:
ActiveCell.Value = txtName.Value ActiveCell.Offset (0, 1) = txtPhone.Value ActiveCell.Offset (0, 2) = cboDepartment.Value ActiveCell.Offset (0, 3) = cboCourse.Value
Nå kommer vi til alternativknappene. Disse er plassert i en ramme på skjemaet, slik at brukeren bare kan velge en. En IF -setning brukes til å instruere Excel om hva du skal gjøre for hvert alternativ:
If optIntroduction = True Then ActiveCell.Offset (0, 4) .Value = "Intro" ElseIf optIntermediate = True Then ActiveCell.Offset (0, 4) .Value = "Intermed" Else ActiveCell.Offset (0, 4) .Value = "Adv" End If
VBA IF -setninger er mye lettere å administrere enn Excel's IF -funksjon. Du kan ha så mange alternativer du vil, bare sett inn en ekstra Eller hvis for hver eneste. Hvis det bare var to alternativer, ville du ikke trenge det Eller hvis, bare Hvis og Ellers ville være tilstrekkelig (ikke glem - de trenger alle en Slutt om).
Det er en annen IF -setning for hver avmerkingsboks. For avkrysningsruten Lunsj påkrevd betyr en hake i boksen "Ja" personen krever lunsj, og ingen hake betyr "Nei" de gjør ikke.
If chkLunch = True Then ActiveCell.Offset (0, 5) .Value = "Yes" Else ActiveCell.Offset (0, 5) .Value = "No" End If
Vi kan bruke en lignende IF -setning for Vegetarian -avmerkingsboksen, men hvis personen ikke trenger lunsj, er det irrelevant om de er vegetarianere eller ikke. Jeg ville uansett være feil å anta at de ikke var vegetarianere rett og slett fordi de ikke krevde lunsj. IF -setningen inneholder derfor en andre, nestet if -setning:
If chkVegetarian = True Then ActiveCell.Offset (0, 6) .Value = "Yes" Else If chkLunch = False Then ActiveCell.Offset (0, 6) .Value = "" Else ActiveCell.Offset (0, 6) .Value = "Nei" slutt hvis slutt hvis
Et kryss i boksen betyr "Ja" personen er vegetarianer. Hvis det ikke er merket i boksen, ser den nestede IF -setningen i avmerkingsboksen Lunsj påkrevd. Hvis avmerkingsboksen Lunsj påkrevd har et kryss i, betyr det ikke at det er kryss i Vegetar -avmerkingsboksen at personen ikke er vegetarianer, så det setter "Nei" inn i cellen. Men hvis avmerkingsboksen Lunsj påkrevd ikke har et kryss i den, vet vi ikke om personen er vegetarianer eller ikke (det spiller ingen rolle uansett), så cellen står tom ("").
Til slutt tas valget tilbake til begynnelsen av regnearket, klart for neste oppføring:
Område ("A1"). Velg
Legge til kode 3: manipulere skjemaet
Til slutt et eksempel på hvordan kontrollene på et skjema kan manipuleres mens det er i bruk. Når kontrollegenskapene ble angitt, vil Aktivert egenskapen til Vegetarian -avmerkingsboksen var satt til Falsk. Når en kontroll ikke er aktivert bruker kan ikke legge inn en verdi i den, selv om den kan inneholde en verdi som allerede var der, og VBA kan legge til, fjerne eller endre verdien.
Vi trenger ikke å vite om personen er vegetarianer eller ikke (selv om de er det!) Hvis de ikke bestiller lunsj. Så, avmerkingsboksen Vegetar forblir deaktivert med mindre det er merket av i avkrysningsruten Lunsj påkrevd. Deretter står brukeren fritt til å krysse av for Vegetarian hvis den vil. Hvis de krysser av for det, vet vi at de har svart "Ja", og hvis de ikke vet det, har de svart "Nei".
Vi kan veksle mellom Aktivert eiendom fra Falsk til ekte ved å ha en prosedyre som kjøres automatisk når verdien av avkrysningsruten Lunsj påkrevd endres. Heldigvis har flere kontroller en Endring prosedyren og den vi bruker her er chkLunch_Change (). Vi bruker dette til å aktivere avmerkingsboksen Vegetar når avmerkingsboksen Lunsj påkrevd er merket, og deaktiverer den når avkrysningsruten Lunsj påkrevd ikke er merket.
Det er bare en ting til vi må gjøre. Anta at noen har merket av for Lunsj påkrevd, og også merket av for Vegetarian. Deretter ombestemte de seg og fjernet haken fra avmerkingsboksen Lunsj påkrevd. Den vegetariske avmerkingsboksen ville være deaktivert, men haken som ble satt inn tidligere vil forbli.
En ekstra kodelinje kan sørge for at krysset fjernes når boksen er deaktivert. Her er det hele:
Private Sub chkLunch_Change () If chkLunch = True Then chkVegetarian.Enabled = True Else chkVegetarian.Enabled = False chkVegetarian = False End If End Sub
Åpne skjemaet
Skjemaet er nå klart til bruk, så det må åpnes med en enkel makro. Det kan festes til en egendefinert verktøylinjeknapp, en kommandoknapp tegnet på regnearket eller en hvilken som helst grafikk (høyreklikk på grafikken og velg Tilordne makro). Om nødvendig kan du opprette en ny modul for arbeidsboken og legge til denne prosedyren:
Sub OpenCourseBookingForm () frmCourseBooking.Show End Sub
Hvis du likte bloggene våre, del den med vennene dine på Facebook. Og du kan også følge oss på Twitter og Facebook.
Vi vil gjerne høre fra deg, gi oss beskjed om hvordan vi kan forbedre, utfylle eller innovere arbeidet vårt og gjøre det bedre for deg. Skriv til oss på e -post