Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Ajouter des colonnes dans une listbox

Laurent97310

XLDnaute Nouveau
Bonjour,

J'utilise actuellement un code qui permet d'alimenter une listbox selon une valeur saisie dans une Textbox1. Seulement une colonne est affichée dans la listbox pour l'instant, ce qui me suffisait. Je souhaiterais maintenant afficher les 3 autres colonnes (A,B,C,D) de mon tableau dans cette listbox.
J'avais récupéré ce code sur Stack Overflow qui mentionné d'ailleurs:
For multicolumn listbox, you can replace Me.ListBox1.AddItem arrList(i, 1) by Me.Listbox.AddItem Listbox.List(0, 0) = arrList(i, 1) Listbox.List(0, 1) = arrList(i, 2)
Malgré beaucoup de tests, je ne m'y connais pas assez pour la modifier... Pourriez-vous me guider pour terminer ce code?

(Dans UserForm1):

Private Sub Textbox1_Change()

Dim i As Long
Dim arrList As Variant

Me.ListBox1.Clear
If Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row > 1 And Trim(Me.TextBox1.Value) <> vbNullString Then
arrList = Feuil1.Range("A1:A" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Value2
For i = LBound(arrList) To UBound(arrList)
If InStr(1, arrList(i, 1), Trim(Me.TextBox1.Value), vbTextCompare) Then
Me.ListBox1.AddItem
ListBox1.List(0, 0) = arrList(i, 1)
End If
Next i
End If
If Me.ListBox1.ListCount = 1 Then Me.ListBox1.Selected(0) = True

End Sub

Merci beaucoup!!!
 

job75

XLDnaute Barbatruc
Bonsoir Laurent97310, bienvenue sur XLD,

La méthode .AddItem prend trop de temps sur de grands tableaux.

Il vaut mieux utiliser la méthode .List, voyez le fichier joint et cette macro dans l'UserForm :
VB:
Private Sub TextBox1_Change()
Dim x$, h&, liste(), tablo, i&, n&, j%
x = LCase(Trim(TextBox1))
If x = "" Then ListBox1.Clear: Exit Sub
x = "*" & x & "*" 'caractères génériques
With Feuil1.[A1].CurrentRegion
    h = Application.CountIf(.Columns(1).Offset(1), x)
    If h = 0 Then ListBox1.Clear: Exit Sub
    ReDim liste(1 To h, 1 To 4)
    tablo = .Resize(, 4) 'matrice, plus rapide
End With
For i = 2 To UBound(tablo)
    If LCase(tablo(i, 1)) Like x Then
        n = n + 1
        For j = 1 To 4
            liste(n, j) = tablo(i, j)
        Next j
    End If
Next i
ListBox1.List = liste
End Sub
Bonne nuit.
 

Pièces jointes

  • ListBox(1).xlsm
    22 KB · Affichages: 27

Laurent97310

XLDnaute Nouveau
Wahou, ta méthode est en effet bien meilleure et beaucoup rapide!

Par contre j'ai un souci, la recherche doit se faire colonne où il n'y a que des champs numériques mais à priori il ne détecte plus rien. Aussi, il faudrait que seuls les résultats exactes apparaissent:
Par exemple, si j'écris 1, je veux seulement celui-ci, pas 1, 11, 111, 31 etc.

Aurais-tu une idée pour adapter le code?

Merci beaucoup en tout cas,
 

Laurent97310

XLDnaute Nouveau
Finalement j'ai rien dis, j'ai juste enlevé "x = "*" & x & "*" 'caractères génériques" et ca a marché

Une dernière interrogation, le code va chercher toujours la première colonne du tableau même si je change "With Feuil1.[A1].CurrentRegion". Or dans une autre situation où je veux appliquer le code, j'ai un tableau en A10 : IXXX et j'aimerais qu'il aille chercher la valeur de la colonne C. Même si je mets "With Feuil1.[C10].CurrentRegion", il va toujours me chercher ce qui est en A. Une idée là dessus?
 

job75

XLDnaute Barbatruc
Bonjour Laurent97310, le forum,

J'utilisais des caractères génériques car au post #1 le code utilise InStr.

Maintenant pour rechercher une valeur numérique en colonne C voyez ce fichier (2) :
VB:
Private Sub TextBox1_Change()
Dim v#, h&, liste(), tablo, i&, n&, j%
If Trim(TextBox1) = "" Then ListBox1.Clear: Exit Sub
v = Val(Replace(TextBox1, ",", ".")) 'valeur numérique
With Feuil1.[A10].CurrentRegion
    h = Application.CountIf(.Columns(3).Offset(1), v)
    If h = 0 Then ListBox1.Clear: Exit Sub
    ReDim liste(1 To h, 1 To 9)
    tablo = .Resize(, 9) 'matrice, plus rapide
End With
For i = 2 To UBound(tablo)
    If tablo(i, 3) = v Then
        n = n + 1
        For j = 1 To 9
            liste(n, j) = tablo(i, j)
        Next j
    End If
Next i
ListBox1.List = liste
End Sub
A+
 

Pièces jointes

  • ListBox(2).xlsm
    24 KB · Affichages: 21

Laurent97310

XLDnaute Nouveau
C'est juste parfait. Une dernière question cependant :
Imaginons que j'ai un tableau en A : D. Comment je peux faire pour que la recherche se fasse par rapport à la colonne B? Tout en sachant que je veux conserver l'affichage de la colonne A dans ma liste box?
 

Discussions similaires

Réponses
4
Affichages
420
Réponses
2
Affichages
329
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…