Lier deux combobox

Résolu
Bonjour,

Comme l'annonce le titre, je souhaite lier 2 combobox. Je travaille sur un userform sur excel 2010.

En fait ma première combobox me permet de choisir un client parmi ma colonne E. EN fonction de ce choix je voudrais que ma seconde combobox m'affiche l'information de la même ligne de la colonne H.

Merci par avance (et j'espère avoir été assez clair)

12 réponses

Résumé de la discussion

Lier deux combobox dans un UserForm sur Excel 2010 pour que le choix d'un client dans la première affiche l'information correspondante de la même ligne dans la seconde. Les solutions proposées utilisent un dictionnaire (Scripting.Dictionary) pour distinguer les clients et les informations liées, puis préremplissent la première combobox avec les clients et alimentent la seconde en fonction du client sélectionné. Dans l'exemple, les données proviennent de la colonne D et les valeurs affichées dans la seconde combobox proviennent de la colonne H, associées à chaque ligne par la correspondance client en colonne E. En cas de colonnes vides ou de doublons, des ajustements de filtres ou une réorganisation des données peuvent être nécessaires pour que les combobox restent synchronisées.

Bobot (l’IA à votre service)
  1. Modérateur
    Alors voilà.
    Tu peux même oublier ton .AddItem pour la ComboBox1 et là tester dans cet état...

    Option Explicit
    Option Compare Text
    
    Dim f As Worksheet, c As Range
    
    'source : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#AlimenterListe
    Private Sub UserForm_Initialize()
    Dim temp(), dico As Object, dicoCombo2 As Object
    
      Set f = Sheets("Feuil1")
      Set dico = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("D2:D" & f.[D65000].End(xlUp).Row)
         dico(c.Value) = ""
      Next c
      temp = dico.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox1.Clear
      Me.ComboBox1.List = temp
    End Sub
    
    Private Sub ComboBox1_Change()
    Dim temp(), dico As Object, dicoCombo2 As Object
      If ComboBox1 = "" Then Exit Sub
      Set f = Sheets("Feuil1")
      Set dico = CreateObject("Scripting.Dictionary")
      Set dicoCombo2 = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("D2:D" & f.[D65000].End(xlUp).Row)
        If c.Value = ComboBox1 Then dicoCombo2(c.Offset(0, 3).Value) = ""
        If Not dico.exists(c.Offset(0, 1).Value) And c.Value = ComboBox1 Then
          dico(c.Offset(0, 1).Value) = ""
        End If
      Next c
      temp = dico.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox9.Clear
      Me.ComboBox9.List = temp
      temp = dicoCombo2.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox2.Clear
      Me.ComboBox2.List = temp
    End Sub
    
    Private Sub ComboBox9_Change()
    Dim temp(), dico As Object, dicoCombo2 As Object
      If ComboBox9 = "" Then Exit Sub
      Set f = Sheets("Feuil1")
      Set dico = CreateObject("Scripting.Dictionary")
      Set dicoCombo2 = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("D2:D" & f.[D65000].End(xlUp).Row)
        If c.Value = ComboBox1 And c.Offset(0, 1).Value = ComboBox9 Then dicoCombo2(c.Offset(0, 3).Value) = ""
        If Not dico.exists(c.Offset(0, 2).Value) And c.Value = ComboBox1 And c.Offset(0, 1).Value = ComboBox9 Then
          dico(c.Offset(0, 2).Value) = ""
        End If
      Next c
      temp = dico.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox10.Clear
      Me.ComboBox10.List = temp
      temp = dicoCombo2.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox2.Clear
      Me.ComboBox2.List = temp
    End Sub
    
    Private Sub combobox10_Change()
    Dim dico As Object, dicoCombo2 As Object
    
    'ComboBox10.Value = UCase(ComboBox10.Value)
    
    Dim temp()
      If ComboBox10 = "" Then Exit Sub
      Set f = Sheets("Feuil1")
      Set dico = CreateObject("Scripting.Dictionary")
      Set dicoCombo2 = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("D2:D" & f.[D65000].End(xlUp).Row)
        If Not dico.exists(c.Offset(0, 3).Value) And c.Value = ComboBox1 And c.Offset(0, 1).Value = ComboBox9 And c.Offset(0, 2).Value = ComboBox10 Then
          dico(c.Offset(0, 3).Value) = ""
        End If
      Next c
      temp = dico.keys
      Call tri(temp, LBound(temp), UBound(temp))
      ComboBox2.Clear
      Me.ComboBox2.List = temp
    End Sub
    
    Sub tri(a, gauc, droi) ' Quick sort
    Dim ref, g, d, temp
      ref = a((gauc + droi) / 2)
      g = gauc: d = droi
      Do
        Do While a(g) < ref: g = g + 1: Loop
        Do While ref < a(d): d = d - 1: Loop
        If g <= d Then
          temp = a(g): a(g) = a(d): a(d) = temp
          g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call tri(a, g, droi)
      If gauc < d Then Call tri(a, gauc, d)
    End Sub


    1. Pijaku : MERCI !!!

      Je crois que je n'ai jamais fait autant chier quelqu'un et pourtant t'es toujours là :)

      UN GRAND MERCI :)
    2. Modérateur
      de rien, n'hésite pas.
      A+
  2. Modérateur
    Bonjour,

    A quoi sert une ComboBox qui n'affiche qu'une valeur?
    Personnellement, j'utilise un label pour y mettre une seule donnée.
    Voici le code :
    Private Sub ComboBox1_Change()
    Dim rngTrouve As Range
    
    If ComboBox1 = "" Then Exit Sub
    With Sheets("Feuil1") ' A ADAPTER : nom de la feuille contenant les données
        Set rngTrouve = .Columns(5).Cells.Find(ComboBox1, lookat:=xlWhole)
    End With
    'cas d'une combobox
    If Not rngTrouve Is Nothing Then ComboBox2 = rngTrouve.Offset(0, 3)
    'cas d'un label
    If Not rngTrouve Is Nothing Then Label1.Caption = rngTrouve.Offset(0, 3)
    End Sub


    1. Effectivement si je n'avais qu'un seul choix ce serait un label.
      Mais je n'ai jamais dit qu'il n'y a qu'un choix.

      En effet dans la colonne E, j'ai plusieurs fois le même client (ou entreprise) et en colonne H des noms associer au client. D'ou le fait de vouloir afficher en fonction de la combobox1 toutes les personnes d'une entreprise :)

      Je vais tester, Merci
      1. Pijaku,

        J'ai essayé d'adapter ton code à ma problématique (La combobox2 est alimenté par la colonne E et la combobox7 par la colonne H) mais la combobox7 reste vide après selection d'un client dans la combobox2. Pourrais-tu m'aider ?

        Private Sub ComboBox7_Change()
        Dim rngTrouve As Range
        Dim Wks As Worksheet
        
                Set Wks = Sheets(NomUtilisateur)
                Sheets(NomUtilisateur).Activate
        
                       With Sheets(NomUtilisateur)
        
                Set rngTrouve = .Columns(5).Cells.Find(ComboBox2, lookat:=xlWhole)
        
                       End With
        
                If Not rngTrouve Is Nothing Then ComboBox7 = rngTrouve.Offset(0, 3)
        
        End Sub


        Merci
        1. Modérateur
          Si tu changes la valeur de la combobox2, il faut utilisere l'événement Change de la Combobox2, pas de la 7.........
          Private Sub ComboBox2_Change() 'ICI!!!!!!!!!!!!!!!! ComboBox2
          Dim rngTrouve As Range
          Dim Wks As Worksheet
          
                  Set Wks = Sheets(NomUtilisateur)
                  Sheets(NomUtilisateur).Activate
          
                         With Sheets(NomUtilisateur)
          
                  Set rngTrouve = .Columns(5).Cells.Find(ComboBox2, lookat:=xlWhole)
          
                         End With
          
                  If Not rngTrouve Is Nothing Then ComboBox7 = rngTrouve.Offset(0, 3)
          
          End Sub
        2. J'avais essayé ainsi mais j'avais rebroussé chemin, car il m'est dit "nom ambigu detecté : ~"
        3. Modérateur
          nom ambigu detecté :
          Tu as donc 2 procédures ComboBox2_Change()
          Mets les 2 codes dans la même s'ils sont compatibles...
          Ou alors copie/colle tes deux codes ici qu'on les rende compatibles.

          Ou alors passe nous une copie de ton classeur...
        4. Bonjour Pijaku,

          Effectivement cela marche beaucoup mieux (j'avais effectivemetn 2 procédures change)
          Serait-il possible que la combobox ne se charge pas directement mais que l'on doive choisir parmi les choix possible ? Car actuellement elle affiche d'emblée lorsque la combobox2 change une possiblité.

          Merci
        5. Modérateur
          Salut,

          Maintenant je ne comprends plus...
          Tu demandes à ce que ta combobox7 affiche le résultat d'une recherche en fonction de la combobox2, et maintenant, tu veux pouvoir choisir ta valeur dans la combo7.
          Explique moi mieux ce que tu souhaites...
      2. Bonjour Pijaku,

        Petite incursion supplémentaire si cela est possible.

        J'ai rajouté deux arborescences supplémentaires. La combobox2 (qui determine un choix d'entreprise) en colonne (E) permet un choix restreint sur la combobox3 colonne F (détermine la direction) et qui détermine un choix restreint sur la combobox4 colonne G (determine le bureau).

        Bref, il s'agit de rajouter 2 niveaux mais de ne pas en tenir compte si aucun choix n'est effectué dans les combobox3 et combobox4. Ais-je été clair ?
        1. Modérateur
          C'est clair.
          Toutefois, une précision s'impose. Si aucun choix n'est effectué dans les ComboBox 3 et 4 que se passe t'il? Ces 2 Combo sont remplies de données quand même? Si oui lesquelles?

          Pour l'erreur de tri, dans la ligne ref = a((gauc + droi) \ 2) le souci vient de mon copié collé qui a transformé (je ne sais pas pourquoi, certainement à cause du php de ce forum) le / initial (divisé par) en \.
          Essaye donc avec :
           ref = a((gauc + droi) / 2) 
        2. Il se peut que les colonnes F et G ne soient pas rempli et que donc aucunes données ne figurent en combobox3 et combobox4

          Merci pour le code tri
        3. Modérateur
          dernière question (qui me simplifierais la tâche...) les numéros des combos sont bien 2, 3, 4 et elles sont bien alimentées par les colonnes E, F et G???

          Dis moi oui............
        4. Maintenant que tu le dis...
          Combobox 2,9 et 10 alimenté respectivement par colonne E, F et G. Merci :)
        5. Modérateur
          pffffffffffff
      3. Modérateur
        remplace tout le code donné précédemment par celui-ci.
        Il permet également le tri des trois combo........
        Option Explicit
        Option Compare Text
        
        Dim f As Worksheet, c As Range, dico As Object
        
        'source : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#AlimenterListe
        Private Sub UserForm_Initialize()
        Dim temp()
        
          Set f = Sheets("Feuil1")
          Set dico = CreateObject("Scripting.Dictionary")
          For Each c In f.Range("E2:E" & f.[E65000].End(xlUp).Row)
             dico(c.Value) = IIf(dico.exists(c.Value), dico(c.Value) & "*" & c.Offset(, -1), c.Offset(, -1))
          Next c
          temp = dico.keys
          Call tri(temp, LBound(temp), UBound(temp))
          ComboBox2.Clear
          Me.ComboBox2.List = temp
        End Sub
        
        Private Sub ComboBox2_Change()
        Dim temp()
          If ComboBox2 = "" Then Exit Sub
          Set f = Sheets("Feuil1")
          Set dico = CreateObject("Scripting.Dictionary")
          For Each c In f.Range("E2:E" & f.[E65000].End(xlUp).Row)
            If Not dico.exists(c.Offset(0, 1).Value) And c.Value = ComboBox2 Then
              dico(c.Offset(0, 1).Value) = ""
            End If
          Next c
          temp = dico.keys
          Call tri(temp, LBound(temp), UBound(temp))
          ComboBox9.Clear
          Me.ComboBox9.List = temp
        End Sub
        
        Private Sub ComboBox9_Change()
        Dim temp()
          If ComboBox9 = "" Then Exit Sub
          Set f = Sheets("Feuil1")
          Set dico = CreateObject("Scripting.Dictionary")
          For Each c In f.Range("E2:E" & f.[E65000].End(xlUp).Row)
            If Not dico.exists(c.Offset(0, 2).Value) And c.Value = ComboBox2 And c.Offset(0, 1).Value = ComboBox9 Then
              dico(c.Offset(0, 2).Value) = ""
            End If
          Next c
          temp = dico.keys
          Call tri(temp, LBound(temp), UBound(temp))
          ComboBox10.Clear
          Me.ComboBox10.List = temp
        End Sub
        
        Sub tri(a, gauc, droi) ' Quick sort
        Dim ref, g, d, temp
          ref = a((gauc + droi) / 2)
          g = gauc: d = droi
          Do
            Do While a(g) < ref: g = g + 1: Loop
            Do While ref < a(d): d = d - 1: Loop
            If g <= d Then
              temp = a(g): a(g) = a(d): a(d) = temp
              g = g + 1: d = d - 1
            End If
          Loop While g <= d
          If g < droi Then Call tri(a, g, droi)
          If gauc < d Then Call tri(a, gauc, d)
        End Sub


        1. Puis-je totalement abusé ? Car pour adapter je m'en mêle les pinceaux, je pensais en effet que cela serait plus simple...

          Tout le code donné précédemment m'est utile pour déterminer ma combobox7.

          Option Compare Text
          Dim f, dico
          'source : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#AlimenterListe
          Private Sub UserForm_Initialize()
            Set f = Sheets("Feuil1")
            Set dico = CreateObject("Scripting.Dictionary")
            For Each c In f.Range("E2:E" & f.[E65000].End(xlUp).Row)
               dico(c.Value) = IIf(dico.exists(c.Value), dico(c.Value) & "*" & c.Offset(, -1), c.Offset(, -1))
            Next c
            temp = dico.keys
            Call tri(temp, LBound(temp), UBound(temp))
            ComboBox2.Clear
            Me.ComboBox2.List = temp
          End Sub
          
          Private Sub ComboBox2_Change()
            If ComboBox2 = "" Then Exit Sub
            ComboBox7.Clear
            Set f = Sheets("Feuil1")
            For Each c In f.Range("E2:E" & f.[E65000].End(xlUp).Row)
              If c.Value = ComboBox2 Then ComboBox7.AddItem c.Offset(0, 3).Value
            Next c
          End Sub
          
          Sub tri(a, gauc, droi) ' Quick sort
            ref = a((gauc + droi) \ 2)
            g = gauc: d = droi
            Do
              Do While a(g) < ref: g = g + 1: Loop
              Do While ref < a(d): d = d - 1: Loop
              If g <= d Then
                temp = a(g): a(g) = a(d): a(d) = temp
                g = g + 1: d = d - 1
              End If
            Loop While g <= d
            If g < droi Then Call tri(a, g, droi)
            If gauc < d Then Call tri(a, gauc, d)
          End Sub


          A présent, et c'était mon 2ème message je souhaitais l'adapter pour de nouveaux besoins. Je me disais que je pourrais transformer sans problème mais ce n'est pas le cas...

          En réalité j'ai trois niveaux d'arborescence : combobox1 (déterminé par additem), combobox9 (déterminé par le choix en combobox1 et prenant ses données en colonne E) et combobox10 (déterminé par le choix en combobox9 et prenant ses données en colonne F)
          Tout cela permet de déterminer le choix dans la combobox2. Si tout va bien les possiblités sont faites en fonction du choix en combobox10. Si la combobox10 n'est pas rempli cela se fait en fonction de la combobox9. Et si la 9 n'est pas rempli, cela se fait en fonction de la combobox1.

          Bref depuis tout à l'heure j'essaye d'adapter mais je plante... Peut être à cause du précédent code qui alimente la combobox2 à l'initialisation mais j'en ai besoin sinon pas de données...

          Je sais que j'en demande beaucoup et je comprendrais que cette question reste sans suite. Mais par avance merci
          1. J'ai rajouté un niveau c'est à dire combobox10_change() de la sorte :

            Private Sub combobox10_Change()
            ComboBox10.Value = UCase(ComboBox10.Value)
            
            Dim temp()
              If ComboBox10 = "" Then Exit Sub
              Set wks = Sheets(NomUtilisateur)
              Set dico = CreateObject("Scripting.Dictionary")
              For Each c In wks.Range("D2:D" & wks.[D65000].End(xlUp).Row)
                If Not dico.exists(c.Offset(0, 3).Value) And c.Value = ComboBox1 And c.Offset(0, 2).Value = ComboBox10 Then
                  dico(c.Offset(0, 3).Value) = ""
                End If
              Next c
              temp = dico.keys
            '  Call tri(temp, LBound(temp), UBound(temp))
              ComboBox2.Clear
              Me.ComboBox2.List = temp
              
            End Sub


            Cela me permet d'avoir les choix en combobox2, le seul problème est que je n'ai pas de choix si la combobox9 et combobox10 sont vides...
            Finalement c'est en désespérant que ca avance...
            1. Modérateur
              Finalement, si tu avais tout dit dès le départ, je n'aurais pas bossé dans le vent non????

              What else? ose-je te demander de suite.....
            2. Tu n'as pas bossé dans le vent car ce code me sert... La preuve je l'ai adapté sans toi cela n'aurai pas été possible.
              Maintenant mon seul problème vient du fait que si les combobox9 et 10 ne sont pas remplis la combobox 2 ne se remplit pas (même si dans la 1 figure un choix) et cela n'apparassait pas dans les précédentes versions.

              En tout cas je suis désolé si tu as eu l'impression de travailler dans le vide mais ce n'est pas le cas et ça m'a réellement permis d'avancer. Merci
            3. Modérateur
              Bon j'veux bien regarder à ça mais c'est bien le dernier cas de figure?????????
          2. Mon seul problème dorénavant est d'avoir un choix même si la combobox9 et 10 ne sont pas rempli... J'espère que tu ne désespère pas...
            1. Modérateur
              Dans mon exemple, j'ai utilisé Combo 1, 9, 10 et 2 reliées respectivements aux colonnes A, B, C, D.
              Cependant, la ligne : For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row) n'est à changer que si ta Combo1 ne correspond pas à la colonne A. Pour faire varier les données des autres combo, tu dois chercher dans les Offset...

              Option Explicit
              Option Compare Text
              
              Dim f As Worksheet, c As Range
              
              'source : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#AlimenterListe
              Private Sub UserForm_Initialize()
              Dim temp(), dico As Object, dicoCombo2 As Object
              
                Set f = Sheets("Feuil1")
                Set dico = CreateObject("Scripting.Dictionary")
                For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
                   dico(c.Value) = ""
                Next c
                temp = dico.keys
                Call tri(temp, LBound(temp), UBound(temp))
                ComboBox1.Clear
                Me.ComboBox1.List = temp
              End Sub
              
              Private Sub ComboBox1_Change()
              Dim temp(), dico As Object, dicoCombo2 As Object
                If ComboBox1 = "" Then Exit Sub
                Set f = Sheets("Feuil1")
                Set dico = CreateObject("Scripting.Dictionary")
                Set dicoCombo2 = CreateObject("Scripting.Dictionary")
                For Each c In f.Range("A1:A" & f.[A65000].End(xlUp).Row)
                  If Not dico.exists(c.Offset(0, 1).Value) And c.Value = ComboBox1 Then
                    dico(c.Offset(0, 1).Value) = ""
                    dicoCombo2(c.Offset(0, 3).Value) = ""
                  End If
                Next c
                temp = dico.keys
                Call tri(temp, LBound(temp), UBound(temp))
                ComboBox9.Clear
                Me.ComboBox9.List = temp
                temp = dicoCombo2.keys
                Call tri(temp, LBound(temp), UBound(temp))
                ComboBox2.Clear
                Me.ComboBox2.List = temp
              End Sub
              
              Private Sub ComboBox9_Change()
              Dim temp(), dico As Object, dicoCombo2 As Object
                If ComboBox9 = "" Then Exit Sub
                Set f = Sheets("Feuil1")
                Set dico = CreateObject("Scripting.Dictionary")
                Set dicoCombo2 = CreateObject("Scripting.Dictionary")
                For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
                  If Not dico.exists(c.Offset(0, 2).Value) And c.Value = ComboBox1 And c.Offset(0, 1).Value = ComboBox9 Then
                    dico(c.Offset(0, 2).Value) = ""
                    dicoCombo2(c.Offset(0, 3).Value) = ""
                  End If
                Next c
                temp = dico.keys
                Call tri(temp, LBound(temp), UBound(temp))
                ComboBox10.Clear
                Me.ComboBox10.List = temp
                temp = dicoCombo2.keys
                Call tri(temp, LBound(temp), UBound(temp))
                ComboBox2.Clear
                Me.ComboBox2.List = temp
              End Sub
              
              Private Sub combobox10_Change()
              Dim dico As Object, dicoCombo2 As Object
              
              'ComboBox10.Value = UCase(ComboBox10.Value)
              
              Dim temp()
                If ComboBox10 = "" Then Exit Sub
                Set f = Sheets("Feuil1")
                Set dico = CreateObject("Scripting.Dictionary")
                Set dicoCombo2 = CreateObject("Scripting.Dictionary")
                For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
                  If Not dico.exists(c.Offset(0, 3).Value) And c.Value = ComboBox1 And c.Offset(0, 1).Value = ComboBox9 And c.Offset(0, 2).Value = ComboBox10 Then
                    dico(c.Offset(0, 3).Value) = ""
                  End If
                Next c
                temp = dico.keys
                'Call tri(temp, LBound(temp), UBound(temp))
                ComboBox2.Clear
                Me.ComboBox2.List = temp
              End Sub
              
              Sub tri(a, gauc, droi) ' Quick sort
              Dim ref, g, d, temp
                ref = a((gauc + droi) / 2)
                g = gauc: d = droi
                Do
                  Do While a(g) < ref: g = g + 1: Loop
                  Do While ref < a(d): d = d - 1: Loop
                  If g <= d Then
                    temp = a(g): a(g) = a(d): a(d) = temp
                    g = g + 1: d = d - 1
                  End If
                Loop While g <= d
                If g < droi Then Call tri(a, g, droi)
                If gauc < d Then Call tri(a, gauc, d)
              End Sub 

              1. Déja MERCI !

                Cependant si rien n'est rempli dans les combo intermédiaire (9 et 10) je n'ai qu'un choix en combobox2. Une idée ?

                J'ai l'impression qu'elle ne prend que la ligne 2
              2. Modérateur
                pour continuer, il me faudrait ton fichier...
              3. C'est ce que je vais finir par faire...
                Mais cela prendrait du temps à vider les infos...

                Pour info, je n'utilise pour l'instant pas le code de tri... Mais ca m'étonnerait que cela vienne de là... C'est comme si le code d'alimentation de la combo s'arretai sur la première ligne
              4. Modérateur
                Le problème est que j'ai testé sur un fichier bidon et ça fonctionne...
                Je retente une fois. Peux tu me faire le même schéma :
                - Combo1 = Col E
                - Combo9 = Col H
                - Combo10 = Col B
                - Combo2 = Col A
                Les combo doivent être remplies dans l'ordre 1 9 10 2.

                OK?

                En attente...
              5. Je comprends l'attente.

                Combo 1 est rempli avec additem
                Combo9 avec colonne E
                Combo10 avec colonne F
                Combo2 avec colonne G

                La combo 1 est alimenté quoi qu'il arrive. Puis la 9 puis la 10.
                La 2 s'alimente avec la 1. Mais le champs des possibilités se réduit avec sélection de la 9 puis encore plus avec sélection de la 10
            2. Bonjour Pijaku,

              J'ai un petit soucis, surement tout con mais... j'y arrive pas.
              Ma combo7 est alimenté par les éléments en colonne AC mais aussi par les éléments de la colonne G d'où mon souci...

               
              Private Sub UserForm_activate()
              Dim temp()
                  Set wks = Sheets(NomUtilisateur)
                 Set dico = CreateObject("Scripting.Dictionary")
              
              'Combo2
                For Each c In wks.Range("G2:G" & wks.[G65000].End(xlUp).Row)
                 dico(c.Value) = IIf(dico.exists(c.Value), dico(c.Value) & "*" & c.Offset(, -1), c.Offset(, -1))
               Next c
               temp = dico.keys
              '  Call tri(temp, LBound(temp), UBound(temp))
               ComboBox2.Clear
               Me.ComboBox2.List = temp
              End sub
              
              Private Sub ComboBox2_Change()
              
              'Majuscule Oblige
              ComboBox2.Value = UCase(ComboBox2.Value)
              
              Dim temp1()
              
              If ComboBox2 = "" Then Exit Sub
              ComboBox7.Clear
              
                      Set wks = Sheets(NomUtilisateur)
                For Each c In wks.Range("G2:G" & wks.[G65000].End(xlUp).Row)
                     'If c.Value = ComboBox2 Then ComboBox7.AddItem c.Offset(0, 22).Value
                     
                     If Not dico.exists(c.Offset(0, 22).Value) And c.Value = ComboBox2 Then
                    dico(c.Offset(0, 22).Value) = ""
                    End If
                     Next c
                    temp1 = dico.keys
                    ComboBox7.Clear
                    Me.ComboBox7.List = temp1
                
              End Sub
              


              Par avance merci
              1. Modérateur
                Salut,
                Puisque tout change sans arrêt, je ne peux rien pour toi...
                Tu peux toujours copier les valeurs contenues en colonne AC sous celles contenues dans la colonne G...
              2. Pijaku,

                Je me permets d'insister. Parce qu'en fait mon problème n'est pas de rajouter une contrainte. Il s'agit de la corriger.

                En effet, je ne souhaite pas avoir les infos de la colonne G avec celle de AC mais juste celle de AC. Celles de la colonne G sont des parasites...
              3. Modérateur
                Co_nexion,

                1- Depuis le début de ce sujet, la question n'arrête pas d'évoluer.
                2- tu changes systématiquement les codes donnés.
                3- j'ai demandé un fichier exemple, pas eu.

                Par conséquent, j'abandonne le suivi de ce sujet.
              4. J'adapte le code à mes besoins. Ou tout du mojns j'essaie.
                Mais je comprends ta frustration.

                Bonne journée
              5. Modérateur
                Regarde bien les codes que je te donnes...
                J'ai systématiquement remplit le dictionary avec la colonne D. Les Offset permettaient de contrôles si le contenu des colonnes correspond aux combobox déjà saisies.

                Là ce sujet est devenu trop embrouillé.
                Je te recommande vivement de :
                1- créer un fichier exemple,
                2- y placer les codes que tu penses être valides,
                3- créer un nouveau sujet clair cette fois.

                On s'y recroisera peut être...
            3. Modérateur
              Bonjour,
              Avec un exemple cela va tout de suite beaucoup mieux.
              Ton erreur est de déclarer le dictionary en variable valide pour tout le module. Tu as placé en tête de module :
              Dim temp(), c As Range, dico As Object, f As Worksheet 

              Pourquoi pas, mais si tu ne recrées pas un dico par Sub, il va conserver les valeurs que tu y mets dans les Sub précédentes.
              Dans ton exemple, la Sub UserForm_Initialise remplit le dico des valeurs contenues colonne G. Puis, au changement de valeur dans la combo2, tu essaie de remplit avec les valeurs de la colonne AC. Mais, comme tu ne recrées pas un nouvel objet, VBA complète le dico avec les nouvelles valeurs, mais conserve les anciennes...
              D'où ton erreur.
              Donc, à chaque nouvelle procédure, ajoute cette ligne :
              Set dico = CreateObject("Scripting.Dictionary")
              Ce qui aura pour effet de créer un nouvel objet dictionnaire par Sub...
              1. Bonjour,
                Merci pour cette explication pijaku. Cela m'a permis d'avancer et du coup j'ai recrée un autre dico.
                Merci et à bientôt