Opprette VBA -brukerformer

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

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave