Skapa VBA -användarformulär

VBA -användarformulär

Användarformen är en mycket viktig del av programmeringen i VBA. Det låter dig bygga ett professionellt användargränssnitt för att kommunicera med användarna av din VBA -applikation. Det låter dig också helt styra användaren i vad de gör med din arbetsbok.

Du kan naturligtvis använda kalkylbladsceller för att acceptera parametrar från användaren, men användarformen ger en mycket bättre användarupplevelse.

Genom att expandera höjden och bredden på din användarform till storleken på Excel -fönstret kan du få din applikation att se ut som en vanlig Windows -applikation, där användaren är helt omedveten om att de använder Excel som värd.

Alla vanliga Windows -kontroller, till exempel rullgardinsmenyer, listrutor, kryssrutor är tillgängliga för dig. Du har också ett stort utbud av metoder, evenemang och egenskaper att använda för att förbättra användarupplevelsen.

En viktig punkt är att när du visar en användarform som är inbyggd eller är modal kan du inte redigera din kod i VBE eller komma åt någon Excel -funktionalitet. Först när formuläret är stängt kommer markören att visas i din kod.

Inbyggda VBA -användarformulär

Excel VBA som flera inbyggda formulär som kan användas för att kommunicera med användaren.

Meddelandebox

Detta är den mest använda formen i VBA. Det visar helt enkelt ett textmeddelande, vilket möjligen informerar en användare om att de har angett ogiltig inmatning eller att en VBA -process har körts. I sin enklaste form visar de en textsträng, men du kan också lägga till en ikon som ett fråga eller utropstecken och ge meddelandefältet en annan titel.

Detta är ett grundläggande exempel. Det finns bara en knapp att klicka på, och i rubrikfältet står det "Microsoft Excel"

Koden för att producera detta är mycket enkel:

123 SubtestMsgBox ()MsgBox "Denna process har slutförts"Avsluta Sub

Du kan använda olika parametrar för att lägga till knappar, ikoner och ändra titelfältet

123456789 SubtestMsgBox ()Dim Ret som variantRet = MsgBox ("Är du säker?", VbYesNo Eller vbQuestion, "Min ansökan")Om Ret = vbYes Då'Din process härAnnanAvsluta SubAvsluta omAvsluta Sub

Den här koden lägger till en "Ja" och "Nej" -knapp och ett frågeteckenikon och anger titelfältet. Observera att du kan kombinera stilarna i meddelanderutan med hjälp av operatören "Eller"

När du returnerar ett värde från en meddelanderuta måste returvariabeln också definieras som en variant eller vbMsgBoxResult, och meddelandelådan måste användas inom parentes,

Inmatningslåda

Det finns en mycket enkel inmatningsbox inbyggd i VBA, även om det är ganska restriktivt vad du kan göra med det. Om du kan är det bättre att designa en anpassad användarform

12345 Sub TestInputBox ()Dim Ret As StringRet = InputBox ("Vänligen ange ditt namn", "Ange namn")MsgBox RetAvsluta Sub

Du kan också lägga till ett standardvärde för inmatningen i parametrarna.

Öppna filnamn

Detta låter dig använda Windows -fildialogen i din VBA -kod. Det ser väldigt imponerande ut för användaren när det körs, men det är väldigt enkelt att införliva och du får automatiskt alla fildialogfunktioner med det.

Koden begränsar användaren till att bara se Excel -filer. Tyvärr kan de skriva in ett icke-Excel-filnamn i rutan Filnamn och klicka på knappen Öppna, så du behöver lite kod för att säkerställa att en Excel-fil har valts.

Använd kommandot ‘ChDir’ för att ändra standardkatalogen till dina egna krav innan du visar fildialogen

Observera användningen av jokertecken i parametern FileFilter. Excel -filerna som ska visas kan vara före 2007, ha makron eller vara binära så att filtret är ".xls*".

123456 Sub TestFileDialog ()Dim MyFile As StringChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Välj en fil")MsgBox MyFileAvsluta Sub

Om det behövs kan du låta användaren välja flera filer samtidigt med MultiSelect -parametern. Standard är falskt (endast enstaka val)

12345678 Sub TestFileDialog ()Dim MyFile Som variantChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel -filer (*.xls*),*. Xls*", "Välj en fil",, True)För varje f i min filMsgBox fNästa fAvsluta Sub

Användaren håller ned Shift -tangenten i fildialogrutan för att välja flera filer.

För varje slinga visar hela sökvägen och namnet på varje vald fil

Excel -standarddialogrutor

Inom Excel VBA finns en dialogruta -samling som du kan använda för att visa alla vanliga Excel -dialogrutor. Nackdelen är att du inte kan komma åt de parametrar som användaren har valt eller ändra utseendet på dialogrutan, men dessa dialogrutor kan vara användbara för att styra användaren till en standard Excel -funktion och låta dem välja specifika parametrar i dialogrutan.

Ett bra exempel på detta är att visa dialogrutan ‘Skriv ut’ från VBA:

123 Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint). VisaAvsluta Sub

När du öppnar parenteserna i samlingen Dialog ser du en lista med ett stort antal konstanter för inbyggda dialogrutor. Det är värt att experimentera med några av dessa alternativ i din kod

Infoga ett nytt användarformulär

Du kan designa dina egna användarformulär genom att infoga ett användarformulär i Visual Basic Editor (VBE)

Du gör detta genom att välja Infoga | UserForm i menyraden VBE.

Klicka på "UserForm" och ett nytt tomt formulär visas redo för dig att utveckla

Själva själva formen (visas som 'UserForm1') ser ganska liten ut, men du kan använda handtagen runt den för att förstora eller göra den ännu mindre genom att dra handtagen med markören.

Det finns ett fastighetsfönster i det nedre vänstra hörnet av skärmen. Eftersom fokus ligger direkt på själva formuläret innehåller detta alla egenskaper för formuläret som är specifikt för det formuläret.

Observera att när du börjar lägga till kontroller som kombinationsrutor och kommandoknappar, har dessa kontroller alla sina egna egenskaper, och de kan vara väldigt olika vad du kan göra med var och en av dem.

Egenskaperna som du ser gäller för närvarande endast för själva formuläret.

Egenskapen "Namn" är namnet som används för att definiera ditt formulärobjekt i VBA -koden. Du kanske vill använda något mer meningsfullt för objektnamnet, så att när du granskar din kod är det uppenbart vilken form som används.

Egenskapen "Namn" återspeglas också till fönstret "Projektutforskare" i det övre vänstra hörnet av skärmen

Du kommer att vilja ändra rubriken i formuläret till något annat än 'UserForm1', och du kan göra detta genom att skriva in din nya text i egenskapen 'Bildtext'

Du kan göra ett stort antal ändringar i hur din blankett ses av användaren. Du kan ändra färger, lägga till bilder t.ex. en företagslogotyp, ändra position med ”Vänster” och ”Överst”, ändra storlek med ”Höjd” och ”Bredd”, ändra muspekaren och många fler

Alla dessa egenskaper kan också ändras programmatiskt för alla kontroller som du har lagt till i formuläret. Till exempel kan en användare välja från en listruta kontroll, och du kanske vill inaktivera eller dölja andra kontroller baserat på användarens val

Använda verktygslådan

Du kommer att märka att när du klickar på själva formuläret visas en popup-fönster med verktygslåda. Om du klickar någon annanstans t.ex. egenskapsfönstret försvinner det, men visas igen när du klickar på formuläret.

Verktygslådan ger den verkliga mekaniken i formulärdesignen. Detta gör att du kan lägga till de vanliga Windows -kontrollerna som användarna känner till i ditt formulär.

Du kommer att märka att det finns ett nätverk av prickar på formuläret. Detta är ett "snapgrid" så att när du lägger till en kontroll i formuläret kommer det automatiskt att justera positionen till raderna och kolumnerna med prickar. Detta hjälper enormt med att anpassa dina kontroller så att du inte får ett ojämnt utseende på kontrollerna

Om du klickar på en kontroll och sedan bestämmer dig för att inte använda den, kommer markören tillbaka till det normala genom att klicka på "pil" -ikonen i det övre vänstra hörnet av verktygslådan.

Du kan lägga till ytterligare kontroller i verktygslådan med hjälp av Verktyg | Ytterligare kontroller på VBE -menyn. Det finns ett stort antal av dessa tillgängliga, men beroende på dina Windows- och Excel -versioner fungerar de inte alltid så vissa experiment krävs ofta.

Det kan också hända att dina användare inte har tillgång till några av dessa ytterligare kontroller eller kör äldre versioner av Windows och Excel, vilket kan orsaka problem. I stora organisationer, särskilt om de är globala, finns det inget som heter en standardbyggd dator som du kan lita på!

Lägga till en utgångsknapp i ditt formulär

En kommandoknapp är enkel att lägga till i formuläret. Detta ser ut på samma sätt som knappar som du ser i andra Windows -formulär, vanligtvis som en "OK" eller "Avbryt" -knapp.

Klicka på ikonen Kommandoknapp i verktygslådan. Detta är den andra ikonen till vänster på den nedre raden av ikoner. Se bilden ovan. Den har bokstäverna 'ab' på den.

Du kan antingen hålla ned musknappen och dra kontrollen till formuläret, eller så kan du flytta markören till formuläret, där den ändras till en "kors" -markör och du kan placera och storlek din knapp

Om du drar kontrollen till formuläret får du standardstorleken på knappen. Genom att flytta markören till formuläret kan du ändra knappens storlek genom att dra "kryss" -markören över ditt formulär

Din blankett kommer nu att se ut så här:

Knappen har standardtext som bildtext, men du vill ändra den till dina egna krav. Du kan klicka på texten i knappen (‘CommandButton1’) så kan du redigera bildtexten direkt.

Du kan också ändra det i egenskapsfönstret (nedre vänstra hörnet av skärmen). Du kommer att se en egenskap som heter "Bildtext" och du kan redigera värdet för detta. Ändra detta till "Avsluta"

Precis som med formuläregenskaperna definierar egenskapen "Namn" namnet som ska användas i din VBA -kod. Du kanske vill använda ett namn som är mer meningsfullt och självklart i din kod. Du kan ange detta mot egenskapen "Namn".

Du kan placera om knappen genom att dra den runt på formuläret, och du kan ändra storlek på den genom att klicka på knapphandtagen (vita fyrkantiga rutor) och dra i handtagen för att göra den större eller mindre

Du kan också ändra storlek på knappen genom att ändra höjd- och breddvärdena i egenskapsfönstret

Du kan visa formuläret i Excel genom att klicka på den gröna triangeln i VBE -verktygsfältet eller trycka på F5

Du kan ringa ditt formulär från VBA -kod inom en modul med hjälp av "Visa" -metoden

123 Sub ShowForm ()UserForm1.ShowAvsluta Sub

Ditt användarformulär är faktiskt ett globalt objekt och kan anropas var som helst i din kod

För närvarande gör din kommandoknapp ingenting eftersom det inte finns någon VBA -kod bakom den. Du måste skriva detta själv! Allt som kan hända just nu är att du kan klicka på "Stäng" X i det övre högra hörnet av formuläret.

För att lägga till VBA -kod, dubbelklicka på knappen på formuläret

Detta tar dig till det vanliga VBA -kodfönstret och visar standardhändelsen för klick.

Du använder "Dölj" -metoden för att stänga formuläret, och du kan också lägga till någon annan kod, till exempel en meddelanderuta för att bekräfta för användaren vad som har hänt.

Observera att kodfönstret har två rullgardinsmenyer högst upp. Den första låter dig välja dina formulärkontroller, och den andra visar alla händelser som är tillgängliga för dig att lägga till kod. Den uppenbara för en knapp är "Klicka" -händelsen, men det finns andra som "Dubbelklicka" eller "Musflytt"

När du kör ditt formulär nu gör knappen faktiskt något. Formuläret försvinner och en meddelanderuta visas som bekräftar att formuläret är stängt

Du kan naturligtvis förstora utgångskoden. Du kanske vill visa ett annat formulär eller vidta åtgärder på parametrar som användaren har angett i ditt formulär

Lägga till en etikettkontroll i ett formulär

Etikettkontroller är för att uppmana användaren om vilken typ av data de behöver för att mata in till en kontroll på formuläret t.ex. textruta, rullgardinsmeny, etc. En etikett har inga gränser som standard, men dessa kan läggas till genom egenskapsfönstret om det behövs.

Som en kontroll läses de bara för användaren och är helt enkelt ett sätt att sätta text på formuläret, oavsett om det är en fet rubrik eller en instruktion om vad du ska ange eller välja.

För att lägga till en etikett, klicka på "A" -ikonen i verktygslådan (översta raden, andra från vänster) och antingen dubbelklicka på den eller flytta markören till formuläret och välj position och storlek.

Genom att använda egenskapen "Bildtext" i fönstret Egenskaper eller genom att klicka på etikettkontrollen kan du skriva in texten för etikettkontrollen.

Observera att texten kommer att lindas enligt etikettkontrollens storlek, och om textsträngen är för lång kommer den inte att visas helt på formuläret, så du måste vara försiktig med etikettkontrollens storlek.

Med hjälp av egenskapsfönstret kan du ändra utseendet på etikettkontrollen, med olika färger, teckensnitt, bakstil t.ex. om den överlagrar en bild och du vill att den ska vara transparent

Ingen kod behöver skapas för en etikettkontroll. Huvudsyftet är att lägga till text i formuläret så att användaren kan se hur alla andra kontroller fungerar

Lägga till en textkontroll i formuläret

En textkontroll används för att tillåta användaren att mata in text, t.ex. att ange ett namn eller kommentarer

Textkontrollen läggs till från verktygslådan genom att klicka på textkontrollikonen (översta raden, tredje från vänster) och dubbelklicka eller dra kontrollen till position i formuläret.

Textkontrollen förväxlas ofta med etikettkontrollen, men textkontrollen är den för användarinmatning

Texten "Ange ditt namn" är en etikettkontroll, som tidigare beskrivits, och vi har nu en vit textruta redo för användaren att skriva in något i

Med hjälp av egenskapsfönstret kan du ändra färger, teckensnitt, specialeffekter eller använda lösenordstecken för din textruta. Enorm flexibilitet finns tillgänglig

En mycket viktig egenskap för en textruta är egenskapen ‘MultiLine’. Om du vill att användaren ska mata in en stor mängd text i textkontrollen t.ex. kommentarer, måste egenskapen ‘MultiLine’ ställas in på True.

Det är en standard på False vilket innebär att hur stor du än gör din textruta, kommer den inmatade texten att förbli på en kontinuerlig rad och kommer att rulla ut ur textrutan. Det kommer inte att linda runt i lådan.

Det finns ingen popup när du högerklickar på din textruta när den körs, men CTRL+V fungerar för Klistra in, och CTRL+C fungerar för Klipp, om användaren vill klippa ut och klistra in text till och från andra applikationer

Återigen måste du skriva din egen kod för att hantera text som användaren har skrivit in. Du kanske vill överföra den till en cell i ett kalkylblad

Du kan lägga till den här koden i "Ändra" -händelsen för textrutan

123 Private Sub TextBox1_Change ()Kalkylark ("Ark1"). Område ("A1"). Värde = TextBox1.VärdeAvsluta Sub

Du kanske också vill lägga in en valideringskod för att kontrollera att användaren inte skriver in skräp som kommer att få katastrofala effekter på din applikation

Ändringshändelsen är inte bra för detta eftersom det kallas varje gång användaren skriver in ett nytt tecken. Användaren kan börja skriva en textsträng och omedelbart upptäcka att de har brutit dina valideringsregler innan de har slutfört en giltig text.

Du använder händelsen "Avsluta". Detta utlöses när användaren flyttar fokus till en annan kontroll på formuläret, vilket innebär att användaren inte längre matar in data.

123456 Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)Om IsNull (TextBox1.Value) Eller Len (TextBox1.Value) <4 SedanMsgBox "Namnet är ogiltigt", vbCriticalTextBox1.SetFocusAvsluta omAvsluta Sub

När användaren klickar på en annan kontroll i formuläret testar den här koden antingen ett nollvärde i textrutan eller mindre än 4 tecken. Om testet är sant visas en meddelanderuta med en kritisk ikon som informerar användaren om att namnet är ogiltigt och fokus flyttas tillbaka till den felaktiga textrutan för användaren att korrigera.

Observera att även om användaren klickar på Exit -knappen, kommer textrutans avslutningshändelse att utföras först, så detta förhindrar att användaren lämnar utan att korrigera inmatningen

Initiera och aktivera händelser på ett formulär

När VBA först skapar och bygger ett formulär utlöser det en "Initiera" -händelse. Men eftersom formuläret också visas vid denna tidpunkt utlöser det också en "Aktivera" -händelse. Från och med då, varje gång formuläret visas med "Visa" -metoden eller om det visas som en del av en hierarki av formulär, aktiveras "Aktivera" -händelsen, men inte "Initiera" -händelsen

"Initiera" -händelsen händer bara en gång, men "Aktivera" -händelsen kan hända många gånger

På din blankett kanske du vill ställa in standardvärden från kalkylbladet i inmatningskontrollerna t.ex. textrutor, så att dessa visas vid den första användningen av formuläret, men användaren kan skriva över standardvärdena och dessa nya värden kommer att förbli på plats så länge koden körs

12345678 Private Sub UserForm_Initialize ()TextBox1.Value = Sheets ("Sheet1"). Område ("A1"). VärdeOm TextBox1.Value = ”” DåTextBox1.Visible = FalsktAnnanTextBox1.Visible = TrueAvsluta omAvsluta Sub

Du kan hitta "Initiera" -händelsen i den andra listrutan i kodfönstret och användarformsnamnet i den första rullgardinsmenyn.

Denna kod kommer att använda värdet i cell A1 på "Sheet1" som standardvärde i textrutan som skapades tidigare i den här artikeln. När formuläret visas för första gången visas standardvärdet. Användaren kan sedan skriva över standardvärdet och detta kommer att behållas. Om CellA1 är tom kommer textrutan att döljas, annars är den synlig

Standardvärdet kan också vara hårdkodat:

1 TextBox1.Value = “John Smith”

Du kanske också vill se till att de värden som användaren har angett återkommer varje gång användaren startar det formuläret inom just den Excel-sessionen. VBA-kod kan enkelt skriva tillbaka värdena till celler i arbetsboken med hjälp av "Avsluta" -händelsen på en kontroll och återinstallera dem med "Aktivera" -händelsen på formuläret

123 Private Sub TextBox1_Exit (ByVal Cancel as MSForms.ReturnBoolean)Kalkylark ("Ark1"). Område ("A10"). Värde = TextBox1.ValueAvsluta Sub
123 Private Sub UserForm_Activate ()TextBox1.Value = Sheets ("Sheet1"). Område ("A10"). VärdeAvsluta Sub

Denna kod kommer att göra användarens värderingar ihållande och se till att de sparas bort med resten av arbetsboken

Spara din ansökan och formulär

När du sparar din Excel -arbetsbok som innehåller dina formulär sparas också alla formulär och deras VBA -kod. Alla värden som formuläret håller medan de visas förloras dock.

Det är viktigt att skriva kod så att när användaren lämnar arbetsboken eller formuläret skrivs värdena tillbaka till celler i arbetsboken och bevaras.

Modala och icke-modala former

Själva formuläret har en egenskap "Show Modal". Detta är som standard satt till True, men det kan ändras till False (icke-modalt)

Om ett formulär är modalt betyder det att ingen av Excel -funktionerna kan nås medan formuläret visas. Detta inkluderar din kod i VBE -fönstret. Du kan se koden, men markören och tangentbordet är inaktiverade.

I en icke-modal form kan du komma åt alla Excel-funktioner, inklusive VBE-fönstret, medan formuläret visas.

Detta är viktigt ur synvinkel för att kontrollera användarnas beteende

Stänga ett formulär

Hur bra du än skriver din kod för att tvinga användaren ner en viss rutt, kan de enkelt kringgå den genom att klicka på "Stäng" X i det övre högra hörnet av formuläret

Du kan förhindra att detta händer genom att ändra 'QueryClose' -händelsen i formuläret

1234 Private Sub UserForm_QueryClose (Avbryt som heltal, Stäng läge som heltal)Avbryt = SantMsgBox "Den här åtgärden är inaktiverad"Avsluta Sub

Händelsen "QueryClose" aktiveras när användaren klickar på "Stäng" X i formuläret. Denna kod avbryter åtgärden, så användaren tvingas använda din "Avsluta" -knapp och koden som du har bakom den.

Aktivera och inaktivera kontroller

Alla kontroller i ditt formulär har en egenskap som heter 'Aktiverad' som är inställd på Sann eller falsk. Om det är falskt är kontrollen nedtonad. Det kan ses men kan inte användas.

Det finns också en egenskap som heter 'Synlig' som igen är inställd på Sann eller falsk.

Du kan skriva kod för att antingen göra en viss kontroll oanvändbar eller för att göra den helt osynlig för användaren. Med hjälp av ett "Om" -uttalande kan du välja omständigheterna när du behöver göra detta

Till exempel kan du inaktivera "Avsluta" -knappen först tills användaren har angett ett värde i TextBox1 (namn)

123 Private Sub UserForm_Initialize ()CommandButton1.Enabled = FalsktAvsluta Sub
1234567 Private Sub TextBox1_Change ()Om Len (TextBox1.Value)> 0 DåCommandButton1.Enabled = TrueAnnanCommandButton1.Enabled = FalsktAvsluta omAvsluta Sub

Denna kod använder formuläret 'Initiera' för att inaktivera exit -knappen (kommandoknapp 1) när formuläret först visas och använder sedan 'Ändra' -händelsen på TextBox1 (namn) för att aktivera Exit -knappen om något har skrivits in eller inaktiverats det om rutan är tom.

"Ändra" -händelsen utlöses varje gång ett nytt tecken skrivs in eller tas bort från textrutan. Om användaren försöker skriva in text för att aktivera knappen och sedan raderar all text, kommer knappen direkt att inaktiveras

wave wave wave wave wave