Liste déroulante à partir d'un tableau
Bonjour à tous,
Excusez-moi si ce cas a déjà été abordé mais le grand nombre de résultats lors de ma recherche sur le forum m'a découragé de tout parcourir.
Je suis débutant en VBA. Je souhaite remplir les ComboBox de mon UserForm à partir d'une feuille contenant toutes les listes.
J'ai tout d'abord écrit un code redondant très "amateur" qui fonctionnait mais je souhaite travailler l'utilisation des boucles pour le simplifier et éviter cette redondance.
J'ai stocké dans un tableau cblist() les valeurs correspondant aux noms de mes différentes ComboBox.
Une boucle principale parcoure toutes les colonnes correspondant à la liste correspondant à chaque ComboBox.
Une seconde boucle placée à l'intérieur de la précédente sélectionne chaque ComboBox pour y adjoindre les items de sa liste correspondante.
Private Sub UserForm_Activate()
Dim ligne%: Dim colonne%: Dim nbcolonnes%
Dim cblist(8): Dim i%
cblist(0) = "cb_activite"
cblist(1) = "cb_type_erreur"
cblist(2) = "cb_detection"
cblist(3) = "cb_client"
cblist(4) = "cb_type_module"
cblist(5) = "cb_kit"
cblist(6) = "cb_fiche_critique"
cblist(7) = "cb_zone"
cblist(8) = "cb_type_mission"
nbcolonnes = Worksheets("ListesMenu").Cells.SpecialCells(xlCellTypeLastCell).Column
For colonne = 1 To nbcolonnes
For i = 0 To 8
ligne = 2
While (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value <> "")
cblist(i).AddItem (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value)
ligne = ligne + 1
Wend
Next i
Next colonne
ThisWorkbook.Worksheets("Tableau des erreurs").Activate
End SubCe code ne fonctionne pas et le débogage m'indique "Objet requis". Je me dis alors que des valeurs stockées dans un tableau ne renvoie pas à l'"objet" correspondant lorsqu'elles sont appelées.
Après quelques recherches, je tente de placer un objet Controls (sans avoir vraiment compris le rôle de celui-ci) qui contient le renvoie au tableau et le résultat fonctionne sauf que mes ComboBox contiennent toutes une concaténation de toutes les listes.
For colonne = 1 To nbcolonnes
For i = 0 To 8
ligne = 2
While (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value <> "")
Controls(cblist(i)).AddItem (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value)
ligne = ligne + 1
Wend
Next i
Next colonneIl me semble comprendre que l'utilisation d'un tableau pour stocker les noms d'"objets" peut fonctionner mais pourquoi alors ma première approche me renvoie une erreur "Objet requis" ?
Et pourquoi l'utilisation d'un objet Controls semble résoudre (en partie seulement) ce problème ?
Comment puis-je éviter cette concaténation de toutes les listes dans chaque ComboBox ?
Je vous remercie grandement pour votre aide !
Bonjour,
Il faudrait un fichier de travail...
Il faut créer l'objet à l'aide de la boite à outil, ensuite il sera disponible.
C'est quoi cette idée de tableau de combobox ?!? Tu ne te facilite pas la tache en tant que débutant
J'ai l'impression que tu as sauté beaucoup trop d'étapes en pensant que programmer était inné.
Il faut commencer par les bases, les tutos ne manquent pas.
Regarde les cours VBA ici dans le menu en haut
Une fois que tu connais la plage, remplis-le en une seule instruction : ComboBox1.List = Range("A1:A10").Value
Ou ComboBox1.List = Range("A1:A" & Cells(Application.Rows.Count, 1).End(xlUp).Row).Value de A1 à la dernière cellule utilisée de A
eric
Sur cet exemple précis, il m'est compliqué de partager le tableau car je le conçois dans le cadre professionnel et il contient des informations qui doivent rester privées.
Je ne souhaite pas changer pas les valeurs contenues dans le tableau cblist() avec cette boucle, mais qu'elle fournisse le nom de chaque ComboBox afin de faire apparaître dans sa liste déroulante les valeurs correspondantes. Je suis débutant en VBA mais ait des notions basiques en Python.
J'ai cependant réussi à résoudre mon problème, bien que j'ai opté pour la solution d'écrire des données en dur dans le code et que cela ne me plaise pas beaucoup (à l'avenir, je compte par exemple remplacer le tableau cblist(8) par un tableau dynamique qui pourra gérer l'ajout de ComboBox et l'affectation des listes déroulantes correspondantes à partir des valeurs d'une feuille).
Afin de ne pas écrire directement l'index de la colonne dans le code , je suis rester arque bouté sur l'utilisation de deux boucles imbriquées alors que j'aurais dû aller au plus simple.
J'ai donc supprimer la boucle qui gérait le passage d'une colonne à une autre (et qui de toute évidence ne faisait pas son travail bien que je ne comprenne pas encore bien pourquoi) et tout simplement attribué à une variable l'index de la première colonne, incrémentée de 1 à chaque cycle. Le résultat est satisfaisant pour le moment.
colonne = 1
For i = 0 To 8
ligne = 2
While (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value <> "")
Controls(cblist(i)).AddItem (ThisWorkbook.Worksheets("ListesMenu").Cells(ligne, colonne).Value)
ligne = ligne + 1
Wend
colonne = colonne + 1
Next iJ'espère tout de même pouvoir trouver plus tard le moyen de me passer totalement de données en dur directement dans le code afin de pouvoir facilement déployer un module sur un autre classeur.
Merci toutefois pour ta réponse, bonne soirée à toi