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 !

53fichier-test-1.zip (17.78 Ko)
64jeveuxca.zip (56.21 Ko)

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.

up

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, 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

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é.
Donc 1000 comptes OK, mais pas 1000 banques ni 1000 sociétés

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)

Rechercher des sujets similaires à "relation entre combobox"