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/?DHhootCLYVh

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 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. Haar

rol 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 

Download link

Download de voorbeeldpagina op deze link: //cjoint.com/?DHhootCLYVh
Vorige Artikel Volgende Artikel

Top Tips