Lier deux combobox

Résolu/Fermé
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015 - 12 juil. 2013 à 09:31
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015 - 30 juil. 2013 à 11:07
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 17:09
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
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 17:54
Pijaku : MERCI !!!

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

UN GRAND MERCI :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
18 juil. 2013 à 09:29
de rien, n'hésite pas.
A+
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
12 juil. 2013 à 09:51
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


0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
12 juil. 2013 à 10:50
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
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
12 juil. 2013 à 11:46
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
12 juil. 2013 à 12:09
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
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
12 juil. 2013 à 13:49
J'avais essayé ainsi mais j'avais rebroussé chemin, car il m'est dit "nom ambigu detecté : ~"
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
12 juil. 2013 à 13:51
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...
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
16 juil. 2013 à 15:40
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
16 juil. 2013 à 15:43
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 09:02
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 09:09
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) 
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 09:17
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 09:26
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............
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 09:44
Maintenant que tu le dis...
Combobox 2,9 et 10 alimenté respectivement par colonne E, F et G. Merci :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 09:45
pffffffffffff
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 10:04
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


0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 12:08
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
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 12:17
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...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 14:03
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.....
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 14:12
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 14:21
Bon j'veux bien regarder à ça mais c'est bien le dernier cas de figure?????????
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 14:01
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...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 14:46
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 

0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
Modifié par Co_nexion le 17/07/2013 à 15:04
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 15:11
pour continuer, il me faudrait ton fichier...
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
17 juil. 2013 à 15:21
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
17 juil. 2013 à 15:25
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...
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
Modifié par Co_nexion le 17/07/2013 à 15:59
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
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
24 juil. 2013 à 11:08
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
24 juil. 2013 à 11:11
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...
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
24 juil. 2013 à 13:35
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...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
24 juil. 2013 à 13:41
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.
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
24 juil. 2013 à 13:42
J'adapte le code à mes besoins. Ou tout du mojns j'essaie.
Mais je comprends ta frustration.

Bonne journée
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
24 juil. 2013 à 13:47
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...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 753
25 juil. 2013 à 07:47
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...
0
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015
30 juil. 2013 à 11:07
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
0