VBA -brukerformer
Brukerformen er en veldig viktig del av programmeringen i VBA. Den lar deg bygge et profesjonelt brukergrensesnitt for å kommunisere med brukerne av din VBA -applikasjon. Det lar deg også kontrollere brukeren helt i hva de gjør med arbeidsboken din.
Du kan selvfølgelig bruke regnearkceller til å godta parametere fra brukeren, men brukerformen gir en langt bedre brukeropplevelse.
Ved å utvide høyden og bredden på brukerformen til størrelsen på Excel -vinduet, kan du få programmet til å se ut som et vanlig Windows -program, med at brukeren er helt uvitende om at de bruker Excel som vert.
Alle de vanlige Windows -kontrollene, for eksempel rullegardinmenyer, listebokser, avmerkingsbokser, er tilgjengelige for deg. Du har også et stort utvalg av metoder, hendelser og eiendommer du kan bruke for å forbedre brukeropplevelsen.
Et viktig poeng er at når du viser en brukerform som er innebygd eller er modal, kan du ikke redigere koden i VBE eller få tilgang til noen Excel -funksjonalitet. Først når skjemaet er lukket, vil markøren vises i koden din.
Innebygd VBA -brukerformer
Excel VBA som flere innebygde skjemaer som kan brukes til å kommunisere med brukeren.
Meldingsboks
Dette er den mest brukte formen i VBA. Den viser ganske enkelt en tekstmelding, muligens informerer en bruker om at de har angitt ugyldig inndata eller at en VBA -prosess er ferdig med å kjøre. I sin enkleste form viser de en tekststreng, men du kan også legge til et ikon som et spørsmål eller utropstegn, og gi meldingsboksen en annen tittel.
Dette er et grunnleggende eksempel. Det er bare en knapp å klikke på, og tittellinjen sier "Microsoft Excel"
Koden for å produsere dette er veldig grei:
123 | Sub TestMsgBox ()MsgBox "Denne prosessen er fullført"Slutt Sub |
Du kan bruke forskjellige parametere til å legge til knapper, ikoner og endre tittellinjen
123456789 | Sub TestMsgBox ()Dim Ret som variantRet = MsgBox ("Er du sikker?", VbYesNo Eller vbQuestion, "Min søknad")Hvis Ret = vbYes Da'Prosessen din herEllersAvslutt SubSlutt omSlutt Sub |
Denne koden legger til en "Ja" og "Nei" -knapp og et spørsmålstegnikon, og angir tittellinjen. Vær oppmerksom på at du kan kombinere stilene i meldingsboksen ved å bruke "Eller" -operatoren
Når du returnerer en verdi fra en meldingsboks, må returvariabelen også defineres som en variant eller vbMsgBoxResult, og meldingsbokssetningen må bruke parenteser,
Inndataboks
Det er en veldig enkel inndataboks innebygd i VBA, selv om den er ganske restriktiv i hva du kan gjøre med den. Hvis du kan, er det bedre å designe en tilpasset brukerform
12345 | Sub TestInputBox ()Dim Ret As StringRet = InputBox ("Vennligst skriv inn navnet ditt", "Skriv inn navn")MsgBox RetSlutt Sub |
Du kan også legge til en standardverdi for inngangen til parameterne.
Få åpent filnavn
Dette lar deg bruke Windows -fildialogen i VBA -koden. Det ser veldig imponerende ut for brukeren når det kjører, men det er veldig enkelt å inkorporere, og du får automatisk all fildialogfunksjonalitet med seg.
Koden begrenser brukeren til å bare se Excel -filer. Dessverre kan de skrive inn et ikke-Excel-filnavn i Filnavn-boksen og klikke på åpne-knappen, så du trenger litt kode for å sikre at en Excel-fil er valgt.
Bruk kommandoen 'ChDir' for å endre standardkatalogen til dine egne krav før du viser fildialogen
Legg merke til bruken av jokertegn i parameteren FileFilter. Excel -filene som skal vises, kan være før 2007, ha makroer eller være binære, slik at filteret er '.xls*'.
123456 | Sub TestFileDialog ()Dim MyFile As StringChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Velg en fil")MsgBox MyFileSlutt Sub |
Om nødvendig kan du la brukeren velge flere filer samtidig ved å bruke MultiSelect -parameteren. Standard er False (bare enkeltvalg)
12345678 | Sub TestFileDialog ()Dim MyFile Som variantChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Velg en fil",, True)For hver f i min filMsgBox fNeste fSlutt Sub |
Brukeren holder inne Shift -tasten i fildialogboksen for å velge flere filer.
For hver sløyfe viser hele banen og navnet på hver fil som er valgt
Excel -standarddialogbokser
Innen Excel VBA er det en dialogbokssamling som du kan bruke til å vise en standard Excel -dialog. Ulempen er at du ikke får tilgang til parameterne som brukeren har valgt eller endre utseendet på dialogboksen, men disse dialogene kan være nyttige for å lede brukeren til en standard Excel -funksjon, og la dem velge spesifikke parametere i dialogboksen.
Et godt eksempel på dette er å vise "Skriv ut" -dialogboksen fra VBA:
123 | Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint) .VisSlutt Sub |
Når du åpner parentesene i Dialogsamlingen, vil du se en liste over et stort antall konstanter for innebygde dialoger. Det er verdt å eksperimentere med noen av disse alternativene i koden din
Sette inn et nytt brukerskjema
Du kan designe dine egne tilpassede brukerskjemaer ved å sette inn et brukerskjema i Visual Basic Editor (VBE)
Du gjør dette ved å velge Sett inn | UserForm på VBE -menylinjen.
Klikk på 'UserForm', og et nytt blankt skjema vil vises klart for deg å utvikle videre
Selve selve formen (vist som 'UserForm1') ser ganske liten ut, men du kan bruke håndtakene rundt den for å forstørre eller gjøre den enda mindre ved å dra håndtakene med markøren.
Det er et egenskapsvindu i nedre venstre hjørne av skjermen. Siden fokuset er direkte på selve skjemaet, inneholder dette alle egenskapene for skjemaet som er spesifikt for det skjemaet.
Vær oppmerksom på at når du begynner å legge til kontroller som kombinasjonsbokser og kommandoknapper, har disse kontrollene alle sine egne egenskaper, og de kan være veldig forskjellige i hva du kan gjøre med hver av dem.
Eiendommene du ser, gjelder for øyeblikket bare for selve skjemaet.
"Navn" -egenskapen er navnet som brukes til å definere skjemaobjektet i VBA -koden. Det kan være lurt å bruke noe mer meningsfylt for objektnavnet, slik at når du går gjennom koden din, er det åpenbart hvilket skjema som brukes.
"Navn" -egenskapen vil også gjenspeile seg til "Project Explorer" -vinduet i øverste venstre hjørne av skjermen
Du vil endre tittellinjen i skjemaet ditt til noe annet enn 'UserForm1', og du kan gjøre dette ved å skrive inn den nye teksten din i 'Caption' -egenskapen
Du kan gjøre et stort antall endringer i hvordan skjemaet ditt blir sett av brukeren. Du kan endre farger, legge til bilder f.eks. en bedriftslogo, endre posisjonen ved å bruke ‘Venstre’ og ‘Topp’, endre størrelsen med ‘Høyde’ og ‘Bredde’, endre musepekeren og mange flere
Alle disse egenskapene kan også endres programmatisk for enhver kontroll du har lagt til i skjemaet. For eksempel kan en bruker velge fra en listeboks -kontroll, og det kan være lurt å deaktivere eller skjule andre kontroller basert på brukerens valg
Bruke verktøykassen
Du vil legge merke til at når du klikker på selve skjemaet, vises en verktøykasse. Hvis du klikker et annet sted f.eks. Egenskapsruten, vil den forsvinne, men vises igjen når du klikker på skjemaet.
Verktøykassen gir den virkelige mekanikken i skjemautformingen. Dette lar deg legge til de vanlige Windows -kontrollene som brukerne er kjent med i skjemaet ditt.
Du vil legge merke til at det er et nettverk av prikker på skjemaet. Dette er et "snapgrid", slik at når du legger til en kontroll i skjemaet, vil det automatisk justere posisjonen til radene og kolonnene med prikker. Dette hjelper enormt med å justere kontrollene dine slik at du ikke får et ujevnt utseende på kontrollene
Skulle du klikke på en kontroll og deretter bestemme deg for ikke å bruke den, klikker du på "pil" -ikonet i øvre venstre hjørne av verktøykassen for å endre markøren tilbake til normal.
Du kan legge til flere kontroller i verktøykassen ved å bruke Verktøy | Ytterligere kontroller på VBE -menyen. Det er et betydelig antall av disse tilgjengelige, men avhengig av Windows- og Excel -versjoner, fungerer de ikke alltid, så det er ofte nødvendig med noen eksperimenter.
Det kan også hende at brukerne ikke har tilgang til noen av disse tilleggskontrollene eller kjører eldre versjoner av Windows og Excel, noe som kan forårsake problemer. I store organisasjoner, spesielt hvis de er globale, er det ikke noe som kalles en standard build -PC du kan stole på!
Legge til en utgangsknapp i skjemaet ditt
En kommandoknapp er enkel å legge til i skjemaet. Dette ser ut på samme måte som knapper du ser i andre Windows -skjemaer, vanligvis som en "OK" eller "Avbryt" -knapp.
Klikk på kommandoknappikonet i verktøykassen. Dette er det andre ikonet til venstre på den nederste raden med ikoner. Se bildet ovenfor. Den har bokstavene 'ab' på den.
Du kan enten holde museknappen nede og dra kontrollen til skjemaet ditt, eller du kan flytte markøren til skjemaet, der den endres til en "kryss" -markør, og du kan plassere og størrelse knappen
Hvis du drar kontrollen til skjemaet, får du standard størrelse på knappen. Ved å flytte markøren til skjemaet kan du endre størrelsen på knappen ved å dra "kryss" -markøren over skjemaet ditt
Skjemaet ditt vil nå se slik ut:
Knappen vil ha standardtekst som bildetekst, men du vil endre den til dine egne krav. Du kan klikke på teksten i knappen (‘CommandButton1’), og dette lar deg redigere bildeteksten direkte.
Du kan også endre det i egenskapsvinduet (nederste venstre hjørne av skjermen). Du vil se en eiendom som heter ‘Bildetekst’, og du kan redigere verdien for dette. Endre dette til "Avslutt"
Som med skjemaegenskapene, definerer "Navn" -egenskapen navnet som skal brukes i VBA -koden din. Det kan være lurt å bruke et navn som er mer meningsfullt og tydelig i koden din. Du kan angi dette mot "Navn" -egenskapen.
Du kan plassere knappen på nytt ved å dra den rundt på skjemaet, og du kan endre størrelsen på den ved å klikke på knapphåndtakene (hvite firkantede bokser) og dra i håndtakene for å gjøre den større eller mindre
Du kan også endre størrelsen på knappen ved å endre høyden og bredden i egenskapsvinduet
Du kan se skjemaet i Excel ved å klikke på den grønne trekanten på VBE -verktøylinjen, eller trykke på F5
Du kan ringe skjemaet ditt fra VBA -kode i en modul ved å bruke "Vis" -metoden
123 | Sub ShowForm ()UserForm1.ShowSlutt Sub |
Brukerskjemaet ditt er effektivt et globalt objekt og kan kalles fra hvor som helst i koden
For øyeblikket gjør kommandoknappen ingenting fordi det ikke er noen VBA -kode bak. Du må skrive dette selv! Alt som kan skje for øyeblikket er at du kan klikke på 'Lukk' X øverst til høyre i skjemaet.
For å legge til VBA -kode, dobbeltklikker du på knappen på skjemaet
Dette tar deg til det vanlige VBA -kodevinduet, og viser standard klikkhendelse.
Du bruker "Skjul" -metoden for å lukke skjemaet, og du kan også legge til hvilken som helst annen kode, for eksempel en meldingsboks for å bekrefte for brukeren hva som har skjedd.
Vær oppmerksom på at kodevinduet har to nedtrekkslinjer øverst. Den første lar deg velge skjemakontroller, og den andre viser alle hendelsene som er tilgjengelige for å legge til kode. Den åpenbare for en knapp er "Klikk" -hendelsen, men det er andre som "Dobbeltklikk" eller "Musebevegelse"
Når du kjører skjemaet ditt nå, gjør knappen faktisk noe. Skjemaet forsvinner, og en meldingsboks vises som bekrefter at skjemaet er lukket
Du kan selvfølgelig forstørre utgangskoden. Det kan være lurt å vise et annet skjema, eller iverksette tiltak på parametere som brukeren har angitt på skjemaet ditt
Legge til en etikettkontroll i et skjema
Etikettkontroller er for å spørre brukeren om hva slags data de trenger for å legge inn en kontroll på skjemaet, f.eks. tekstboks, rullegardinmeny, etc. En etikett har som standard ingen grenser, men disse kan legges til via egenskapsvinduet om nødvendig.
Som en kontroll blir de bare lest for brukeren og er ganske enkelt en måte å sette tekst på skjemaet på, enten det er en fet overskrift, eller en instruksjon om hva du skal skrive inn eller velge.
For å legge til en etikett, klikk på ‘A’ -ikonet i verktøykassen (øverste rad, andre fra venstre) og dobbeltklikk på den eller flytt markøren til skjemaet og velg posisjon og størrelse.
Ved å bruke egenskapen "Bildetekst" i vinduet for egenskaper, eller klikke på etikettkontrollen, kan du skrive inn teksten for etikettkontrollen.
Vær oppmerksom på at teksten vil pakkes inn i henhold til størrelsen på etikettkontrollen, og hvis tekststrengen er for lang, vil den ikke vises helt på skjemaet, så du må være forsiktig med størrelsen på etikettkontrollen.
Ved å bruke egenskapsvinduet kan du endre utseendet på etikettkontrollen, med forskjellige farger, fonter, ryggstil f.eks. hvis det overlapper et bilde og du vil at det skal være gjennomsiktig
Ingen kode må opprettes for en etikettkontroll. Hovedformålet er å legge til tekst i skjemaet slik at brukeren kan se hvordan alle de andre kontrollene fungerer
Legge til en tekstkontroll i skjemaet
En tekstkontroll brukes for å la brukeren legge inn tekst, f.eks. Ved å skrive inn et navn eller kommentarer
Tekstkontrollen legges til fra verktøykassen ved å klikke på tekstkontrollikonet (øverste rad, tredje fra venstre) og dobbeltklikke eller dra kontrollen til posisjon på skjemaet.
Tekstkontrollen forveksles ofte med etikettkontrollen, men tekstkontrollen er den for brukerinndata
Teksten "Skriv inn navnet ditt" er en etikettkontroll, som tidligere beskrevet, og vi har nå en hvit tekstboks klar for brukeren å skrive inn noe i
Ved å bruke vinduet Egenskaper kan du endre farger, fonter, spesialeffekter eller bruke passordtegn for tekstboksen. Enorm fleksibilitet er tilgjengelig
En veldig viktig egenskap for en tekstboks er “MultiLine” -egenskapen. Hvis du vil at brukeren skal legge inn en stor mengde tekst i tekstkontrollen f.eks. kommentarer, må egenskapen ‘MultiLine’ settes til True.
Det er en standard på Falsk, noe som betyr at uansett hvor stor du lager tekstboksen din, vil teksten du skriver inn forbli på en kontinuerlig linje og vil rulle ut av tekstboksen. Det vil ikke vikle seg rundt i esken.
Det er ingen popup-vindu når du høyreklikker på tekstboksen når den kjører, men CTRL+V fungerer for Lim inn, og CTRL+C fungerer for Klipp hvis brukeren ønsker å klippe og lime inn tekst til og fra andre applikasjoner
Igjen må du skrive din egen kode for å håndtere tekst som brukeren har skrevet inn. Det kan være lurt å overføre den til en celle i et regneark
Du kan legge til denne koden i "Endre" -hendelsen for tekstboksen
123 | Private Sub TextBox1_Change ()Ark ("Ark1"). Område ("A1"). Verdi = TextBox1.ValueSlutt Sub |
Det kan også være lurt å legge inn en valideringskode for å kontrollere at brukeren ikke skriver inn søppel som vil ha katastrofale effekter på søknaden din
Endringshendelsen er ikke bra for dette fordi det kalles hver gang brukeren skriver inn et nytt tegn. Brukeren kan begynne å skrive en tekststreng og umiddelbart finne at de har brutt valideringsreglene dine før de har fullført en gyldig tekst.
Du bruker hendelsen "Avslutt". Dette utløses når brukeren flytter fokuset til en annen kontroll på skjemaet, noe som betyr at brukeren ikke lenger legger inn data.
123456 | Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)Hvis IsNull (TextBox1.Value) Eller Len (TextBox1.Value) <4MsgBox "Navnet er ugyldig", vbCriticalTextBox1.SetFocusSlutt omSlutt Sub |
Når brukeren klikker på en annen kontroll i skjemaet, tester denne koden enten en nullverdi i tekstboksen eller mindre enn 4 tegn. Hvis testen er sann, vises det en meldingsboks med et kritisk ikon som informerer brukeren om at navnet er ugyldig, og fokuset flyttes tilbake til den krenkende tekstboksen som brukeren kan rette.
Vær oppmerksom på at selv om brukeren klikker på Avslutt -knappen, vil tekstboksen avslutte hendelsen utføres først, så dette forhindrer at brukeren går ut uten å korrigere inngangen
Initialiser og aktiver hendelser på et skjema
Når VBA først oppretter og bygger et skjema, utløser det en 'Initialiser' -hendelse. Fordi skjemaet også vises på dette tidspunktet, utløser det imidlertid også en "Aktiver" -hendelse. Fra da av, hver gang skjemaet vises med "Vis" -metoden eller det vises som en del av et hierarki av skjemaer, blir aktiviteten "Aktiver" utløst, men ikke "Initialiser" -hendelsen
"Initialiser" -hendelsen skjer bare en gang, men "Aktiver" -hendelsen kan skje mange ganger
På skjemaet ditt kan det være lurt å sette opp standardverdier fra regnearket i inngangskontrollene f.eks. tekstbokser, slik at disse vises ved første bruk av skjemaet, men brukeren kan overskrive standardinnstillingene, og disse nye verdiene forblir på plass så lenge koden kjører
12345678 | Private Sub UserForm_Initialize ()TextBox1.Value = Ark ("Ark1"). Område ("A1"). VerdiHvis TextBox1.Value = ”” DaTextBox1.Visible = FalseEllersTextBox1.Visible = TrueSlutt omSlutt Sub |
Du finner hendelsen ‘Initialiser’ i den andre rullegardinmenyen i kodevinduet, og brukerformsnavnet i den første rullegardinmenyen.
Denne koden bruker verdien i celle A1 på "Ark1" som standardverdi i tekstboksen som ble opprettet tidligere i denne artikkelen. Når skjemaet vises for første gang, vises standardverdien. Brukeren kan deretter overskrive standardverdien, og denne beholdes. Hvis CellA1 er tom, vil tekstboksen være skjult, ellers vil den være synlig
Standardverdien kan også være hardkodet:
1 | TextBox1.Value = “John Smith” |
Det kan også være lurt å sørge for at verdiene som brukeren har angitt, vises igjen når brukeren fyrer opp skjemaet i den aktuelle Excel-økten. VBA-koden kan enkelt skrive verdiene tilbake til cellene i arbeidsboken ved hjelp av "Avslutt" -hendelsen på en kontroll, og installere dem på nytt ved hjelp av "Aktiver" -hendelsen på skjemaet
123 | Private Sub TextBox1_Exit (ByVal Cancel as MSForms.ReturnBoolean)Ark ("Ark1"). Område ("A10"). Verdi = TextBox1.ValueSlutt Sub |
123 | Privat underbrukerForm_Aktiver ()TextBox1.Value = Ark ("Ark1"). Område ("A10"). VerdiSlutt Sub |
Denne koden vil gjøre brukerens verdier vedvarende og også sikre at de blir lagret med resten av arbeidsboken
Lagre søknaden og skjemaene
Når du lagrer Excel -arbeidsboken som inneholder skjemaene dine, lagres også alle skjemaene og deres VBA -kode. Eventuelle verdier som skjemaene holder mens de vises, går imidlertid tapt.
Det er viktig å skrive kode slik at når brukeren går ut av arbeidsboken, eller skjemaet, blir verdiene skrevet tilbake til cellene i arbeidsboken, og slik blir de bevart.
Modal og Non-Modal Forms
Selve skjemaet har en egenskap "Show Modal". Dette er som standard satt til True, men det kan endres til False (ikke-modalt)
Hvis et skjema er modalt, betyr det at ingen av Excel -funksjonaliteten kan nås mens skjemaet vises. Dette inkluderer koden din i VBE -vinduet. Du kan se koden, men markøren og tastaturet er deaktivert.
I et ikke-modalt skjema kan du få tilgang til all Excel-funksjonalitet, inkludert VBE-vinduet, mens skjemaet vises.
Dette er viktig med tanke på å kontrollere brukeratferd
Lukker et skjema
Selv om du skriver koden din for å tvinge brukeren ned en bestemt rute, kan de enkelt omgå den ved å klikke på 'Lukk' X øverst til høyre i skjemaet
Du kan forhindre at dette skjer ved å endre "QueryClose" -hendelsen i skjemaet
1234 | Private Sub UserForm_QueryClose (Avbryt som heltall, Lukkemodus som heltall)Avbryt = santMsgBox "Denne handlingen er deaktivert"Slutt Sub |
"QueryClose" -hendelsen utløses når brukeren klikker på "Lukk" X i skjemaet. Denne koden avbryter handlingen, så brukeren blir tvunget til å bruke "Avslutt" -knappen og koden du har bak den.
Aktivere og deaktivere kontroller
Alle kontroller på skjemaet ditt har en egenskap som heter 'Aktivert' som er satt til Sant eller usant. Hvis det er Falsk, er kontrollen gråtonet. Den kan sees, men kan ikke brukes.
Det er også en egenskap som heter ‘Synlig’ som igjen er satt til Sant eller usant.
Du kan skrive kode for enten å gjøre en bestemt kontroll ubrukelig, eller for å gjøre den helt usynlig for brukeren. Ved å bruke en "If" -erklæring, kan du velge omstendighetene når du trenger å gjøre dette
For eksempel kan du deaktivere "Avslutt" -knappen først, til brukeren har angitt en verdi i TextBox1 (navn)
123 | Private Sub UserForm_Initialize ()CommandButton1.Enabled = FalseSlutt Sub |
1234567 | Private Sub TextBox1_Change ()Hvis Len (TextBox1.Value)> 0 DaCommandButton1.Enabled = TrueEllersCommandButton1.Enabled = FalseSlutt omSlutt Sub |
Denne koden bruker skjemaet "Initialiser" -hendelse for å deaktivere exit -knappen (Kommando -knapp 1) når skjemaet først vises, og deretter bruker du "Endre" -hendelsen på TextBox1 (navn) for å aktivere Exit -knappen hvis noe er skrevet inn eller deaktivert det hvis boksen er tom.
"Endre" -hendelsen utløses hver gang et nytt tegn skrives inn eller slettes fra tekstboksen. Hvis brukeren prøver å skrive inn tekst for å gjøre knappen aktivert, og deretter sletter all teksten, blir knappen umiddelbart deaktivert