Relation entre 2 ComboBox

elliotr

XLDnaute Junior
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 à la relation recherchée entre les 2 ComboBox


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)


C'est donc l'objet de ma recherche: Une sorte de tri entre 2 Combobox qui seront 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.
Mais j'ai rajouté une deuxieme combobox qui permet une recherche par Sociétés: il faudrait donc qu'en choisissant une société , apparaissent tous les codes liés à la société.

Les données sont situées dans l'onglet "Base de données":
-Code = colonne A
-Sociétés= colonne AN




Merci beaucoup à ceux qui m'aideront !
Bonne journée !
 

Pièces jointes

  • JeVeuxCa .xls
    252 KB · Affichages: 95
  • fichier_test(1).xls
    62.5 KB · Affichages: 74
  • fichier_test(1).xls
    62.5 KB · Affichages: 98
  • fichier_test(1).xls
    62.5 KB · Affichages: 93
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Bonjour.
C'est du travail pour mon classeur de macro OutIdx
Je vais vous écrire le code.
Voilà. Le classeur DémoOutIdx sur le même lien peut aider à rectifier les références.
À +
 

Pièces jointes

  • CbxCascJeVeuxÇa.xls
    254.5 KB · Affichages: 103
Dernière édition:

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Bonjour.
C'est du travail pour mon classeur de macro OutIdx
Je vais vous écrire le code.
Voilà. Le classeur DémoOutIdx sur le même lien peut aider à rectifier les références.
À +



Salut,
Merci pour ta réponse. Par contre le code c'est sur le fichier test qu'il faut le mettre.
Le fichier "JeVeuxCa" je l'ai trouvé sur internet et il correspond à ce que je recherche, il ne faut donc pas le modifier car il était déjà codé et fonctionne bien à l'aide de ceci:

Option Explicit

Dim Ws As Worksheet
Dim NbLignes As Integer
Dim NoAction As Boolean

Private Sub ComboBox1_Change()
'Eviter d'envoyer la macro à chaque itération du remplissage du Combo1
If NoAction Then Exit Sub
Alim_Combo 2, ComboBox1.Value
End Sub

Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer
Dim Obj As Control

Set Obj = Me.Controls("ComboBox" & CbxIndex)
Obj.Clear
NoAction = True
If CbxIndex = 1 Then
For j = 3 To NbLignes
Obj = Ws.Range("E" & j)
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("E" & j)
Next j
ElseIf CbxIndex = 2 Then
For j = 3 To NbLignes
If Ws.Range("E" & j) = CInt(Cible) Then
Obj = Ws.Range("D" & j)
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("D" & j)
End If
Next j
End If
On Error Resume Next
Obj.ListIndex = 0
On Error GoTo 0
NoAction = False
End Sub

Private Sub UserForm_Initialize()
Set Ws = Sheets("Base")
NbLignes = Ws.Range("D65536").End(xlUp).Row
'Remplissage du ComboBox1
Alim_Combo 1

End Sub



Ce qu'il faut , c'est l'adapter au fichier test. Mais comme je n'y connais rien..
J'ai essayé de copier/coller ton code dans le fichier_test, mais ça ne fonctionne pas.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Si vous avez bien fait la 1ère chose à faire: mettre en place les liens avec OutIdx, pouvez vous joindre ce que vous avez tenté ?
(après avoir adapté à vos ComboBox et à votre plage, ça va de soit)
Vous serez mieux instruit si je corrige ce que vous pensiez avoir fait.

P.S. j'ai déjà repéré quelque chose qui ne va pas: Enlevez les RowSource des ComboBox.
Chez moi ce début marche déjà:
VB:
Option Explicit
Dim WithEvents CascSoc As OutIdx.ComboBoxCasc
Dim WithEvents CascBnq As OutIdx.ComboBoxCasc
Dim Plage As Range
'

Private Sub UserForm_Initialize()
Set Plage = OutIdx.PlgUti(Feuil1.[A2])
Set CascSoc = OutIdx.CbxCasc
CascSoc.Add Me.ComboBox1, Plage.Columns("A")
CascSoc.Add Me.ComboBox2, Plage.Columns("AN")
CascSoc.Actualiser
Set CascBnq = OutIdx.CbxCasc
CascBnq.Add Me.ComboBox3, Plage.Columns("AM")
CascBnq.Actualiser
End Sub
'

Private Sub CascSoc_Bingo(Lignes() As Long)
With Plage.Rows(Lignes(1))
    TextBox2.Text = .Columns(11).Value
    TextBox1.Text = .Columns(12).Value
    TextBox3.Text = .Columns(29).Value
    TextBox4.Text = .Columns(30).Value
    TextBox5.Text = .Columns(31).Value
    TextBox6.Text = .Columns(32).Value
    TextBox7.Text = .Columns(4).Value
    TextBox8.Text = .Columns(10).Value
    TextBox9.Text = .Columns(39).Value
    TextBox10.Text = .Columns(7).Value
    TextBox11.Text = .Columns(8).Value
    TextBox12.Text = .Columns(33).Value
    TextBox13.Text = .Columns(34).Value
    TextBox14.Text = .Columns(36).Value
    TextBox15.Text = .Columns(40).Value
    TextBox16.Text = .Columns(2).Value
    TextBox17.Text = .Columns(41).Value
    TextBox18.Text = .Columns(43).Value
    End With
End Sub
'

Private Sub CascSoc_Défait()
Dim X As Long
For X = 1 To 18: Me.Controls("TextBox" & X).Text = "": Next X
End Sub
À +
 
Dernière édition:

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Je ne comprends strictement rien à vos phrases sans vouloir vous offusquer.
Je vous ai mis plus haut ce que j'ai fais: Rabattre le code que vous avez écrit dans le fichier "JeVeuxCa".
Mais le problème c'est que ce fichier est simplement là pour illustrer ce que je veux (à savoir ce que j'ai mis dans mon premier post).


Il faudrait un code similaire DANS le fichier test.
C'est ça que je n'arrive pas à faire.
 

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Installez OutIdx.xls du lien plus haut dans un répertoire dédié aux outils de service.
Ouvrez le DémoOutIdx.xls du même lien.
Veillez à ce que le Service soit Activé (bouton en haut à droite de la première feuille): une toute petite forme est affichée.
Activez votre classeur, cliquez sur le bouton de la petite forme.
À +
 

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Je travail sur des fichiers entreprises, je ne peux pas intégrer vos fichiers comme bon me semble désolé...
Je n'ai pas besoin de ça, je cherche un code natif pour le fichier. Aucune intégration d'un quelquonque XLS

Merci quand même de votre aide.
 

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Soit. Alors je vais vous mettre les modules nécessaires. Il ne nécessitera plus que la référence à "Microsoft Scripting Runtime"
Voilà, c'est fait.
À +
 

Pièces jointes

  • CbxCasC_fichier_test.xls
    184 KB · Affichages: 82
  • CbxCasC_fichier_test.xls
    184 KB · Affichages: 79
  • CbxCasC_fichier_test.xls
    184 KB · Affichages: 83
Dernière édition:

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Soit. Alors je vais vous mettre les modules nécessaires. Il ne nécessitera plus que la référence à "Microsoft Scripting Runtime"
Voilà, c'est fait.
À +



Merci de votre participation.
J'ai testé le fichier: il y a un problème. Vous avez enlevé le RowSource de la combobox 2. Le problème c'est que je souhaite avoir dans la combobox2 toutes les sociétés de la colonne AN (donc dans RowSource--> Feuil1!AN2:AN600).
Ensuite , je sélectionne la société que je veux dans la combobox2 et dans la combox1 apparaissent UNIQUEMENT les codes se trouvant dans les lignes comprenant la société choisi dans la combobox 2 .
Vous voyez ?


Exemple: Je choisi dans la combobox 2 la société X.

Ligne 1/10/20/30 il y a dans la colonne AN "X". Ce sont donc des comptes de la sociétés X.
Dans la combobox 1 , ayant sélectionné avant la société X dans la combobox 2, je vais avoir les codes (qui se trouvent dans la colonne A) des lignes 1/10/20/30. Mais le but étant que seul ces codes apparaissent si société X est sélectionné dans la combobox 2.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Intervertissez simplement l'ordre des CascSoc.Add.
Mais il me semblerait plus logique d'en intervertir alors aussi la position dans le Userform.
P.S. Dans le fichier dont je suis parti, je n'ai qu'une société en colonne AN: "y".
Mais si je mets "x" aux lignes 2 (1 est prise par le titre), 10, 20, 30, alors après interversion, c'est à dire CascSoc.Add ComboBox2 en premier, alors si j'y choisi "x" il me propose "a", "ac", "i" et "s" dans ComboBox1.
À +
 
Dernière édition:

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Intervertissez simplement l'ordre des CascSoc.Add.
Mais il me semblerait plus logique d'en intervertir alors aussi la position dans le Userform.
À +

SI vous pourriez m'écrire la modification car je ne vois pas comment changer ? :

Option Explicit
Dim WithEvents CascSoc As ComboBoxCasc
Dim WithEvents CascBnq As ComboBoxCasc
Dim Plage As Range
'

Private Sub UserForm_Initialize()
Set Plage = PlgUti(Feuil1.[A2])
Set CascSoc = New ComboBoxCasc
CascSoc.Add Me.ComboBox1, Plage.Columns("A")
CascSoc.Add Me.ComboBox2, Plage.Columns("AN")
CascSoc.Actualiser
Set CascBnq = New ComboBoxCasc
CascBnq.Add Me.ComboBox3, Plage.Columns("AM")
CascBnq.Actualiser
End Sub
'

Private Sub CascSoc_Bingo(Lignes() As Long)
With Plage.Rows(Lignes(1))
TextBox2.Text = .Columns(11).Value
TextBox1.Text = .Columns(12).Value
TextBox3.Text = .Columns(29).Value
TextBox4.Text = .Columns(30).Value
TextBox5.Text = .Columns(31).Value
TextBox6.Text = .Columns(32).Value
TextBox7.Text = .Columns(4).Value
TextBox8.Text = .Columns(10).Value
TextBox9.Text = .Columns(39).Value
TextBox10.Text = .Columns(7).Value
TextBox11.Text = .Columns(8).Value
TextBox12.Text = .Columns(33).Value
TextBox13.Text = .Columns(34).Value
TextBox14.Text = .Columns(36).Value
TextBox15.Text = .Columns(40).Value
TextBox16.Text = .Columns(2).Value
TextBox17.Text = .Columns(41).Value
TextBox18.Text = .Columns(43).Value
End With
End Sub
'

Private Sub CascSoc_Défait()
Dim X As Long
For X = 1 To 18: Me.Controls("TextBox" & X).Text = "": Next X
End Sub
'

Private Sub CommandButton1_Click()
Unload UserForm1
End Sub

Private Sub Label3_Click()

End Sub

Private Sub Label5_Click()

End Sub


Pour moi ça semble logique, je vois pas quoi invtervertir ?

CascSoc.Add Me.ComboBox1, Plage.Columns("A") -> C'est OK car combobox1= codes colonne 1
CascSoc.Add Me.ComboBox2, Plage.Columns("AN") --> C'est Ok car combobox2 = sociétés colonne AN

CascBnq.Add Me.ComboBox3, Plage.Columns("AM") --> C'est OK car combobox3 = banques colonne AM

Donc quoi changer ?
 

Dranreb

XLDnaute Barbatruc
Re : Relation entre 2 ComboBox

Mettre en premier celui qui doit porter tous les choix possibles et où il faut y faire le 1er choix:
VB:
CascSoc.Add Me.ComboBox2, Plage.Columns("AN")
CascSoc.Add Me.ComboBox1, Plage.Columns("A")
 

elliotr

XLDnaute Junior
Re : Relation entre 2 ComboBox

Re bonjour,
AVANT TOUT MERCI DE PRENDRE LE FICHIER DE CE MESSAGE. (il y a eu une modif')
Ca ne change rien de les intervertir, ça ne marche tjr pas.
Après quelques recherches j'ai trouvé le code de base qu'il faudrait appliquer mais je n'arrive pas à l'adapter au fichier.
J'ai modifié le fichier source "fichier test" avec des petites modif' sur le Userform.

Voilà le code:

VB:
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:

VB:
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.
 

Pièces jointes

  • fichier_test(1).xls
    75.5 KB · Affichages: 84
  • fichier_test(1).xls
    75.5 KB · Affichages: 84
  • fichier_test(1).xls
    75.5 KB · Affichages: 94

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 327
Membres
103 517
dernier inscrit
hbenaoun63