Comment rendre la list des éléments Combobox dynamic?

J'utilise un button 'Générer' sur ma feuille de calcul. Lorsque je clique sur le button, un popup (formulaire) vient, qui contient deux comboboxes. Bases la sélection dans la première combobox, la deuxième list d'options de combobox est remplie.

Pour la première combobox, lorsque je code dur les valeurs de l'élément, ça marche bien. Le code de formulaire est le suivant:

Private Sub UserForm_Initialize() With ComboBox_DL .AddItem "DL1" .AddItem "DL2" End With End Sub 

J'ai essayé de rendre cette list d'éléments dynamic en récupérant les valeurs de l'élément combobox d'une colonne dans la feuille de calcul excel en utilisant le code de formulaire suivant:

 Private Sub UserForm_Initialize() With ComboBox_DL For Each c In ActiveSheet.Range(Range("AE"), Range("AE").End(xlDown)) .AddItem c.Value Next End With End Sub 

Mais le code ci-dessus lance une erreur: Erreur d'exécution '1004': Méthode 'Plage' de l'object '_Global' échoué

 I modified the code adding sheet details: With ComboBox_DL For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(Range("AE"), Range("AE").End(xlDown)) .AddItem c.Value Next 

Il lança toujours la même erreur.

Quelqu'un peut-il aider s'il vous plaît? Aussi, je veux savoir comment searchr les valeurs correspondant à la sélection dans combobox1 et remplir la list dans combobox2?

Si vos inputs de combobox sont une list sur une feuille de calcul, vous n'avez pas besoin d'utiliser VBA pour les remplir. Au lieu de cela, vous pouvez créer une Dynamic Named Range et l'utiliser comme Rowsource pour la combobox.

Dites que votre list commence sur Sheet3, cell A1. Aller aux formules | Gestionnaire de nom pour créer une gamme nommée. Donnez-lui un nom utile comme «Combo», puis mettez la formule suivante dans RefersTo: =OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet3!$A:$A),1) Enregistrez et fermez les plages nommées dialog.

Dans les propriétés de votre combobox, searchz la ligne "RowSource". Réglez-le sur =Combo , ou n'importe quel nom que vous avez utilisé pour votre gamme nommée.

Toute modification de la list, y compris l'allongement ou le raccourcissement, sera maintenant réfléchie immédiatement et automatiquement dans la zone de list déroulante.

ÉDITION À ADD:

Pour utiliser la valeur sélectionnée dans la première combobox pour déterminer quelle list est utilisée dans une deuxième combobox, nous devrons faire deux choses.

La première consiste à créer des plages nommées pour toutes les sélections possibles dans la première list:
entrez la description de l'image ici

Dans l'image, la colonne A est la source de notre première zone de list déroulante; les autres colonnes contiennent les sources possibles pour la deuxième zone de list déroulante.

Nous avons juste besoin de mettre un peu de code dans l'événement Change pour la première combobox:

 Private Sub ComboBox1_Change() Me.ComboBox2.Value = "" Me.ComboBox2.RowSource = "=" & Me.ComboBox1.Value End Sub 

Ce code triggersra chaque fois que ComboBox1 sera modifié. D'abord, il efface toute valeur existante dans ComboBox2, puis il définira la propriété source de ligne de ComboBox2 à une combinaison du symbole = et quelle que soit la valeur sélectionnée dans la première case. Étant donné que ces valeurs sont également appelées rangées, la deuxième zone utilisera maintenant la gamme nommée sélectionnée comme source de list.

Si vous aviez besoin, vous pouvez append plus de niveaux d'options en cascade, avec différentes plages nommées pour chacune. Plus que plusieurs niveaux peuvent devenir ingérables, cependant – à quel point nous voudrons peut-être regarder une autre méthode.

Havent a testé ceci car je n'ai pas créé le formulaire d'user à tester dans les mêmes conditions, mais devrait fonctionner sous réserve de modifications mineures.

 Dim n As Long n = Sheets("Business_Input_Data").Cells(Rows.Count, "AE").End(xlUp).Row With ComboBox_DL For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range("AE" & n) .AddItem c.Value Next 

vous manquez l'index de ligne dans "AE", utilisez en outre une qualification de feuille de calcul explicite dans n'importe quelle reference de Range

 Private Sub UserForm_Initialize() Dim c As Range With ComboBox_DL For Each c In For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1"), ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1").End(xlDown)) .AddItem c.Value Next End With End Sub 

mais des solutions plus élégantes sont:

 Private Sub UserForm_Initialize() With ThisWorkbook.Worksheets("Business_Input_Data") ComboBox_DL.RowSource = .Range("AE1", .Range("AE1").End(xlDown)).Address End With End Sub Private Sub UserForm_Initialize() With ThisWorkbook.Worksheets("Business_Input_Data") ComboBox_DL.List = .Range("AE1", .Range("AE1").End(xlDown)).Value End With End Sub 

où:

  • le premier lie votre list ComboBox aux valeurs de plage dont l'adresse est donnée en tant RowSource propriété ComboBox RowSource

  • ce dernier prend les valeurs de la gamme donnée comme valeurs Combobox