Synchroniser la sélection dans deux ListBox

Bonjour à tous,

Je souhaiterais savoir comment synchroniser deux ListBox.

Je m'explique :

Je n'ai pas réussi à créer une ListBox avec 14 colonnes (une colonne Item et 13 autres avec différents prix, dates etc..), j'en ai donc créé deux de 7 que j'ai mis côte à côte dans mon UserForm. Seulement voilà, avec cette technique j'ai besoin de "synchroniser" les deux ListBox, d'une telle façon que lorsque je clique sur un Item dans ListBox1, le même item est sélectionné dans le ListBox 2.

Pouvez-vous me guider ? Soit pour créer une ListBox à 14 colonnes (les réponses dans les autres Forum ne m'ont pas aidées), soit pour cette synchronisation ?

Voilà mon code :

Private Sub TextBox1_Change()

Dim Ligne As Long
Dim Tmp As String

Application.ScreenUpdating = True
With Worksheets("BDD")
    .Range("A9149").Interior.ColorIndex = 2
    Me.ListBox1.Clear
    Tmp = Me.TextBox1
    If Tmp <> "" Then
        For Ligne = 1 To 9149
            If .Cells(Ligne, 1) Like "*" & Tmp & "*" Then
                Me.ListBox1.Visible = True
                Me.ListBox1.AddItem .Cells(Ligne, 1)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = .Cells(Ligne, 3)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = .Cells(Ligne, 5)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = .Cells(Ligne, 6)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = .Cells(Ligne, 7)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = .Cells(Ligne, 8)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = .Cells(Ligne, 9)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = .Cells(Ligne, 10)
            End If
        Next
    End If
End With

With Worksheets("BDD")
    .Range("A9149").Interior.ColorIndex = 2
    Me.ListBox2.Clear
    Tmp = Me.TextBox1
    If Tmp <> "" Then
        For Ligne = 1 To 9149
            If .Cells(Ligne, 1) Like "*" & Tmp & "*" Then
                Me.ListBox2.Visible = True
                Me.ListBox2.AddItem .Cells(Ligne, 1)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 8) = .Cells(Ligne, 11)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 7) = .Cells(Ligne, 12)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 1) = .Cells(Ligne, 14)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 2) = .Cells(Ligne, 13)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 3) = .Cells(Ligne, 17)
                Me.ListBox2.List(Me.ListBox2.ListCount - 1, 4) = .Cells(Ligne, 18)
            End If
        Next
    End If
End With

End Sub

Merci d'avance !

Greg

Bonjour Greg, bonjour le forum,

Peut-être comme ça :

Private Sub ListBox1_Change()
Me.ListBox2.Value = Me.ListBox2.List(Me.ListBox1.ListIndex)
End Sub
Private Sub ListBox2_Change()
Me.ListBox1.Value = Me.ListBox1.List(Me.ListBox2.ListIndex)
End Sub

Salut ThauThème, et merci pour ta réponse.

Malheureusement ça ne fonctionne pas, le message d'erreur me dit cela :

"Impossible de lire la propriété List. Index de table de propriétés non valide"

J'ai un niveau assez moyen sur VBA, je ne sais donc pas comment interpréter ce message..

Re,

Si tu soumets ton fichier le pourrai te l'intégrer car j'ai testé chez moi et ça marche...

Voilà mon fichier Thau Thème

Merci !

Re,

Désolé mais je n'y arrive pas comme je voudrais. Ça fonctionne mais que si tu sélectionnes dans la Listbox1. Je n'arrive pas à synchroniser le défilement vertical des deux ListBoxes. Donc complètement inefficace...

Toute fois je t'envoie le code car j'ai modifié la manière d'alimenter les deux ListBoxes au changement dans la TextBox1 et je pense que c'est plus rapide.

Le code modifié :

Private Sub UserForm_Initialize()
Set O = Worksheets("BDD")
TV = O.Range("A1").CurrentRegion
NL = UBound(TV, 1)
NC = UBound(TV, 2)
With Me.ListBox1
    .ColumnCount = 10
    .ColumnWidths = "80;110;90;50;20;40;20;20;40;30"
End With
With Me.ListBox2
    .ColumnCount = 5
    .ColumnWidths = "80;110;120;50;0"
End With
End Sub

Private Sub TextBox1_Change()

Dim TL1() As Variant
Dim TL2() As Variant
Dim I As Long
Dim Tmp As String

Application.ScreenUpdating = True
O.Range("A9149").Interior.ColorIndex = 2 '?
Me.ListBox1.Clear
Me.ListBox2.Clear
Tmp = Me.TextBox1
If Tmp <> "" Then
    K = 1
    For I = 2 To NL
        For J = 1 To NC
            If InStr(1, TV(I, J), Tmp, vbTextCompare) <> 0 Then
                ReDim Preserve TL1(1 To 15, 1 To K)
                TL1(1, K) = O.Cells(I, 1)
                TL1(2, K) = O.Cells(I, 3)
                TL1(3, K) = O.Cells(I, 5)
                TL1(4, K) = O.Cells(I, 6)
                TL1(5, K) = O.Cells(I, 7)
                TL1(7, K) = O.Cells(I, 8)
                TL1(7, K) = O.Cells(I, 9)
                TL1(8, K) = O.Cells(I, 10)
                TL1(9, K) = O.Cells(I, 11)
                TL1(10, K) = O.Cells(I, 12)
                ReDim Preserve TL2(1 To 5, 1 To K)
                TL2(1, K) = O.Cells(I, 13)
                TL2(2, K) = O.Cells(I, 14)
                TL2(3, K) = O.Cells(I, 17)
                TL2(4, K) = O.Cells(I, 18)
                TL2(5, K) = I
                K = K + 1
                Exit For
            End If
        Next J
    Next I
If K > 1 Then Me.ListBox1.Column = TL1
If K > 1 Then Me.ListBox2.Column = TL2
End If
End Sub
Private Sub CommandButton1_Click()
    Me.ListBox1.Clear
    Me.ListBox2.Clear
    RechercheItem.Hide
End Sub

Private Sub ListBox1_Change()
On Error GoTo fin
With Me.ListBox1
    For I = 0 To .ListCount - 1
        Me.ListBox2.Selected(I) = .Selected(I)
    Next I
End With
fin:
End Sub

Merci ! c'est top

Re,

Une autre méthode avec une seule ListBox qui n'affiche que 9 colonnes mais avec la possibilité de glisser l'affichage sur les autres colonnes. Dans mon exemple il y en a 13 mais je pense qu'il devrait s'adapter automatiquement à plus...

• Double-clique sur n'importe quelle cellule éditée de l'onglet Feuil1, la boîte de dialogue Rechercher apparaît.

• Tape le texte à rechercher...

• Utilise le SpinButton1 vers la droite ou vers la gauche pour faire glisser l'affichage des colonnes...

• Clique sur un élément dans la ListBox1, la boîte de dialogue se ferme, la ligne de l'élément est sélectionnée dans l'onglet Feuil1...

Rechercher des sujets similaires à "synchroniser selection deux listbox"