De Kursbokningsformulär är en enkel form som illustrerar principerna för UserForm -design och tillhörande VBA -kodning.
Den använder ett urval av kontroller inklusive textrutor, kombinationsrutor, alternativknappar grupperade i en ram, kryssrutor och kommandoknappar.
När användaren klickar på OK -knappen matas inmatningen in i nästa tillgängliga rad i kalkylbladet.
Beskrivning av excelform:
Det finns två enkla textrutor (Namn: och Telefon:) där användaren kan skriva fri text och två kombinationsrutor (Avdelning och Kurs) som låter användaren välja ett objekt från listan.
Det finns tre alternativknappar (Introduktion, Mellanliggande och Avancerad) grupperade i en ram (Nivå) så att användaren bara kan välja ett av alternativen.
Det finns två kryssrutor (Lunch krävs och Vegetarian) att eftersom de inte är grupperade i en ram kan båda väljas om det behövs. Men om den som gör bokningen inte vill ha lunch behöver vi inte veta om de är vegetarianer eller inte. Så, den Vegetarian kryssrutan är nedtonad tills det behövs.
Det finns tre kommandoknappar (OK, Avbryt och Rensa formulär) var och en utför en fördefinierad funktion när den klickas.
Inställningarna för kontrollegenskaper:
Kontrollera | Typ | Fast egendom | Miljö |
UserForm | UserForm | namn | frmCourseBooking |
Rubrik | Kursbokningsformulär | ||
namn | Textruta | namn | txtName |
Telefon | Textruta | namn | txtPhone |
Avdelning | Kombinationsrutan | namn | cboDepartment |
Kurs | Kombinationsrutan | namn | cboCourse |
Nivå | Ram | namn | fraLevel |
Rubrik | Nivå | ||
Introduktion | Alternativknapp | namn | optIntroduktion |
Mellanliggande | Alternativknapp | namn | optIntermediate |
Avancerad | Alternativknapp | namn | optAdvanced |
Lunch krävs | Kryssruta | namn | chkLunch |
Vegetarian | Kryssruta | namn | chkVegetarian |
Aktiverad | Falsk | ||
OK | Kommandoknapp | namn | cmdOk |
Rubrik | OK | ||
Standard | Sann | ||
Avbryt | Kommandoknapp | namn | cmdCancel |
Rubrik | Avbryt | ||
Avbryt | Sann | ||
Rensa formulär | Kommandoknapp | namn | cmdClearForm |
Skapa formulär i Excel
Om du vill bygga formuläret själv, kopierar du bara layouten som visas i illustrationen ovan. Följ stegen nedan:
1. Öppna den arbetsbok som du vill att formuläret ska tillhöra (UserForms som makron måste bifogas en arbetsbok) och växla till Visual Basic Editor.
2. I Visual Basic Editor klickar du på Infoga UserForm knappen (eller gå till Infoga> UserForm).
3. Om verktygslådan inte visas av sig själv (klicka först på formuläret för att se till att den inte döljer sig) klicka på Verktygslåda knappen (eller gå till Visa> Verktygslåda).
4. För att placera en kontroll på formuläret, klicka på lämplig knapp i verktygslådan och klicka sedan på formuläret. Kontrollerna kan flyttas genom att dra dem i kanterna eller ändra storlek genom att dra knapparna runt omkretsen.
5. För att redigera egenskaperna för en kontroll, se till att den valda kontrollen är vald och gör sedan lämpliga ändringar i Egenskaper fönster. Om du inte kan se egenskaper fönstret gå till Visa> Egenskapsfönster.
6. Om du vill ta bort en kontroll från formuläret markerar du den och klickar på Radera tangent på tangentbordet.
En UserForm kommer faktiskt inte att göra någonting förrän koden som driver formuläret och dess olika kontroller skapas. Nästa steg är att skriva koden som driver själva formuläret.
Lägga till koden: 1 Initiera formuläret
Initiera formuläret:
De flesta former behöver någon form av inställning när de öppnas. Detta kan vara att ställa in standardvärden, se till att fältet är tomt eller bygga listor med kombinationsrutor. Denna process kallas Initierar formuläret och det tas hand om av ett makro som heter UserForm_Initialize (om du är förvirrad av min varierande stavning av ordet "initialis (z) e", är det för att jag talar engelska och VBA talar amerikansk - men oroa dig inte, VBA kommer stava det åt dig!). Så här bygger du koden för att initiera kursbokningsformuläret:
1. För att se formulärets kodfönster, gå till Visa> Kod eller klicka F7.
2. När kodfönstret öppnas innehåller det ett tomt UserForm_Click () procedur. Använd listrutorna högst upp i kodfönstret för att välja UserForm och Initiera. Detta skapar den procedur du behöver. Du kan nu ta bort proceduren UserForm_Click ().
3. Ange följande kod i proceduren:
Private Sub UserForm_Initialize () txtName.Value = "" txtPhone.Value = "" With cboDepartment .AddItem "Sales" .AddItem "Marketing" .AddItem "Administration" .AddItem "Design" .AddItem "Advertising" .AddItem "Dispatch". AddItem "Transport" slutar 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 Slut Sub
Så fungerar initialiseringskoden:
Syftet med proceduren UserForm_Initialize () är att förbereda användarformuläret i VBA för användning, ange standardvärden för de olika kontrollerna och skapa listor som kombinationsrutorna kommer att visa.
Dessa rader gör att innehållet i de två textrutorna ska vara tomt:
txtName.Value = "" txtPhone.Value = ""
Därefter kommer instruktionerna för kombinationsrutorna. Först och främst anges innehållet i listan, sedan är det ursprungliga värdet för kombinationsrutan tomt.
Med cboDepartment .AddItem "Sales" .AddItem "Marketing" (så många som behövs …) Avsluta med
cboDepartment.Value = ""
Om det behövs kan ett första val göras från tillvalsgruppen, i det här fallet:
optIntroduction = True
Båda kryssrutorna är inställda på False (dvs. ingen bockning). Ställ in på True om du vill att kryssrutan ska visas redan markerad:
chkLunch = Falskt
chkVegetarian = Falskt
Slutligen fokuseras på den första textrutan. Detta placerar användarnas markör i textrutan så att de inte behöver klicka på rutan innan de börjar skriva:
txtName.SetFocus
Lägga till koden: 2 Få knapparna att fungera
Det finns tre kommandoknappar på formuläret och var och en måste drivas av sin egen procedur. Börjar med de enkla …
Kodning av Avbryt -knappen:
Tidigare använde vi fönstret Egenskaper för att ställa in Avbryt egenskapen för knappen Avbryt till Sann. När du ställer in egenskapen Avbryt för en kommandoknapp till Sann har detta till följd att "klicka" på den knappen när användaren trycker på Esc tangenten på deras tangentbord. Men det här ensamma kommer inte att få något att hända med formuläret. Du måste skapa koden för klickhändelsen på knappen som i så fall stänger formuläret. Här är hur:
1. Med UserForm öppet för redigering i Visual Basic Editor, dubbelklicka på knappen Avbryt. Formulärets kodfönster öppnas med cmdCancel_Click () proceduren redo för redigering.
2. Koden för att stänga ett formulär är mycket enkel. Lägg till en kodrad i proceduren så det ser ut så här:
Private Sub cmdCancel_Click () Unload Me End Sub
Kodning av knappen Clear Form:
Jag lade till en knapp för att rensa formuläret om användaren ville ändra åsikt och återställa allt och för att underlätta om de hade flera bokningar att göra samtidigt. Allt du behöver göra är att köra initieringsproceduren igen. Ett makro kan uppmanas att köra ett annat makro (eller serier av makron om det behövs) med hjälp av Ring upp nyckelord:
1. Dubbelklicka på knappen Rensa formulär. Formulärets kodfönster öppnas med cmdClearForm_Click () proceduren redo för redigering.
2. Lägg till en kodrad i proceduren så att den ser ut så här:
Private Sub cmdClearForm_Click () Call UserForm_Initialize End Sub
Kodning av OK -knappen:
Detta är koden som måste göra jobbet med att överföra användarens val och textinmatning till kalkylbladet. När vi ställer in Avbryt -knappens Avbryt -egenskap på Sann ställer vi också in OK -knappens Standard egendom till Sann. Detta måste klicka på OK -knappen när användaren trycker på Stiga på (eller Lämna tillbaka) på tangentbordet (förutsatt att de inte har använt sitt Flik nyckel till flik till en annan knapp). Här är koden för att få knappen att fungera:
1. Dubbelklicka på OK-knappen. Formulärets kodfönster öppnas med cmdOK_Click () proceduren redo för redigering.
2. Redigera proceduren för att lägga till följande kod:
Privat under cmdOK_Click () ActiveWorkbook.Sheets ("Kursbokningar"). Aktivera intervall ("A1"). Välj Gör om IsEmpty (ActiveCell) = FalseThen ActiveCell.Offset (1, 0) .Välj Avsluta om loop till 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 Om optIntroduction = True Then ActiveCell.Offset (0, 4) .Value = "Intro" ElseIf optIntermediate = True Då ActiveCell.Offset (0, 4) .Value = "Intermed" Annat ActiveCell.Offset (0, 4) .Value = "Adv" Avsluta om Om chkLunch = True Då ActiveCell.Offset (0, 5) .Value = "Ja" Annat ActiveCell.Offset (0, 5) .Value = "Nej" Avsluta om If chkVegetarian = True Då 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"). Välj Avsluta sub
Så fungerar CmdOK_Click -koden:
De två första raderna ser till att rätt arbetsbok är aktiv och flyttar markeringen till cell A1:
ActiveWorkbook.Sheets ("Kursbokningar"). Aktivera intervall ("A1"). Välj De följande raderna flyttar markeringen ner i kalkylbladet tills den hittar en tom cell: Do If IsEmpty (ActiveCell) = False Then ActiveCell.Offset (1 , 0) .Välj End Om Loop Till IsEmpty (ActiveCell) = True
De nästa fyra raderna börjar skriva innehållet i formuläret till kalkylbladet, med hjälp av den aktiva cellen (som finns i kolumn A) som referens och flyttar längs raden en cell i taget:
ActiveCell.Value = txtName.Value ActiveCell.Offset (0, 1) = txtPhone.Value ActiveCell.Offset (0, 2) = cboDepartment.Value ActiveCell.Offset (0, 3) = cboCourse.Value
Nu kommer vi till alternativknapparna. Dessa har placerats i en ram på formuläret så att användaren bara kan välja en. Ett IF -uttalande används för att instruera Excel vad de ska göra för varje 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" Sluta om
VBA IF -uttalanden är mycket lättare att hantera än Excel: s IF -funktion. Du kan ha så många alternativ du vill, bara sätt in ett till Annars om för var och en. Om det bara fanns två alternativ skulle du inte behöva Annars om, bara Om och Annan skulle räcka (glöm inte - de behöver alla en Avsluta om).
Det finns ett annat IF -uttalande för varje kryssruta. För kryssrutan Lunch Required betyder en bock i rutan "Ja" personen kräver lunch, och ingen bock betyder "Nej" de gör inte.
Om chkLunch = True Då ActiveCell.Offset (0, 5) .Value = "Yes" Annat ActiveCell.Offset (0, 5) .Value = "No" Sluta om
Vi kan använda ett liknande IF -uttalande för kryssrutan Vegetarian, men om personen inte behöver lunch är det irrelevant om de är vegetarianer eller inte. Jag skulle i alla fall vara fel att anta att de inte var vegetarianer helt enkelt för att de inte krävde lunch. IF -uttalandet innehåller därför ett andra, kapslade if -uttalande:
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 = "Nej" Slut Om Slut Om
En bock i rutan betyder "Ja" personen är vegetarian. Om det inte finns någon bock i rutan, ser det kapslade IF -uttalandet till kryssrutan Lunch Required. Om kryssrutan Lunch Required har en bock i den betyder ingen bock i kryssrutan Vegetarian att personen inte är vegetarian så den sätter in "Nej" i cellen. Men om kryssrutan Lunch Required inte har en bock i det, vet vi inte om personen är vegetarian eller inte (det spelar ingen roll ändå) så cellen lämnas tom ("").
Slutligen tas valet tillbaka till början av kalkylbladet, redo för nästa post:
Område ("A1"). Välj
Lägga till kod 3: Hantera formuläret
Slutligen ett exempel på hur kontrollerna på ett formulär kan manipuleras medan det används. När kontrollegenskaperna var inställda, Aktiverad egenskapen för kryssrutan Vegetarian var inställd på Falsk. När en kontroll inte är aktiverad användare kan inte ange ett värde i det, även om det kan hålla ett värde som redan fanns där, och VBA kan lägga till, ta bort eller ändra värdet.
Vi behöver inte veta om personen är vegetarian eller inte (även om de är det!) Om de inte beställer lunch. Så, kryssrutan Vegetarian förblir inaktiverad såvida inte en bock är markerad i kryssrutan Lunch Required. Då kan användaren kryssa i kryssrutan Vegetarian om han vill. Om de bockar det kommer vi att veta att de har svarat "Ja" och om de inte gör det vet vi att de har svarat "Nej".
Vi kan växla Aktiverad egendom från Falsk till Sann genom att ha ett förfarande som körs automatiskt när värdet för kryssrutan Lunch krävs ändras. Lyckligtvis har fler kontroller en Förändra proceduren och den vi använder här är chkLunch_Change (). Vi använder det här för att aktivera kryssrutan Vegetarian när kryssrutan Lunch krävs krävs och inaktivera den när kryssrutan Lunch krävs inte är markerad.
Det finns bara en sak till som vi behöver göra. Om någon antar att kryssrutan Lunch Required är markerad och kryssrutan Vegetarian också. Sedan ändrade de sig och tog bort kryssningen från kryssrutan Lunch Required. Kryssrutan Vegetarian skulle inaktiveras men fästingen som sattes in tidigare skulle förbli.
En extra kodrad kan se till att bocken tas bort när rutan är inaktiverad. Här är det hela:
Private Sub chkLunch_Change () If chkLunch = True Then chkVegetarian.Enabled = True Else chkVegetarian.Enabled = False chkVegetarian = False End If End Sub
Öppna formuläret
Formuläret är nu klart att använda så det måste öppnas med ett enkelt makro. Det kan bifogas en anpassad verktygsfältsknapp, en kommandoknapp ritad på kalkylbladet eller någon grafik (högerklicka på grafiken och välj Tilldela makro). Skapa vid behov en ny modul för arbetsboken och lägg till den här proceduren:
Sub OpenCourseBookingForm () frmCourseBooking.Show End Sub
Om du gillade våra bloggar, dela den med dina vänner på Facebook. Och du kan också följa oss på Twitter och Facebook.
Vi vill gärna höra från dig, låt oss veta hur vi kan förbättra, komplettera eller förnya vårt arbete och göra det bättre för dig. Skriv till oss på e -postwebbplatsen