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
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)
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)
A voir également:
- Lier deux combobox
- Deux ecran pc - Guide
- Faire deux colonnes sur word - Guide
- Itinéraire google map entre deux adresses - Guide
- Deux whatsapp sur un téléphone - Guide
- Concatener deux cellules excel - Guide
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
17 juil. 2013 à 17:09
Alors voilà.
Tu peux même oublier ton .AddItem pour la ComboBox1 et là tester dans cet état...
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
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
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 :
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
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
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
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
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
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 ?
Merci
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
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
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
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
12 juil. 2013 à 13:49
J'avais essayé ainsi mais j'avais rebroussé chemin, car il m'est dit "nom ambigu detecté : ~"
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
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...
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...
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
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
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
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
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...
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...
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
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 ?
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 ?
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
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 :
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)
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
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
Merci pour le code tri
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
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............
Dis moi oui............
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
17 juil. 2013 à 09:44
Maintenant que tu le dis...
Combobox 2,9 et 10 alimenté respectivement par colonne E, F et G. Merci :)
Combobox 2,9 et 10 alimenté respectivement par colonne E, F et G. Merci :)
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
17 juil. 2013 à 09:45
pffffffffffff
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
17 juil. 2013 à 10:04
remplace tout le code donné précédemment par celui-ci.
Il permet également le tri des trois combo........
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
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
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.
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
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
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
17 juil. 2013 à 12:17
J'ai rajouté un niveau c'est à dire combobox10_change() de la sorte :
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...
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...
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
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.....
What else? ose-je te demander de suite.....
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
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
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
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
17 juil. 2013 à 14:21
Bon j'veux bien regarder à ça mais c'est bien le dernier cas de figure?????????
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
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...
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
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...
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
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
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
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
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
17 juil. 2013 à 15:11
pour continuer, il me faudrait ton fichier...
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
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
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
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
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...
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...
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
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
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
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
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...
Par avance merci
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
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
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...
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...
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
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...
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...
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
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.
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.
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
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
Mais je comprends ta frustration.
Bonne journée
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
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...
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...
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
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 :
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 :
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...
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
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
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
17 juil. 2013 à 17:54
Je crois que je n'ai jamais fait autant chier quelqu'un et pourtant t'es toujours là :)
UN GRAND MERCI :)
18 juil. 2013 à 09:29
A+