Relation entre 3 ComboBox
Bonjour à tous,
Je vous joins 2 fichiers pour résoudre le problème:
- Fichier test sur lequel il faudrait appliquer le code
- "JeVeuxCa" qui correspond à ce que je RECHERCHE entre les 2 ComboBox sur le fichier test. (sauf que j'en ai trois)
Si vous ouvrez le fichier "JeVeuxCa" vous verrez qu'en activant le USERFORM et en sélectionnnant un critère dans la première combobox, les critères de la COMBOBOX2 apparaissent (seulement ceux qui sont liés au critère de la combobox 1) et ainsi de suite jusqu'à la troisième ComboBox.
C'est donc l'objet de ma recherche: Une sorte de tri entre 3 Combobox qui se nomment dans mon fichier original Codes et Sociétés.
En effet, l'affichage par tri "Code" est déjà codé il n'y a pas besoin d'y toucher. C'est cette combobox qui permet d'avoir les détails dans toutes les Textbox de mon userform.
La combobox2 et la 3, elle, ne sont là que pour affiner la recherche, c'est à dire qu'en sélectionnant une société, puis une banque ,seul les codes liés à cette société et aux banques qui détiennent un compte de cette société devront apparaître dans la Combobox 1. Il suffira alors de clquer sur le code voulu après affinage pour faire apparaître les détails dans les Textbox.
Les données sont situées dans l'onglet "Base de données":
- Code = colonne A
- Sociétés= colonne AN
- Banques= colonne AM
Merci beaucoup à ceux qui m'aideront !
Bonne journée !
Up svp
J'ai trouvé un topic qui parle de la même chose:
https://forum.excel-pratique.com/excel/relation-entre-3-combobox-t32411.html
Le code spécifié est donc le suivant:
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
'Les données sont dans les colonnes A à D, d'un onglet nommé "Base".
'La procédure effectue un remplissage conditionnel des Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'La sélection du ComboBox1 (données colonne A) définit le contenu du ComboBox2 (données colonne B) ,
'La sélection du ComboBox2 définit le contenu du ComboBox3 (données colonne C) …etc...
'
Private Sub UserForm_Initialize()
'Définit la feuille contenant les données
Set Ws = Worksheets("Base")
'Définit le nombre de lignes dans la colonne A
NbLignes = Ws.Range("A65536").End(xlUp).Row
'Remplissage du ComboBox1
Alim_Combo 1
End Sub
Private Sub ComboBox1_Change()
'Remplissage Combo2
Alim_Combo 2, ComboBox1.Value
End Sub
'Procédure pour alimenter les ComboBox
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer
Dim Obj As Control
'Définit le ComboBox à remplir
Set Obj = Me.Controls("ComboBox" & CbxIndex)
'Supprime les anciennes données
Obj.Clear
'alimente le Combobox initial (Combobox1)
If CbxIndex = 1 Then
'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
For j = 3 To NbLignes
Obj = Ws.Range("A" & j)
'Remplit le ComboBox sans doublons
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
Next j
Else
'Alimentation conditionnelle des autres Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'(La sélection du ComboBox1 définit le contenu du ComboBox2,
'La sélection du ComboBox2 définit le contenu du ComboBox3 …etc...)
For j = 3 To NbLignes
If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
End If
Next j
End If
'Enlève la sélection dans le ComboBox
Obj.ListIndex = -1
End Sub
J'ai essayé de l'adapter à mon fichier:
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
'Les données sont dans les colonnes A à AQ, d'un onglet nommé "Base de données".
'La procédure effectue un remplissage conditionnel des Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'La sélection du ComboBox1 (données colonne AN) définit le contenu du ComboBox2 (données colonne A) ,
'
Private Sub UserForm_Initialize()
'Définit la feuille contenant les données
Set Ws = Worksheets("Base de données")
'Définit le nombre de lignes dans la colonne AN
NbLignes = Ws.Range("AN65536").End(xlUp).Row
'Remplissage du ComboBox1
Alim_Combo 1
End Sub
Private Sub ComboBox1_Change()
'Remplissage Combo2
Alim_Combo 2, ComboBox1.Value
End Sub
'Procédure pour alimenter les ComboBox
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer
Dim Obj As Control
'Définit le ComboBox à remplir
Set Obj = Me.Controls("ComboBox" & CbxIndex)
'Supprime les anciennes données
Obj.Clear
'alimente le Combobox initial (Combobox1)
If CbxIndex = 1 Then
'Boucle sur les lignes de la colonne AN (à partir de la 2eme ligne)
For j = 3 To NbLignes
Obj = Ws.Range("AN" & j)
'Remplit le ComboBox sans doublons
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("AN" & j)
Next j
Else
'Alimentation conditionnelle des autres Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'(La sélection du ComboBox1 définit le contenu du ComboBox2,
'La sélection du ComboBox2 définit le contenu du ComboBox3 …etc...)
For j = 3 To NbLignes
If Ws.Range("AN" & j).Offset(0, CbxIndex - 2) = Cible Then
Obj = Ws.Range("AN" & j).Offset(0, CbxIndex - 1)
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("AN" & j).Offset(0, CbxIndex - 1)
End If
Next j
End If
'Enlève la sélection dans le ComboBox
Obj.ListIndex = -1
End Sub
M'ai j'ai une erreur... Voyez mon fichier "fichier test" , je ne sais pas ce qu'il se passe...
PS: je trouve bizarre que dans le code ne figure pas d'allusion à la colonne A (seulement AN), alors qu'il est censé y avoir une relation entre les deux.
Prend la version 7 du topic dont tu parle et adapte la à ton cas
J'ai essayé mais j'ai une erreur...
J'ai changé le fichier de base , j'ai mis le bon dans le premier post.
J'ai mis ça en code:
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
Option Explicit
Dim NbLignes As Integer
Dim Noaction As Boolean
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer, S As String
On Error Resume Next
With Sheets("Feuil1")
Noaction = True
If CbxIndex = 1 Then
For j = 3 To NbLignes
ComboBox1 = .Range("AN" & j)
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem .Range("AN" & j)
Next j
ComboBox1.ListIndex = -1
ElseIf CbxIndex = 2 Then
ComboBox2.Clear
For j = 3 To NbLignes
If .Range("AN" & j) = ComboBox1.Text Then
S = Left(.Range("AM" & j), Len(.Range("AM" & j)) - 1)
ComboBox2 = S
If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem S
End If
Next j
ComboBox2.ListIndex = -1
ElseIf CbxIndex = 3 Then
ComboBox3.Clear
For j = 3 To NbLignes
'-------------------------------------------------------------------
'Si la base de donnée à été rectifiée ces lignes peuvent êtres supprimées
If .Range("A" & j) = "" Or .Range("AM" & j) = "" Then
'erreur dans la base de donnée
'Stop
MsgBox "erreur dans la base de donnée ligne " & j
GoTo PasseErreur
End If
'-------------------------------------------------------------------
If Left(.Range("AM" & j), Len(.Range("AM" & j)) - 1) = ComboBox2.Text Then
ComboBox3 = .Range("A" & j)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem .Range("A" & j)
End If
PasseErreur:
Next j
ComboBox3.ListIndex = -1
End If
Noaction = False
End With
End Sub
Private Sub ComboBox1_Change()
If Noaction Then Exit Sub
Alim_Combo 2, ComboBox1.Value
ComboBox3.Clear
End Sub
Private Sub ComboBox2_Change()
If Noaction Then Exit Sub
Alim_Combo 3, ComboBox1.Value
End Sub
Private Sub UserForm_Initialize()
NbLignes = Sheets("Feuil1").Range("AN65536").End(xlUp).Row
'Remplissage du ComboBox1
Alim_Combo 1
End Sub
Private Sub CommandButton1_Click()
Unload UserForm1
End Sub
Private Sub Label3_Click()
End Sub
Private Sub Label5_Click()
End Sub
Private Sub MultiPage1_Change()
End Sub
Private Sub TextBox1_Change()
End Sub
Private Sub TextBox2_Change()
End Sub
Private Sub TextBox3_Change()
End Sub
Private Sub TextBox4_Change()
End Sub
Private Sub TextBox5_Change()
End Sub
Private Sub TextBox6_Change()
End Sub
Private Sub UserForm_Click()
End Sub
Ca ne fonctionne pas, j'ai une erreur, et ça me surligne en bleu la 4ème ligne: Option Explicit
Evidemment, tu à laissé des lignes en double
Commence déjà par supprimer
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
Effectivement...
Maintenant j'arrive à lancer l'userform par contre j'ai une autre erreur.
Quand je clique sur une société à choisir, j'ai le message suivant:
"Erreur d'éxécution: '-2147467259 (80004005)'
Erreur non répertoriée.
Je te joins le fichier avec le code modifié:
Pour faire une mise au point faudrait au moins avoir une base de donnée qui ressemble un peu à quelque chose.
Tu dois pas mettre des données réelle mais au moins des données différentes dans les colonnes à prendre en compte
Mais en premier..
Pas initialiser les propriétés RowSource des combo si tu veux les remplir par VBA
lermite a écrit :Pour faire une mise au point faudrait au moins avoir une base de donnée qui ressemble un peu à quelque chose.
Tu dois pas mettre des données réelle mais au moins différentes.
Mais en premier..
Pas initialiser les propriétés RowSource des combo si tu veux les remplir par VBA
Je vais modifier les données pour qu'elles soient différentes.
Concernant les RowSource je ne comprends pas pourquoi ne pas les remplir ? Parce que la macro ordonne d'aller chercher là où il faut déjà ? C'est ça ?
Réfléchi un peu,
lermite a écrit :Réfléchi un peu,
tu veux que les combo trie des données et d'un autre côté tu dis "Je veux tout, même les doublons." ce qui est fait avec RowSource
C'est la première fois que j'ouvre l'éditeur VBA. Je pense m'en tirer pas trop trop mal pour sortir un USERFORM sans connaître les bases.
Désolé pour les questions débiles donc ...
Voilà le fichier avec des données mieux réparties comme tu le voulais:
J'ai l'impression que tu ne sais pas ce qu'est une base de données.
Supposons..
Tu à 1000 sociétés --> ça c'est OK
Ces 1000 sociétés ont chacune une banque différente donc il y a 1000 banques différente ????
Ces 1000 banques n'ont qu'une seule agence qui à la même N° que la banque ???
Chaque société à une devise différente donc 1000 devises différente ??
Je sais pas où tu va chercher tout ça..
Avant de faire une sélection sur la BD tu devras d'abord te penché sur la façon de la remplir.
Impossible de faire une mise au point de tes combo avec une yel BD
J'ai enlevé les RowSource comme tu me l'as dis, par contre il y a un problème qui là je pense concerne le codage.
Le tri quand on sélectionne une société dans la combobox 1 permet d'afficher les banques liés à cette société.
Par contre dans la Combobox 3 (CODES) , s'affiche tous les codes liés à la banque.
Le problème étant qu'il faudrait que le Combobox prenne aussi en compte la Combobox 1 de façon à afficher le code résultant de la sélection de la combobox1+combobox2.
Comment faire ?
lermite a écrit :J'ai l'impression que tu ne sais pas ce qu'est une base de données.
Supposons..
Tu à 1000 sociétés --> ça c'est OK
Ces 1000 sociétés ont chacune une banque différente donc il y a 1000 banques différente ????
Ces 1000 banques n'ont qu'une seule agence qui à la même N° que la banque ???
Chaque société à une devise différente donc 1000 devises différente ??
Je sais pas où tu va chercher tout ça..
Avant de faire une sélection sur la BD tu devras d'abord te penché sur la façon de la remplir.
Impossible de faire une mise au point de tes combo avec une yel BD
Pas exactement. Pour essayer de faire simple:
- chaque ligne donne les détails d'UN SEUL compte.
- Dans mon tableau (base de données) , les colonnes détaillent chaque point clef (adresse, compte de quel société ? , numéro de compte, adresse agence de banque qui gere le compte, etc....)
- Il y a donc pour reprendre ton exemple numéraire, disons 1000 COMPTES. Ces 1000 comptes appartiennent à une seule et même entreprise, qui possèdent pleins de petites entreprises à qui ON DONNE LA GESTION de ces comptes en fonction des banques proches de ces entreprises et de leur activité.
Une petite entreprise de la principale peut posséder plusieurs comptes, dans une seule et même banque (mais pas les même agences, on peut en avoir sur tout le territoire) ou alors dans plusieurs banques.
Après pour l'utilisation des COMBOBOX, seulement 3 colonnes sont concernées :
- La colonne AN pour les sociétés
- La colonne AM pour les banques
- La colonne A pour les codes
Le but du Userform est donc de pouvoir chercher des comptes rapidement sans devoir se taper les 475 lignes du fichier original.
J'ai mis des Textbox qui affichent les détails de ces lignes EN FONCTION du CODE (donc dans la combobox3) choisi.
Mais pour choisir le code, il faut d'avord affiner la rechercher avec les sociétés (combobox 1) qui va nous donner les banques de ces sociétés (combobox2) , PUIS à l'aide de ces deux critères choisis, LE code voulu apparaît et qui remplira les champs du Userform à l'aide de ceci: (Une sorte de données croisées quoi?)
Private Sub ComboBox3_Change()
With Sheets("Feuil1")
For a = 1 To .Range("A65536").End(xlUp).Row
If ComboBox1.Text = .Cells(a, 1).Value Then
TextBox2.Text = .Cells(a, 11).Value
TextBox1.Text = .Cells(a, 12).Value
TextBox3.Text = .Cells(a, 29).Value
TextBox4.Text = .Cells(a, 30).Value
TextBox5.Text = .Cells(a, 31).Value
TextBox6.Text = .Cells(a, 32).Value
TextBox7.Text = .Cells(a, 4).Value
TextBox8.Text = .Cells(a, 10).Value
TextBox9.Text = .Cells(a, 39).Value
TextBox10.Text = .Cells(a, 7).Value
TextBox11.Text = .Cells(a, 8).Value
TextBox12.Text = .Cells(a, 33).Value
TextBox13.Text = .Cells(a, 34).Value
TextBox14.Text = .Cells(a, 36).Value
TextBox15.Text = .Cells(a, 40).Value
TextBox16.Text = .Cells(a, 2).Value
TextBox17.Text = .Cells(a, 41).Value
TextBox18.Text = .Cells(a, 43).Value
End If
Next a
End With
End Sub
A essayer
EDIT : supprimer fichier obsolète (inutile de surcharger la BD du forum)
Bonjour elliotr
Fait confiance en Lermite, c'est lui qui m'a aide dans mon projet qui ressemble au tien et qui marche super!!!!!!!!
juju53 a écrit :Bonjour elliotr
Fait confiance en Lermite, c'est lui qui m'a aide dans mon projet qui ressemble au tien et qui marche super!!!!!!!!
Oh que oui !
Ton fichier marche impec, c'est génial !!
J'ai encore une dernière chose à régler dessus et il sera opérationnel à 100% :
Le tri sur les 3 combobox marche niquel, mais en fait la dernière Combobox (la 3) m'affiche donc le code à choisir.
En sélectionant le code, il faut que tout se remplisse dans les textbox de tous les onglets du USERFORM.
J'avais réussi à trouver la macro pour que tout se remplisse sans tri, j'ai donc essayé de l'intégrer au fichier:
Private Sub ComboBox3_Change()
With Sheets("Base de données")
For a = 1 To .Range("A65536").End(xlUp).Row
If ComboBox3.Text = .Cells(a, 1).Value Then
TextBox2.Text = .Cells(a, 11).Value
TextBox1.Text = .Cells(a, 12).Value
TextBox3.Text = .Cells(a, 29).Value
TextBox4.Text = .Cells(a, 30).Value
TextBox5.Text = .Cells(a, 31).Value
TextBox6.Text = .Cells(a, 32).Value
TextBox7.Text = .Cells(a, 4).Value
TextBox8.Text = .Cells(a, 10).Value
TextBox9.Text = .Cells(a, 39).Value
TextBox10.Text = .Cells(a, 7).Value
TextBox11.Text = .Cells(a, 8).Value
TextBox12.Text = .Cells(a, 33).Value
TextBox13.Text = .Cells(a, 34).Value
TextBox14.Text = .Cells(a, 36).Value
TextBox15.Text = .Cells(a, 40).Value
TextBox16.Text = .Cells(a, 2).Value
TextBox17.Text = .Cells(a, 41).Value
TextBox18.Text = .Cells(a, 43).Value
End If
Next a
End With
End Sub
Mais j'ai une erreur, et la première ligne est surligné de jaune, et le a (dans For a=1) est surligné de bleu ???
Re,
J'avais déjà prévu un ti coup de pouce en ce sens
Vu que normalement il n'y a qu'une seule donnée possible dans le Combo3 il n'est pas nécessaire et je l'ai remplacer par un label
Et remplir tout les TextBox (ou les vider suivant le cas)
L'astuce ?? les .tag des textBox
Tu dis.
A+
EDIT : Supprimer le fichier obsolète (inutile de surcharger la BD du forum)
Salut !
Il n'y a pas forcément un seul résultat dans la combobox 3
En effet, le tri société donne une liste de banque (1 ou plusieurs) et cette liste de banque pouvant être =1 ou en contenir plusieurs peut donc amener à plusieurs codes (soit parce que multi banques, ou alors 1 seul banque mais pluieurs codes).
Quel est donc le code approprié ?
Il faut adapter ce code à la suite de ce que tu m'as codé je suppose non ?
Private Sub ComboBox3_Change()
With Sheets("Feuil1")
For a = 1 To .Range("A65536").End(xlUp).Row
If ComboBox3.Text = .Cells(a, 1).Value Then
TextBox2.Text = .Cells(a, 11).Value
TextBox1.Text = .Cells(a, 12).Value
TextBox3.Text = .Cells(a, 29).Value
TextBox4.Text = .Cells(a, 30).Value
TextBox5.Text = .Cells(a, 31).Value
TextBox6.Text = .Cells(a, 32).Value
TextBox7.Text = .Cells(a, 4).Value
TextBox8.Text = .Cells(a, 10).Value
TextBox9.Text = .Cells(a, 39).Value
TextBox10.Text = .Cells(a, 7).Value
TextBox11.Text = .Cells(a, 8).Value
TextBox12.Text = .Cells(a, 33).Value
TextBox13.Text = .Cells(a, 34).Value
TextBox14.Text = .Cells(a, 36).Value
TextBox15.Text = .Cells(a, 40).Value
TextBox16.Text = .Cells(a, 2).Value
TextBox17.Text = .Cells(a, 41).Value
TextBox18.Text = .Cells(a, 43).Value
End If
Next a
End With
End Sub
Comment l'intégrer ?
Avec les données incomplète de la BD je pouvais pas extrapoler.
Voir la nouvelle version
EDIT : Supprimer le fichier obsolète (inutile de surcharger la BD du forum)