Publicité
Tatiak
20 novembre 2016

ComboBox en cascade ou ComboBox liées

Un besoin récurent en VBA est de pouvoir obtenir une liste de choix en fonction d'un premier choix fait dans une première liste déroulante.

En fait ça revient à lister les éléments uniques d'une colonne en fonction d'une première sélection de lignes de données.

La méthode que j'utilise se base sur l'utilisation de tableaux et sur 2 fonctions génériques réutilisables dans tout projet (cf module Tblo) :

  • une fonction de sélection de lignes d'un tableau dont les valeurs d'une colonne correspondent à un premier choix (fonction Select_T de la démo)
  • une fonction de listing d'éléments uniques d'une colonne (fonction Combo_T de la démo)


Dès lors la mise en place du code devient simple :

  1. on charge les données dans une variable tableau (cf sub test_court)
  2. on alimente la première liste déroulante (1 seule ligne de code : dans la démo sub Userform_Initialize)
  3. à la suite d'un choix dans cette première liste, on filtre le tableau (sub filtre) et on alimente la deuxième liste déroulante (toujours par une seule ligne de code)


Dans la démo, une troisième liste est alimentée après le deuxième choix tout aussi simplement par une seule ligne de code, et on pourrait continuer 4ème, 5ème, ...

L'appel aux 2 fonctions principales est simple :

  • pour filtrer un tableau selon une valeur contenu dans une des colonnes (ex : filtrer les CP d'un département) :

Tableau = Select_T(Tableau, colonne, valeur)

  • pour lister les valeurs uniques d'une colonne du tableau (ex : liste des communes)

Liste = Combo_T(Tableau, "Entête_de_colonne")

A noter l'entête de colonne peut être remplacée par le n° de colonne du tableau, par exemple la ligne :

Liste = Combo_T(Tableau, 2) est valide également


Dans la démo, il y a 2 variantes pour initialiser le tableau :

  • une variante "courte" : si vos données commencent en ligne 2 avec des entêtes en ligne 1
  • une variante "longue" : pour le cas où les entêtes sont sur une autre ligne que la ligne 1 et/ou la première colonne de données n'est pas en colonne A


Voici donc une méthode simple pour alimenter vos ComboBox en cascade, le module "Tblo" étant réutilisable en l'état dans votre projet.

Si la méthode correspond à vos besoins, laissez-moi un commentaire!
Pierre

Téléchargement de : Combo-liées-Tblo5.xlsm

Téléchargement de : Combo-liées-Tblo-et-collage.xlsm

Téléchargement de Combo_liées-Tblo5_5colonnes.xlsm

 

Edit du 10/06/2021 : pour répondre à plusieurs demandes, voici une démo dont les données ne commencent pas par le ligne 1. Le numéro de la première ligne de vos données est à saisir dans le code (ici Ligne = 2)

Combo_liées_Tblo5_disjoint_ligne2.zip

 

Edit du 22/04/2021 : pour répondre à Thérèse, voici une démo comprenant 5 colonnes pour montrer comment ajouter des colonnes si besoin.

Edit du 26/02/2020 : pour répondre à Rico, voici une démo similaire dont les colonnes de données "utiles" sont disjointes. Par rapport à la démo précédente, à noter :

  •  les propriétés de la Listbox1 : ColumnCount=9 (soit colonnes A à I de la feuille source) et Columnwidths qui règle à 0 les colonnes à ne pas afficher
  •  dans le code de l'userform1, la procédure Filtre avec :
    •  la liste des entêtes, ici =>     Hd = Array("Dept", "CP", "Commune")
    • la sélection des données selon ces entêtes => Tusf = Select_T(Tusf, Hd(i - 1), Me.Controls("ComboBox" & i).Value)

Téléchargement de : Combo-liées-Tblo5_disjoint.xlsm

 

Edit du 06/10/2020 : pour répondre à JL_MZ, voici une démo similaire dans laquelle les données sélectionnées sont collées à la suite les unes des autres.

Téléchargement de : Combo_liées_Tblo5_colle_a_la_suite.xlsm

Publicité
Commentaires
M
Genial je vous remercie ininiment
Répondre
O
Je cherche par cette méthode et vos excellentes fonctions à remplir une COMBO avec une colonne excel qui tient 300000 lignes ... Ca fonctionne mais c'est très long .... voir 20 minutes avant de voir apparaitre l'USERFORM...<br /> <br /> <br /> <br /> Comment faire pour que ce soit plus rapide ?
Répondre
L
Bonjour <br /> <br /> Je vous remercie pour ce travail fort utile. Bravo à vous. Je l’ai utilisé pour mon projet. Il marche correctement sauf lorsqu’il s’agit du collage des dates. Le mois et le jour sont inversés. Le format de mes dates est date courte. Je n’arrive pas à résoudre le problème <br /> <br /> Je vous remercie d’avance pour votre aide
Répondre
E
J'ai trouvé pour utiliser d'autre colonne pour les combo. Maintenant je n'arrive pas remplir mes Textbox avec les informations qui se trouve sur la ligne qui a été filtre avec les combobox. Si vous pouviez m'aider<br /> <br /> En vous remerciant
Répondre
E
Merci, si le tableau comporte beaucoup de colonnes, de A à W par exemple, est il possible d'avoir des combos qui filtrent sur A, K, M et v par exemple ?
Répondre
Publicité