Microsoft 365 ComboBox en cascade

  • Initiateur de la discussion Initiateur de la discussion juju91
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

juju91

XLDnaute Junior
Bonjour,

J'aurais encore besoin de votre aide.
Est il possible de mettre en cascade deux ComboBox comme pour les listes déroulantes.
Dans une feuille j'ai un ComboBOX qui est alimenté par une liste .
Chaque élément de la liste correspond à des listes de produits.
Comme précédemment indiqué, je souhaiterais, avec le premier comboBOX sélectionner le type d'article afin d'avoir accès, dans le deuxième comboBOX à la liste des a articles correspondant (le choix de l'article dans le 2e comboBox déclenche une macro qui va enregistrer le résultat sur la dernière ligne d'une plage donnée).


Je ne suis pas sûr d'avoir été très clair, je mets donc un fichier exemple ci-joint.


Par avance merci aux personnes qui pourront m'aider

Cdt
 

Pièces jointes

Hello

ta feulle BDDprod est très mal foutue je trouve
1) il faut transformer les tableaux en Table Structurée
2) la table "t_Famille_Produit" sert à alimenter la première cellule jaune avec une simple liste de validation (plus besoin de combobox)
3) donner aux différentes tables le MEME nom que celui qui est utilisé dans la table "t_Famille_Produit"

4) dans la seconde cellule jaune (à la place de ton deuxième combo), une autre formule pour la liste de validation, et voila;. le tour est joué
 

Pièces jointes

Bonjour vgendron et merci de votre retour rapide.

je pense qu'il faut que je passe par un combobox pour deux raisons.
- Il faut que le comboBOX 2 soit sur deux colonnes
- Il faut, aussi que je puisse lancer une macro quand le choix a été fait dans le comboBox 2.

Je vais regarder si on peut faire tout cela avec des listes .

encore merci pour votre temps .
 
Bonjour vgendro

Merci c'est ''presque '' parfait désolé.
En faite j'avais une macro qui se déclenchait lors de la sélection dans le combobox2.
Cette Macro copiait la cellule liée au comboBox puis la collait dans la première cellule vide d'une plage de donnée définie.
Ci-dessous le code .

Private Sub FILTRE3_Change()
Range("H2").Copy
Cells((Range("G5:G17").End(xlDown).Row + 1), 7).Select 'Value = "a"
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
End Sub

Auriez-vous un début de solution afin que cette "fonctionnalité'' puisse être de nouveau réalisable.

Je suis vraiment désolé de compliquer ma demande.

Cdt
 
hello
dans ton fichier, je n'ai pas vu de macro "Filtre3" pas plus que de combobox2

mais à priori, le besoin donnerait ca:

VB:
Private Sub ComboBox1_Change() 'charge le combo "Filtre2" en fonction du choix du combobox1
    If Me.ComboBox1 = "" Then Exit Sub
    
    Me.FILTRE2.List = Sheets("BD Prod2").ListObjects("t_" & ComboBox1).DataBodyRange.Value
    Me.FILTRE2.ListIndex = -1
End Sub

Private Sub Worksheet_Activate() 'permet de charger le combo
    Me.ComboBox1.List = Sheets("BD Prod2").ListObjects("t_Famille_Produit").DataBodyRange.Value
    Me.ComboBox1.ListIndex = -1
End Sub

Private Sub FILTRE2_Change()
    With ActiveSheet 'avec la feuille active
        .Range("G" & .Rows.Count).End(xlUp).Offset(1, 0) = Me.FILTRE2 'on met le contenu du combo "Filtre2" dans la première ligne vide de la colonne G
    End With
End Sub
 
Bonjour,

Un grand merci.
Bon, cela fait quatre jours que je chercher la solution mais je rencontre un problème quand je veux transposer les codes sur mon fichier original.
je les ai recopié, en modifiant les nom des onglets, qui sont différents.
et j'ai un message d'erreur qui apparait dans : Private Sub Worksheet_Activate sur le " .ComboBox1 "
1745168709416.png

Je ne comprends pas .
Je pensais avoir modifié correctement les codes.
cette fois ci, je joint le fichier original, il n'y a pas certains onglets mais ils ne sont pas liés à ceux du fichier en copie.
En espérant ne pas trop abuser de votre temps.

Cdt
 
Bonne nuit à toutes & à tous,
Bonne nuit @juju91
À tout hasard une version avec
  • des formules matricielles dynamiques,
  • un nom pour identifier les colonnes contenant les familles de produit dans "BD PROD2"
  • deux noms pour gérer les listes des deux combos
  • deux noms pour récupérer les choix faits
  • un Tableau Structuré "TS_Offres" pour collecter les choix faits avec deux colonnes (les produits et les nombres situés juste à droite des produits)
  • la macro de mise à jour du TS :
    VB:
    if Auto Or CBx_ChoixProduit.ListIndex = -1 Then Exit Sub
    [/LIST]
    Application.ScreenUpdating = False
    Auto = True
        
         idx = CBx_ChoixProduit.ListIndex + 1  'Index du produit choisi dans la liste des produits
        
         [F4].Select 'Retirer le focus de la ComboBox
         [ProduitChoisi].ClearContents
         CBx_ChoixProduit.ListIndex = -1
        
         Produits = [ListeProduits].Value2  'Liste des des produits de la famille sélectionnée (avec une 2ème colonne numérique)
        
         MoinsUn = IsEmpty([TS_Offres[Produit]].Rows(1).Value2) '(vaut -1 si vrai : TS vide)
        
         'Stocker dans le TS
         Set Cible = [TS_Offres[Produit]].Rows([TS_Offres].Rows.Count + MoinsUn + 1)
         Cible.Value2 = Produits(idx, 1)
         Cible.Offset(0, 3).Value2 = Produits(idx, 2)
        
    Auto = False
    End Sub
  • La macro pour vider le TS :
    Code:
    Sub RàZ_Offres()
    [/LIST]
         With [TS_Offres]
              .ClearContents
              .ListObject.Resize .Offset(-1).Resize(2)
         End With
    End Sub

    Voir la pièce jointe
    À bientôt
 

Pièces jointes

OUPS !!!

En effet c'est mieux avec la pièce jointe .......
Bonjour,

Tu t'es emmêlé les pinceaux. Tu n'as pas de tableaux structurés dans ton fichier. Mais des plages de cellules nommées.

Donc, il faut mettre
VB:
Me.ComboBox1.List = Sheets("BD PROD").Range("t_Famille_Produit").Value
au lieu de
Code:
Sheets("BD PROD").ListObjects("t_Famille_Produit").DataBodyRange.Value
Il faudrait aussi que tu vérifies que toutes tes plages nommées ne soient pas vides.

Bonne journée.
 
Bonjour à toutes & à tous,
Bonjour @juju91
Avec la même démarche que pour le post #9, mais adapté à ton fichier "_COMBOBOX EN CASCADE V5.xlsm"
(Les intitulés des noms ont un peu changé)
Remarques :
  • Les listes ne sont pas toujours cohérentes avec les intitulés des colonnes (cf CONFISERIE, VIENNOISERIES)
  • Ne pas laisser de cellules vides parmi les produits (j'ai mis à la place une suite de ═)
La macro
VB:
Dim Auto As Boolean

Private Sub CBx_ChoixProduits_Change()

If Auto Or CBx_ChoixProduits.ListIndex = -1 Then Exit Sub
Application.ScreenUpdating = False
Auto = True
    
     idx = CBx_ChoixProduits.ListIndex + 1  'Index du produit choisi dans la liste des produits
    
     [F4].Select 'Retirer le focus de la ComboBox
     [n_ProduitChoisi].ClearContents
     CBx_ChoixProduits.ListIndex = -1
    
     Produits = [n_ListeProduits].Value2  'Liste des des produits de la famille sélectionnée (avec une 2ème colonne numérique)
    
     MoinsUn = IsEmpty([TS_OFFRE[Produits]].Rows(1).Value2) '(vaut -1 si vrai : TS vide)
    
     'Stocker dans le TS
     Set Cible = [TS_OFFRE[Produits]].Rows([TS_OFFRE].Rows.Count + MoinsUn + 1)
     Cible.Value2 = Produits(idx, 1)
'    Cible.Offset(0, 3).Value2 = Produits(idx, 2) '(si besoin de la colonne adjacente)
    
Auto = False
End Sub

Voir la pièce jointe
À bientôt
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
6
Affichages
81
Réponses
28
Affichages
2 K
Réponses
3
Affichages
386
Retour