VBA - Så här skapar du en kaskad kombinationsfält i en användarform
VBA - Så här skapar du en kaskad kombinationsfält i en användarform
Introduktion
I den här artikeln kommer du att lära dig hur du fyller i en kaskad kombinationsfält med hjälp av den indirekta metoden.förutsättningar
- 1 arbetsbok
- 1 UserForm
- 3 combobox.
Du kan också hämta en exempellagbok här: //cjoint.com/14au/DHhootCLYVh.htm
Hantera namn under Excel
För att definiera namn i en Excel-arbetsbok kan du antingen:- Excel 2007 eller tidigare version: Infoga> Namn> Definiera .
- Från och med Excel 2010: Ribbon formler> Definiera ett namn.
Koden för comboboxen
Vi vill att följande ska hända:- När du laddar UserForm fylls ComboBox1.
- De andra kombinationsfälten fylls utifrån värdena på den första.
Fyller i den första listan
För att fylla en kombinationsruta med innehållet i ett namngivna område i arbetsboken är syntaxen:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Så här rensar du ComboBox:
- Combobox1.Clear
Vad ger oss koden för att fylla den första rullgardinsmenyn vid lastningen av UserForm:
Privat Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
Fyller i den andra listan
När ett värde väljs i den första rullgardinsmenyn kommer det (texten som visas i ComboBox) att motsvara ett arbetsboksnamn.För att visa innehållet i cellerna i det angivna intervallet använder vi ändringsevenemanget:
Private Sub ComboBox1_Change () 'Combobox département Undvik buggen som genereras när en användare raderade innehållet i ComboBox1 Om ComboBox1.Value = "" Avsluta sedan ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) Avsluta Sub
För den tredje kombinationsrutan:
Private Sub ComboBox2_Change () 'Combobox communes Om ComboBox2.Value = "" Avsluta sedan ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) Slut Sub
Vanliga buggar
Namnlösa Range
Namnet som anges i ComboBox matchar inte något arbetsboksnamn. Detta händer när namnet inte har definierats. För att kringgå detta problem skapar vi en liten funktion för att slinga igenom alla namn på arbetsboken:Funktion NomDefini (Nom As String) Som Boolean Dim Noms Som Namn NomDefini = Falskt För Varje Noms I ThisWorkbook.Names Om Noms.Name = Nom Då NomDefini = True: Avsluta Funktion Nästa Noms Slut Funktion
Inmatningsfel
Som du kommer att märka i urvalsfilen tar inte hänsyn till specialtecken eller mellanslag vid definierande namn. I vissa situationer kan du behöva redigera variablerna:Här är ett exempel:
Funktion CaracSpec (Nom som sträng) Som sträng CaracSpec = Byt ut (Nom, "", "_") CaracSpec = Ersätt (CaracSpec, "-", "_") Slutfunktion
Den färdiga koden
Alternativ Explicit Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département Om ComboBox1.Value = "" Avsluta sedan Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange Som String NomRange = CaracSpec (ComboBox1.Value) Om NomDefini (NomRange) Sedan ComboBox2.List = Application.Transpose (Range (NomRange)) Annan ComboBox2.AddItem "" "Aucune commune" Avsluta Om Slut Sub Privat Sub ComboBox2_Change () 'Combobox Kommuner Om ComboBox2.Value = "" Avsluta Sub ComboBox3.Clear Dim NomRange Som String NomRange = CaracSpec (ComboBox2.Value) Om NomDefini (NomRange) Då ComboBox3.List = Application.Transpose (Range (NomRange)) Annan ComboBox3.AddItem "" "Aucune rue" "" Avsluta om slutdelfunktion NomDefini (Nom som sträng) Som booleska dimma som namn NomDefini = Fel för varje noms i ThisWorkbook.Names Om Noms.Name = Nom Then NomDefini = True: Exit Funktion Nästa Noms Slut Funktion Funktion Carac Spec (Nom som sträng) Som sträng CaracSpec = Byt ut (Nom, "", "_") CaracSpec = Ersätt (CaracSpec, "-", "_") Slutfunktion
Nedladdningslänk
Ladda ner provarket på den här länken: //cjoint.com/?DHhootCLYVhVBA - Så här skapar du en kaskad kombinationsfält i en användarform
Introduktion
I den här artikeln kommer du att lära dig hur du fyller i en kaskad kombinationsfält med hjälp av den indirekta metoden.förutsättningar
- 1 arbetsbok
- 1 UserForm
- 3 combobox.
Du kan också hämta en exempellagbok här: //cjoint.com/14au/DHhootCLYVh.htm
Hantera namn under Excel
För att definiera namn i en Excel-arbetsbok kan du antingen:- Excel 2007 eller tidigare version: Infoga> Namn> Definiera.
- Från och med Excel 2010: Ribbon formler> Definiera ett namn.
Koden för comboboxen
Vi vill att följande ska hända:- När du laddar UserForm fylls ComboBox1.
- De andra kombinationsfälten fylls utifrån värdena på den första.
Fyller i den första listan
För att fylla en kombinationsruta med innehållet i ett namngivna område i arbetsboken är syntaxen:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Så här rensar du ComboBox:
- Combobox1.Clear
Vad ger oss koden för att fylla den första rullgardinsmenyn vid lastningen av UserForm:
Privat Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
Fyller i den andra listan
När ett värde väljs i den första rullgardinsmenyn kommer det (texten som visas i ComboBox) att motsvara ett arbetsboksnamn.För att visa innehållet i cellerna i det angivna intervallet använder vi ändringsevenemanget:
Private Sub ComboBox1_Change () 'Combobox département Undvik buggen som genereras när en användare raderade innehållet i ComboBox1 Om ComboBox1.Value = "" Avsluta sedan ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) Avsluta Sub
För den tredje kombinationsrutan:
Private Sub ComboBox2_Change () 'Combobox communes Om ComboBox2.Value = "" Avsluta sedan ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) Slut Sub
Vanliga buggar
Namnlösa Range
Namnet som anges i ComboBox matchar inte något arbetsboksnamn eftersom det inte har definierats än. För att kringgå detta problem skapar vi en liten funktion. Dessrollen är att gå igenom alla arbetsbokens namn:
Funktion NomDefini (Nom As String) Som Boolean Dim Noms Som Namn NomDefini = Falskt För Varje Noms I ThisWorkbook.Names Om Noms.Name = Nom Då NomDefini = True: Avsluta Funktion Nästa Noms Slut Funktion
Inmatningsfel
Som du kommer att märka i urvalsfilen tar inte hänsyn till specialtecken eller mellanslag vid definierande namn. I vissa situationer kan du behöva redigera variabeln:Här är ett exempel:
Funktion CaracSpec (Nom som sträng) Som sträng CaracSpec = Byt ut (Nom, "", "_") CaracSpec = Ersätt (CaracSpec, "-", "_") Slutfunktion
Den färdiga koden
Alternativ Explicit Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département Om ComboBox1.Value = "" Avsluta sedan Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange Som String NomRange = CaracSpec (ComboBox1.Value) Om NomDefini (NomRange) Sedan ComboBox2.List = Application.Transpose (Range (NomRange)) Annan ComboBox2.AddItem "" "Aucune commune" Avsluta Om Slut Sub Privat Sub ComboBox2_Change () 'Combobox Kommuner Om ComboBox2.Value = "" Avsluta Sub ComboBox3.Clear Dim NomRange Som String NomRange = CaracSpec (ComboBox2.Value) Om NomDefini (NomRange) Då ComboBox3.List = Application.Transpose (Range (NomRange)) Annan ComboBox3.AddItem "" "Aucune rue" "" Avsluta om slutdelfunktion NomDefini (Nom som sträng) Som booleska dimma som namn NomDefini = Fel för varje noms i ThisWorkbook.Names Om Noms.Name = Nom Then NomDefini = True: Exit Funktion Nästa Noms Slut Funktion Funktion Carac Spec (Nom som sträng) Som sträng CaracSpec = Byt ut (Nom, "", "_") CaracSpec = Ersätt (CaracSpec, "-", "_") Slutfunktion