Réaliser dans un userform une combobox dynamique

Résolu
whouann Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
 foo -
Bonjour,
Je souhaite réaliser dans un userform une combobox dont le contenu dépend d'une autre.
Exemple:
Feuille excel:
colonneA ColonneB
NOM Prénom
Dupont Pierre
Durant Phillippe
Dupont Marc
... ...

Je souhaite que la première combobox me propose les noms de la colonne A
(Ca je sais faire)
Je souhaiterais que la deuxième combobox me propose les prénoms de la colonne B
Mais uniquement les prénoms pierre et marc si je choisi Dupont dans la première,
et uniquement Phillippe si je choisi Durant.

En espérant être clair.
Je n'ai pas trouvé de réponse sur le forum
Merci d'avance
Whouann

6 réponses

  1. WeaponEDGE
     
    Bonjour,

    En fait tu souhaites tout simplement filtrer sur un NOM

    Pour alimenter ta combobox je suppose que tu as mis ton code dans L'initalisation du userform comme dans l'exemple ci-dessous :

    Sub UserForm_Initialize()
    Dim Nb_Lgn As Long, y As Byte

    Nb_Lgn = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row

    For y = 2 To Nb_Lgn
    Manitou.ComboBox1.AddItem Sheets("Feuil1").Cells(y, 1) 'Alimente le NOM
    Manitou.ComboBox2.AddItem Sheets("Feuil1").Cells(y, 2) 'Alimente le Prénom
    Next i
    End Sub


    Pour le Filtrage il suffit de démarrer une macro au changement de contenu de la Combobox1

    Sur ton userform double click sur ton ComboBox1, il génèrera automatique la macro ComboBox_Change

    Copie ensuite le code suivant :

    Sub ComboBox1_Change()
    Dim Nb_Lgn As Long, y As Byte, NOM_Lgn As Variant
    UserForm1.ComboBox2.Clear 'Vide la ComboBox2

    Nb_Lgn = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row

    For y = 2 To Nb_Lgn
    NOM_Lgn = Sheets("Feuil1").Cells(y, 1)

    If NOM_Lgn = UserForm1.ComboBox1 Then
    UserForm1.ComboBox2.AddItem Sheets("Feuil1").Cells(y, 2)
    End If
    Next i
    End Sub


    Voilà,

    A chaque changement de Nom dans ta combobox1, il videra le contenu de la ComboBox2 et alimentera uniquement les prénoms dont le Nom sera identique à ta sélection.

    Si tu as renommé ton Userform, penses à remplacer tout les Userform1 par le nom que tu lui a donné.
    0
    1. whouann Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
       
      Petit pb,
      je viens de mettre ton code en application, mais un message d'eereur apparait lorsque je le lance:
      "erreur d'exécution '438'
      Propriété ou méthode non gérée par cet objet"

      Merci encore de ton aide


      Voici le code tel que je l'ai transcrit:

      Private Sub ComboBoxetape1_Change()
      'combobox1 correspond à comboboxetape1
      'combobox2 correspond à comboxpanne1
      'userform1 correspond à userformerca
      'j'ai décallé de 1 les valeurs car je n'ai pas de ligne correspondant au titre des colonnes

      Dim Nb_Lgn As Long, y As Byte, NOM_Lgn As Variant

      UserFormerca.ComboBoxpanne1.Clear

      Nb_Lgn = Sheets("base").Cells(Rows.Count, 2).End(xlUp).Row

      For y = 1 To Nb_Lgn
      NOM_Lgn = Sheets("base").Cells(y, 2)
      If NOM_Lgn = UserFormerca.ComboBoxetape1 Then
      UserFormerca.ComboBoxpanne1.AddItem Sheets("base").Cells(y, 3)
      End If
      Next y


      End Sub



      Private Sub UserForm_Initialize()

      Dim Nb_Lgn As Long, y As Byte

      Nb_Lgn = Sheets("base").Cells(Rows.Count, 2).End(xlUp).Row

      For y = 1 To Nb_Lgn
      Manitou.ComboBoxetape1.AddItem Sheets("base").Cell(y, 2)
      Manitou.ComboBoxpanne1.AddItem Sheets("base").Cell(y, 3)
      Next y


      TextBoxdate.Value = Format(Now(), "dd/mm/yyyy")
      TextBoxcodeproduit.Value = ""
      ComboBoxetape1.Enabled = True
      ComboBoxetape2.Enabled = False
      ComboBoxetape3.Enabled = False
      ComboBoxetape4.Enabled = False
      ComboBoxetape5.Enabled = False
      ComboBoxetape6.Enabled = False
      ComboBoxpanne1.Enabled = True
      ComboBoxpanne2.Enabled = False
      ComboBoxpanne3.Enabled = False
      ComboBoxpanne4.Enabled = False
      ComboBoxpanne5.Enabled = False
      ComboBoxpanne6.Enabled = False
      ComboBoxcause1.Enabled = False
      ComboBoxcause2.Enabled = False
      ComboBoxcause3.Enabled = False
      ComboBoxcause4.Enabled = False
      ComboBoxcause5.Enabled = False
      ComboBoxcause6.Enabled = False
      TextBoxquantite1.Enabled = False
      TextBoxquantite2.Enabled = False
      TextBoxquantite3.Enabled = False
      TextBoxquantite4.Enabled = False
      TextBoxquantite5.Enabled = False
      TextBoxquantite6.Enabled = False

      End Sub
      0
    2. whouann Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
       
      pour plus de clarté voici mon fichier:
      https://www.cjoint.com/?CIfqwa9X1HZ
      0
  2. foo
     
    Bonjour

    Voila un modele de combobox

    http://cjoint.com/?3IekTafACGK

    A+

    Maurice
    0
  3. whouann Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
     
    Super,
    merci beaucoup à tous pour la qualité et la rapidité de vos réponses.
    Je teste cela dés que possible.
    Encore merci
    Whouann
    0
  4. foo
     
    Bonjour

    voila la rectif

    Dim Nb_Lgn As Long, Lig As Byte

    Nb_Lgn = Feuil12.Range("B" & Rows.Count).End(xlUp).Row

    For Lig = 1 To Nb_Lgn
    ComboBoxetape1.AddItem Feuil12.Cells(Lig, 2)
    ComboBoxpanne1.AddItem Feuil12.Cells(Lig, 3)
    Next

    A+
    Maurice
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. whouann Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
     
    Ca marche, et dernière question:
    comment retirer les doublons du menu déroulant?
    Merci pour le temps accordé, ca fait plaisir.
    Whouann
    0
  7. foo
     
    Bonjour

    Combobox sans doublons

    ComboBoxetape1.Clear
    For i = 1 To Feuil12.Range("B" & Rows.Count).End(xlUp).Row
    ComboBoxetape1 = Feuil12.Range("B" & i)
    If ComboBoxetape1.ListIndex = -1 Then ComboBoxetape1.AddItem Feuil12.Range("B" & i)
    Next i
    ComboBoxetape1.ListIndex = -1

    A+
    Maurice
    0