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 SubMerci 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 SubSalut 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 SubRe,
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...