VBA - Hoe maak je een cascade keuzelijst met invoervak in een gebruikersformulier
VBA - Hoe maak je een cascade keuzelijst met invoervak in een gebruikersformulier
Invoering
In dit artikel leert u hoe u een cascade keuzelijst met behulp van de Indirect-methode kunt vullen.voorwaarden
- 1 werkboek
- 1 UserForm
- 3 combobox.
U kunt hier ook een voorbeeldwerkboek downloaden: //cjoint.com/14au/DHhootCLYVh.htm
Beheer van namen onder Excel
Als u namen in een Excel-werkmap wilt definiëren, kunt u:- Excel 2007 of eerdere versie: invoegen> Namen> Definiëren .
- Vanaf Excel 2010: lintformules> Definieer een naam.
De code voor de combobox
We willen dat het volgende gebeurt:- Bij het laden van de UserForm wordt de ComboBox1 gevuld.
- De andere keuzelijsten worden gevuld op basis van de waarden van de eerste.
De eerste lijst invullen
Om een keuzelijst met invoervak te vullen met de inhoud van een benoemd bereik van de werkmap, is de syntaxis:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Om de ComboBox leeg te maken:
- Combobox1.Clear
Wat geeft ons de code voor het invullen van de eerste vervolgkeuzelijst bij het laden van het UserForm:
Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Bereik ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
De tweede lijst invullen
Wanneer een waarde wordt geselecteerd in de eerste vervolgkeuzelijst, komt deze (de tekst die wordt weergegeven in de ComboBox) overeen met de naam van een werkmap.Om de inhoud van de cellen van het benoemde bereik weer te geven, gebruiken we de gebeurtenis Wijzigen:
Private Sub ComboBox1_Change () 'Combobox département Vermijd de bug die wordt gegenereerd wanneer een gebruiker de inhoud van ComboBox1 verwijdert Als ComboBox1.Value = "" Then Exit Sub ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) Einde Sub
Voor de derde keuzelijst met invoervak:
Private Sub ComboBox2_Change () 'Combobox communes If ComboBox2.Value = "" Then Exit Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) End Sub
Veel voorkomende bugs
Naamloos bereik
De naam die is ingevoerd in de ComboBox komt niet overeen met de naam van een werkmap. Dit gebeurt wanneer de naam niet is gedefinieerd. Om dit probleem te omzeilen, maken we een kleine functie om alle namen van de werkmap door te lussen:Functie NomDefini (Nom As String) As Boolean Dim Noms Als Name NomDefini = False voor elke Noms in ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Exit Function Next Noms End Function
Invoerfout
Zoals u in het voorbeeldbestand zult opmerken, houdt het definiëren van namen geen rekening met speciale tekens of spaties. In sommige situaties moet u mogelijk de variabelen bewerken:Hier is een voorbeeld:
Functie CaracSpec (Nom As String) As String CaracSpec = Vervangen (Nom, "", "_") CaracSpec = Vervangen (CaracSpec, "-", "_") Eindfunctie
De voltooide code
Optie Expliciet Privé Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Bereik ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département If ComboBox1.Value = "" Then Exit Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange als String NomRange = CaracSpec (ComboBox1.Value) Als NomDefini (NomRange) Then ComboBox2.List = Application.Transpose (Range (NomRange)) Anders ComboBox2.AddItem "" "Aucune commune" "" End If End Sub Private Sub ComboBox2_Change () 'Combobox communes If ComboBox2.Value = "" Then Exit Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) If NomDefini (NomRange) Then ComboBox3.List = Application.Transpose (Range (NomRange)) Anders ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Function NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = False For Each Noms In ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Exit Functie Volgende Noms Einde Functie Functie Carac Spec (Nom As String) As String CaracSpec = Vervangen (Nom, "", "_") CaracSpec = Vervangen (CaracSpec, "-", "_") Eindfunctie
Download link
Download de voorbeeldpagina op deze link: //cjoint.com/?DHhootCLYVhVBA - Hoe maak je een cascade keuzelijst met invoervak in een gebruikersformulier
Invoering
In dit artikel leert u hoe u een cascade keuzelijst met behulp van de Indirect-methode kunt vullen.voorwaarden
- 1 werkboek
- 1 UserForm
- 3 combobox.
U kunt hier ook een voorbeeldwerkboek downloaden: //cjoint.com/14au/DHhootCLYVh.htm
Beheer van namen onder Excel
Als u namen in een Excel-werkmap wilt definiëren, kunt u:- Excel 2007 of eerdere versie: invoegen> Namen> Definiëren.
- Vanaf Excel 2010: lintformules> Definieer een naam.
De code voor de combobox
We willen dat het volgende gebeurt:- Bij het laden van de UserForm wordt de ComboBox1 gevuld.
- De andere keuzelijsten worden gevuld op basis van de waarden van de eerste.
De eerste lijst invullen
Om een keuzelijst met invoervak te vullen met de inhoud van een benoemd bereik van de werkmap, is de syntaxis:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Om de ComboBox leeg te maken:
- Combobox1.Clear
Wat geeft ons de code voor het invullen van de eerste vervolgkeuzelijst bij het laden van het UserForm:
Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Bereik ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
De tweede lijst invullen
Wanneer een waarde wordt geselecteerd in de eerste vervolgkeuzelijst, komt deze overeen met de naam van een werkmap (de tekst die wordt weergegeven in de ComboBox).Om de inhoud van de cellen van het benoemde bereik weer te geven, gebruiken we de gebeurtenis Wijzigen:
Private Sub ComboBox1_Change () 'Combobox département Vermijd de bug die wordt gegenereerd wanneer een gebruiker de inhoud van ComboBox1 verwijdert Als ComboBox1.Value = "" Then Exit Sub ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) Einde Sub
Voor de derde keuzelijst met invoervak:
Private Sub ComboBox2_Change () 'Combobox communes If ComboBox2.Value = "" Then Exit Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) End Sub
Veel voorkomende bugs
Naamloos bereik
De naam die is ingevoerd in de ComboBox komt niet overeen met de naam van een werkmap, omdat deze nog niet is gedefinieerd. Om dit probleem te omzeilen, zullen we een kleine functie creëren. Haarrol is om door alle namen van de werkmap te bladeren:
Functie NomDefini (Nom As String) As Boolean Dim Noms Als Name NomDefini = False voor elke Noms in ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Exit Function Next Noms End Function
Invoerfout
Zoals u in het voorbeeldbestand zult opmerken, houdt het definiëren van namen geen rekening met speciale tekens of spaties. In sommige situaties moet u mogelijk de variabele bewerken:Hier is een voorbeeld:
Functie CaracSpec (Nom As String) As String CaracSpec = Vervangen (Nom, "", "_") CaracSpec = Vervangen (CaracSpec, "-", "_") Eindfunctie
De voltooide code
Optie Expliciet Privé Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Bereik ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département If ComboBox1.Value = "" Then Exit Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange als String NomRange = CaracSpec (ComboBox1.Value) Als NomDefini (NomRange) Then ComboBox2.List = Application.Transpose (Range (NomRange)) Anders ComboBox2.AddItem "" "Aucune commune" "" End If End Sub Private Sub ComboBox2_Change () 'Combobox communes If ComboBox2.Value = "" Then Exit Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) If NomDefini (NomRange) Then ComboBox3.List = Application.Transpose (Range (NomRange)) Anders ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Function NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = False For Each Noms In ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Exit Functie Volgende Noms Einde Functie Functie Carac Spec (Nom As String) As String CaracSpec = Vervangen (Nom, "", "_") CaracSpec = Vervangen (CaracSpec, "-", "_") Eindfunctie