VBA -brugerformularer
Brugerformen er en meget vigtig del af programmeringen i VBA. Det giver dig mulighed for at opbygge en professionel brugergrænseflade til at kommunikere med brugerne af din VBA -applikation. Det giver dig også mulighed for helt at styre brugeren i, hvad de gør ved din projektmappe.
Du kan naturligvis bruge regnearksceller til at acceptere parametre fra brugeren, men brugerformen giver en langt bedre brugeroplevelse.
Ved at udvide højden og bredden på din brugerform til størrelsen på Excel -vinduet kan du få din applikation til at ligne en normal Windows -applikation, idet brugeren er helt uvidende om, at de bruger Excel som vært.
Alle de normale Windows -kontroller, f.eks. Rullemenuer, listefelter, afkrydsningsfelter er tilgængelige for dig. Du har også et stort udvalg af metoder, begivenheder og egenskaber, der skal bruges til at forbedre brugeroplevelsen.
Et vigtigt punkt er, at når du viser en brugerform, der er indbygget eller er modal, kan du ikke redigere din kode i VBE eller få adgang til nogen Excel -funktionalitet. Først når formularen er lukket, vises markøren i din kode.
Indbygget VBA -brugerformularer
Excel VBA som flere indbyggede formularer, der kan bruges til at kommunikere med brugeren.
Beskedboks
Dette er den mest almindeligt anvendte form i VBA. Det viser simpelthen en tekstbesked, muligvis informerer en bruger om, at de har indtastet ugyldigt input, eller at en VBA -proces er færdig med at køre. I deres enkleste form viser de en tekststreng, men du kan også tilføje et ikon, f.eks. Et spørgsmål eller et udråbstegn, og give meddelelsesboksen en anden titel.
Dette er et grundlæggende eksempel. Der er kun en knap at klikke på, og titellinjen siger 'Microsoft Excel'
Koden til at producere dette er meget ligetil:
123 | Sub TestMsgBox ()MsgBox "Denne proces er afsluttet"Afslut Sub |
Du kan bruge forskellige parametre til at tilføje knapper, ikoner og ændre titellinjen
123456789 | Sub TestMsgBox ()Dim Ret som variantRet = MsgBox ("Er du sikker?", VbYesNo Eller vbQuestion, "Min ansøgning")Hvis Ret = vbYes Så'Din proces herAndetAfslut SubAfslut HvisAfslut Sub |
Denne kode tilføjer en "Ja" og "Nej" -knap og et spørgsmålstegnikon og angiver titellinjen. Bemærk, at du kan kombinere typografierne i meddelelsesboksen ved hjælp af operatøren ‘Eller’
Når du returnerer en værdi fra en meddelelsesboks, skal returvariablen også defineres som en variant eller vbMsgBoxResult, og meddelelsesbokssætningen skal bruge parenteser,
Inputboks
Der er en meget enkel inputboks indbygget i VBA, selvom den er ret restriktiv i, hvad du kan gøre med den. Hvis du kan, er det bedre at designe en brugerdefineret brugerform
12345 | Sub TestInputBox ()Dim Ret som strengRet = InputBox ("Indtast venligst dit navn", "Indtast navn")MsgBox RetAfslut Sub |
Du kan også tilføje en standardværdi for input til parametrene.
Få åbent filnavn
Dette giver dig mulighed for at bruge dialogboksen Windows -fil i din VBA -kode. Det ser meget imponerende ud for brugeren, når det kører, men det er meget enkelt at inkorporere, og du får automatisk al fildialogfunktionen med sig.
Koden begrænser brugeren til kun at se Excel -filer. Desværre kunne de indtaste et ikke-Excel-filnavn i feltet Filnavn og klikke på knappen Åbn, så du skal bruge en kode for at sikre, at der er valgt en Excel-fil.
Brug kommandoen 'ChDir' til at ændre standardmappen til dine egne krav, før fildialogen vises
Bemærk brugen af jokertegn i parameteren FileFilter. De Excel -filer, der skal vises, kan være før 2007, have makroer eller være binære, så filteret er '.xls*'.
123456 | Sub TestFileDialog ()Dim MyFile som strengChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Vælg en fil")MsgBox MyFileAfslut Sub |
Hvis det er påkrævet, kan du give brugeren mulighed for at vælge flere filer på én gang ved hjælp af parameteren MultiSelect. Standarden er Falsk (kun enkeltvalg)
12345678 | Sub TestFileDialog ()Dim MyFile som variantChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Vælg en fil",, True)For hver f i min filMsgBox fNæste fAfslut Sub |
Brugeren holder Shift -tasten nede i fildialogen for at vælge flere filer.
For hver sløjfe viser hele stien og navnet på hver valgt fil
Excel -standarddialogbokse
Inden for Excel VBA er der en Dialogs -samling, som du kan bruge til at få vist enhver standard Excel -dialog. Bagsiden er, at du ikke kan få adgang til de parametre, som brugeren har valgt, eller ændre dialogens udseende, men disse dialoger kan være nyttige til at dirigere brugeren til en standard Excel -funktion og give dem mulighed for at vælge bestemte parametre i dialogen.
Et godt eksempel på dette er at vise 'Udskriv' dialog fra VBA:
123 | Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint) .VisAfslut Sub |
Når du åbner parenteserne i Dialogs-samlingen, vil du se en liste over et stort antal konstanter til indbyggede dialoger. Det er værd at eksperimentere med nogle af disse muligheder inden for din kode
Indsættelse af en ny brugerformular
Du kan designe dine egne brugerdefinerede brugerformularer ved at indsætte en brugerformular i Visual Basic Editor (VBE)
Det gør du ved at vælge Indsæt | UserForm på VBE -menulinjen.
Klik på 'UserForm', og en ny blank formular vises, så du kan udvikle den
Selve selve formen (vist som 'UserForm1') ser ganske lille ud, men du kan bruge håndtagene omkring den til at forstørre eller gøre den endnu mindre ved at trække i håndtagene med markøren.
Der er et egenskabsvindue i nederste venstre hjørne af skærmen. Da fokus er direkte på selve formularen, indeholder dette alle egenskaberne for formularen, der er specifik for denne formular.
Bemærk, at når du begynder at tilføje kontroller som kombinationsbokse og kommandoknapper, har disse kontroller alle deres eget sæt egenskaber, og de kan være meget forskellige i, hvad du kan gøre med hver af dem.
De egenskaber, du ser, gælder i øjeblikket kun for selve formularen.
Egenskaben 'Navn' er det navn, der bruges til at definere dit formobjekt i VBA -koden. Du vil måske bruge noget mere meningsfuldt til objektnavnet, så når du gennemgår din kode, er det indlysende, hvilken form der bruges.
Egenskaben 'Navn' vil også afspejle sig til vinduet 'Project Explorer' i øverste venstre hjørne af skærmen
Du vil ændre titellinjen i din formular til noget andet end 'UserForm1', og du kan gøre dette ved at indtaste din nye tekst i egenskaben 'Caption'
Du kan foretage et stort antal ændringer i, hvordan din form ses af brugeren. Du kan ændre farver, tilføje billeder f.eks. et firmalogo, skift position ved hjælp af 'Venstre' og 'Top', ændr størrelsen ved hjælp af 'Højde' og 'Bredde', skift musemarkøren og mange flere
Alle disse egenskaber kan også ændres programmatisk for enhver kontrol, som du har tilføjet til din formular. For eksempel kan en bruger vælge fra en listefeltkontrol, og du vil muligvis deaktivere eller skjule andre kontroller baseret på brugerens valg
Brug af værktøjskassen
Du vil bemærke, at når du klikker på selve formularen, vises en pop-up med værktøjskasse. Hvis du klikker et andet sted f.eks. egenskabsruden, forsvinder den, men vises igen, når du klikker på formularen.
Værktøjskassen giver den virkelige mekanik i formdesignet. Dette giver dig mulighed for at tilføje de normale Windows -kontroller, som brugerne kender til din formular.
Du vil bemærke, at der på formularen er et netværk af prikker. Dette er et 'snapgrid', så når du tilføjer en kontrol til formularen, justerer den automatisk positionen til punkterne og kolonnerne. Dette hjælper enormt med at tilpasse dine kontroller, så du ikke får et ujævnt udseende af kontrollerne
Hvis du klikker på en kontrol, og derefter beslutter dig for ikke at bruge den, vil et klik på ikonet ‘Pil’ i øverste venstre hjørne af værktøjskassen ændre markøren tilbage til normal.
Du kan tilføje yderligere kontrolelementer til værktøjskassen ved hjælp af Værktøjer | Yderligere kontroller i menuen VBE. Der er et betydeligt antal af disse tilgængelige, men afhængigt af dine Windows- og Excel -versioner fungerer de ikke altid, så nogle eksperimenter er ofte påkrævet.
Dine brugere har muligvis ikke adgang til nogle af disse ekstra kontroller eller kører ældre versioner af Windows og Excel, hvilket kan forårsage problemer. I store organisationer, især hvis de er globale, findes der ikke en standard build -pc, som du kan stole på!
Tilføjelse af en udgangsknap til din formular
En kommandoknap er let at tilføje til formularen. Dette ser ud på samme måde som knapper, du ser i andre Windows -formularer, normalt som en 'OK' eller 'Annuller' knap.
Klik på ikonet Kommando -knap i værktøjskassen. Dette er det andet ikon fra venstre i nederste række af ikoner. Se billedet ovenfor. Den har bogstaverne 'ab' på.
Du kan enten holde museknappen nede og trække kontrolelementet ind på din formular, eller du kan flytte markøren til formularen, hvor den ændres til en 'kryds' -markør, og du kan placere og størrelse din knap
Hvis du trækker kontrolelementet til formularen, får du standardstørrelsen på knappen. Ved at flytte markøren til formularen kan du ændre størrelsen på knappen ved at trække "kryds" -markøren hen over din form
Din formular vil nu se sådan ud:
Knappen har standardtekst som billedtekst, men du vil gerne ændre den til dine egne krav. Du kan klikke på teksten inden for knappen ('CommandButton1'), og dette giver dig mulighed for at redigere billedteksten direkte.
Du kan også ændre det i egenskabsvinduet (nederste venstre hjørne af skærmen). Du vil se en ejendom kaldet 'Caption', og du kan redigere værdien for dette. Skift dette til 'Afslut'
Som med formegenskaberne definerer egenskaben ‘Navn’ det navn, der skal bruges i din VBA -kode. Du vil måske bruge et navn, der er mere meningsfuldt og indlysende i din kode. Du kan indtaste dette mod egenskaben ‘Navn’.
Du kan placere knappen igen ved at trække den rundt på formularen, og du kan ændre størrelsen på den ved at klikke på knaphåndtagene (hvide firkantede bokse) og trække i håndtagene for at gøre den større eller mindre
Du kan også ændre størrelsen på knappen ved at ændre højden og bredden i egenskabsvinduet
Du kan se din formular i Excel ved at klikke på den grønne trekant i VBE -værktøjslinjen eller trykke på F5
Du kan kalde din formular fra VBA -kode inden for et modul ved hjælp af 'Vis' -metoden
123 | Sub ShowForm ()UserForm1.ShowAfslut Sub |
Din brugerformular er effektivt et globalt objekt og kan kaldes fra hvor som helst i din kode
I øjeblikket gør din kommandoknap ingenting, fordi der ikke er nogen VBA -kode bag den. Du er nødt til at skrive dette selv! Alt, hvad der kan ske i øjeblikket, er, at du kan klikke på 'Luk' X i øverste højre hjørne af din formular.
For at tilføje VBA -kode skal du dobbeltklikke på knappen på formularen
Dette fører dig til det normale VBA -kodevindue og viser standardhændelsen ved klik.
Du bruger metoden ‘Skjul’ til at lukke formularen, og du kan også tilføje enhver anden kode, f.eks. En meddelelsesboks for at bekræfte, hvad der er sket over for brugeren.
Bemærk, at kodevinduet har to rullelister øverst. Den første giver dig mulighed for at vælge dine formularkontroller, og den anden viser alle de begivenheder, der er tilgængelige for dig at tilføje kode. Den indlysende for en knap er 'Klik' -hændelsen, men der er andre som 'Dobbeltklik' eller 'Musebevægelse'
Når du kører din formular nu, gør knappen faktisk noget. Formularen forsvinder, og der vises en meddelelsesboks, der bekræfter, at formularen er lukket
Du kan naturligvis forstørre exit -koden. Det kan være en god idé at vise en anden formular eller handle på parametre, som brugeren har angivet på din formular
Tilføjelse af en etiketkontrol til en formular
Etiketkontroller er til at bede brugeren om, hvilken slags data de har brug for at indtaste til en kontrol på formularen f.eks. tekstfelt, rulleliste osv. En etiket har som standard ingen grænser, men disse kan tilføjes via egenskabsvinduet, hvis det kræves.
Som kontrol læses de kun for brugeren og er simpelthen en måde at sætte tekst på formularen, uanset om det er en fed overskrift eller en instruktion om, hvad der skal indtastes eller vælges.
For at tilføje en etiket skal du klikke på ikonet ‘A’ i værktøjskassen (øverste række, anden fra venstre) og enten dobbeltklikke på den eller flytte markøren til formularen og vælge position og størrelse.
Ved at bruge egenskaben 'Caption' i egenskabsvinduet eller klikke på etiketkontrollen kan du indtaste teksten til etiketkontrollen.
Bemærk, at teksten vikles i henhold til størrelsen på etiketkontrollen, og hvis tekststrengen er for lang, vises den ikke helt på formularen, så du skal være forsigtig med størrelsen på etiketkontrollen.
Ved hjælp af egenskabsvinduet kan du ændre udseendet af etiketkontrollen med forskellige farver, skrifttyper, rygstil f.eks. hvis det overlejrer et billede, og du vil have det til at være gennemsigtigt
Der skal ikke oprettes nogen kode for en etiketkontrol. Hovedformålet er at tilføje tekst til formularen, så brugeren kan se, hvordan alle de andre kontroller fungerer
Tilføjelse af en tekstkontrol til formularen
En tekstkontrol bruges til at give brugeren mulighed for at indtaste tekst, f.eks. Ved at indtaste et navn eller kommentarer
Tekstkontrollen tilføjes fra værktøjskassen ved at klikke på tekstkontrolikonet (øverste række, tredje fra venstre) og dobbeltklikke eller trække kontrolelementet på plads i din form.
Tekstkontrollen er ofte forvekslet med etiketkontrollen, men tekstkontrollen er den, der bruges til brugerinput
Teksten ‘Indtast dit navn’ er en etiketkontrol, som tidligere beskrevet, og vi har nu en hvid tekstboks klar til, at brugeren kan skrive noget i
Ved hjælp af egenskabsvinduet kan du ændre farver, skrifttyper, specialeffekter eller bruge kodeordstegn i din tekstboks. Enorm fleksibilitet er tilgængelig
En meget vigtig egenskab for en tekstboks er egenskaben ‘MultiLine’. Hvis du vil have brugeren til at indtaste en stor mængde tekst i tekststyringen f.eks. kommentarer, skal egenskaben ‘MultiLine’ sættes til Sand.
Det er en standard på Falsk, hvilket betyder, at uanset hvor stor du laver din tekstboks, forbliver den indtastede tekst på en kontinuerlig linje og ruller ud af tekstboksen. Det vil ikke vikle rundt i kassen.
Der er ingen pop-up, når du højreklikker på din tekstboks, når den kører, men CTRL+V fungerer for Indsæt, og CTRL+C fungerer for Klip, hvis brugeren ønsker at klippe og indsætte tekst til og fra andre applikationer
Igen skal du skrive din egen kode for at håndtere tekst, som brugeren har indtastet. Du vil måske overføre den til en celle i et regneark
Du kan tilføje denne kode til 'Skift' -hændelsen for tekstfeltet
123 | Private Sub TextBox1_Change ()Ark ("Ark1"). Område ("A1"). Værdi = TextBox1.VærdiAfslut Sub |
Du vil måske også indsætte en valideringskode for at kontrollere, at brugeren ikke indtaster affald, hvilket vil have katastrofale virkninger på din applikation
Ændringshændelsen er ikke god til dette, fordi den kaldes hver gang brugeren skriver et nyt tegn. Brugeren kan begynde at skrive en tekststreng og øjeblikkeligt opdage, at de har brudt dine valideringsregler, før de har udfyldt en gyldig tekst.
Du bruger begivenheden 'Afslut'. Dette udløses, når brugeren flytter fokus til en anden kontrol på formularen, hvilket betyder, at brugeren ikke længere indtaster data.
123456 | Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)Hvis IsNull (TextBox1.Value) Eller Len (TextBox1.Value) <4 HerefterMsgBox "Navn er ugyldigt", vbCriticalTextBox1.SetFocusAfslut HvisAfslut Sub |
Når brugeren klikker på en anden kontrol i formularen, testes denne kode for enten en nulværdi i tekstfeltet eller mindre end 4 tegn. Hvis testen er sand, vises der en meddelelsesboks med et kritisk ikon for at informere brugeren om, at navnet er ugyldigt, og fokus flyttes tilbage til den forurettede tekstboks, som brugeren kan rette.
Bemærk, at selvom brugeren klikker på knappen Afslut, udføres tekstboksens afslutningsbegivenhed først, så dette forhindrer brugeren i at forlade uden at korrigere input
Initialiser og aktiver begivenheder på en formular
Når VBA først opretter og bygger en formular, udløser det en 'Initialiser' -hændelse. Fordi formularen også vises på dette tidspunkt, udløser den imidlertid også en 'Aktiver' hændelse. Fra da af, hver gang formularen vises ved hjælp af 'Vis' -metoden, eller den vises som en del af et hierarki af formularer, udløses 'Aktiver' -hændelsen, men ikke 'Initialiser' -hændelsen
Begivenheden 'Initialiser' sker kun én gang, men 'Aktiver' -begivenheden kan ske mange gange
På din formular kan du opsætte standardværdier fra regnearket i inputkontrollerne f.eks. tekstbokse, så disse vises ved første brug af formularen, men brugeren kan overskrive standardværdierne, og disse nye værdier forbliver på plads, så længe koden kører
12345678 | Privat underbrugerForm_Initialize ()TextBox1.Value = Ark ("Ark1"). Område ("A1"). VærdiHvis TextBox1.Value = ”” SåTextBox1.Visible = FalskAndetTextBox1.Visible = TrueAfslut HvisAfslut Sub |
Du kan finde begivenheden 'Initialiser' i den anden rullemenu i kodevinduet og brugerformsnavnet i den første rullemenu.
Denne kode vil bruge værdien i celle A1 på 'Ark1' som standardværdien i tekstboksen, der blev oprettet tidligere i denne artikel. Når formularen vises for første gang, vises standardværdien. Brugeren kan derefter overskrive standardværdien, og denne bevares. Hvis CellA1 er tom, vil tekstboksen blive skjult, ellers er den synlig
Standardværdien kan også være hårdt kodet:
1 | TextBox1.Value = “John Smith” |
Du vil måske også sikre dig, at de værdier, som brugeren har indtastet, vises igen, når brugeren fyrer denne formular op inden for den pågældende Excel-session. VBA-kode kan let skrive værdierne tilbage til celler i projektmappen ved hjælp af 'Exit' -hændelsen på en kontrol, og geninstallere dem ved hjælp af 'Activate' -hændelsen på formularen
123 | Private Sub TextBox1_Exit (ByVal Cancel as MSForms.ReturnBoolean)Ark ("Ark1"). Område ("A10"). Værdi = TextBox1.ValueAfslut Sub |
123 | Privat underbrugerForm_Aktiver ()TextBox1.Value = Ark ("Ark1"). Område ("A10"). VærdiAfslut Sub |
Denne kode vil gøre brugerens værdier vedholdende og også sikre, at de gemmes væk med resten af projektmappen
Gemme din ansøgning og formularer
Når du gemmer din Excel -projektmappe, der indeholder dine formularer, gemmes alle formularerne og deres VBA -kode også. Alle værdier, som formularerne holder, mens de vises, går imidlertid tabt.
Det er vigtigt at skrive kode, så når brugeren forlader projektmappen eller formularen, skrives værdierne tilbage til celler i projektmappen og bevares.
Modale og ikke-modale former
Selve formularen har en egenskab 'Show Modal'. Dette er som standard indstillet til Sand, men det kan ændres til Falsk (ikke-modal)
Hvis en formular er modal, betyder det, at ingen af Excel -funktionaliteten kan tilgås, mens formularen vises. Dette inkluderer din kode i VBE -vinduet. Du kan se koden, men markøren og tastaturet er deaktiveret.
I en ikke-modal form kan du få adgang til alle Excel-funktioner, herunder VBE-vinduet, mens formularen vises.
Dette er vigtigt set fra styring af brugeradfærd
Lukning af en formular
Selvom du skriver din kode for at tvinge brugeren ned ad en bestemt rute, kan de let omgå den ved at klikke på 'Luk' X i øverste højre hjørne af formularen
Du kan forhindre, at dette sker ved at ændre formularen 'QueryClose'
1234 | Privat underbrugerForm_QueryLuk (Annuller som heltal, Luk tilstand som heltal)Annuller = SandtMsgBox "Denne handling er deaktiveret"Afslut Sub |
"QueryClose" -hændelsen udløses, når brugeren klikker på "Luk" X i formularen. Denne kode annullerer handlingen, så brugeren er tvunget til at bruge din 'Afslut' -knap og den kode, du har bag den.
Aktivering og deaktivering af kontrolelementer
Alle kontroller på din formular har en egenskab kaldet 'Aktiveret', som er indstillet til sand eller falsk. Hvis det er Falsk, er kontrollen gråtonet. Det kan ses, men kan ikke bruges.
Der er også en ejendom kaldet 'Synlig', som igen er indstillet til sand eller falsk.
Du kan skrive kode for enten at gøre en bestemt kontrol ubrugelig eller gøre den helt usynlig for brugeren. Ved hjælp af en 'If' -erklæring kan du vælge omstændighederne, når du skal gøre dette
For eksempel kan du deaktivere 'Afslut' -knappen i starten, indtil brugeren har indtastet en værdi i TextBox1 (navn)
123 | Privat underbrugerForm_Initialize ()CommandButton1.Enabled = FalskAfslut Sub |
1234567 | Private Sub TextBox1_Change ()Hvis Len (TextBox1.Value)> 0 SåCommandButton1.Enabled = TrueAndetCommandButton1.Enabled = FalskAfslut HvisAfslut Sub |
Denne kode bruger formularen 'Initialiser' til at deaktivere exit -knappen (kommandoknap 1), når formularen først vises, og derefter bruger den 'Change' -hændelse på TextBox1 (navn) til at aktivere Exit -knappen, hvis noget er blevet indtastet eller deaktiveret det, hvis boksen er tom.
'Skift' -hændelsen udløses, hver gang et nyt tegn indtastes eller slettes fra tekstfeltet. Hvis brugeren forsøger at indtaste tekst for at gøre knappen aktiveret og derefter sletter al teksten, deaktiveres knappen øjeblikkeligt