Textbox recherche & tri dans une Listbox

Bonjour à tous,

J'espère que vous saurez m'aider, j'ai essayé plusieurs codes trouvés sur ce forum et ailleurs sans réussir à les faire fonctionner jusqu'ici :

J'ai un UserForm (accessible via le bouton bleu) permettant de sélectionner des items dans une Listbox, et en cliquant sur Valider, d'effectuer le tri correspondant à la sélection dans un certain nombre de feuilles.

Dans cet UserForm, je voudrais faire une barre de recherche (Textbox) qui me permette de trier les propositions de cases à cocher qui apparaissent dans la Listbox.

Dans le cas où la barre de recherche n'est pas utilisée, je voudrais que la listbox reste affichée.

Dans le fichier ci-joint, j'ai déjà positionné la Textbox.

Mon dernier essai est le code suivant, mais comme je suis un bébé sur VBA je ne comprends pas ce qu'il manque pour que cela fonctionne - je n'ai pas de bug, mais l'effet recherché ne se produit pas :

Private Sub TextBox1_Change()

    Dim i As Long
    Dim sFind As String

    sFind = Me.TextBox1.Text

    If Len(sFind) = 0 Then
        Me.ListBox_Selection_Postes.ListIndex = -1
        Me.ListBox_Selection_Postes.TopIndex = 0
    Else
        For i = 0 To Me.ListBox_Selection_Postes.ListCount - 1
            If UCase(Left(Me.ListBox_Selection_Postes.List(i), Len(sFind))) = UCase(sFind) Then
                Me.ListBox_Selection_Postes.TopIndex = i
                Me.ListBox_Selection_Postes.ListIndex = i
                Exit For
            End If
        Next i
    End If

End Sub

PI : Les données affichées dans la listbox proviennent du tableau en onglet "source".

A noter que la ListBox a comme propriété d'être SelectMulti - pas certaine que cela puisse avoir une incidence, mais sait-on jamais.

D'avance merci beaucoup pour votre aide !

Bonjour,

Tout d'abord, je remplacerai :

 Me.ListBox_Selection_Postes.TopIndex = i
 Me.ListBox_Selection_Postes.ListIndex = i

par

Me.ListBox_Selection_Postes.Selected(i) = True

Ensuite, je changerai l'événement "Change" qui se produit dès le premier caractère entré dans la TextBox par un appui sur la touche "Entrée" après avoir entré l'ensemble des caractères :

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Dim i As Long
    Dim sFind As String

    If KeyCode = vbKeyReturn Then
        sFind = Me.TextBox1.Text

        If Len(sFind) = 0 Then
            Me.ListBox_Selection_Postes.ListIndex = -1
            Me.ListBox_Selection_Postes.TopIndex = 0
        Else
            For i = 0 To Me.ListBox_Selection_Postes.ListCount - 1
                If UCase(Left(Me.ListBox_Selection_Postes.List(i), Len(sFind))) = UCase(sFind) Then
                    Me.ListBox_Selection_Postes.Selected(i) = True
                    Exit For
                End If
            Next i
        End If

    End If

End Sub

Bonjour Thev,

Merci pour la suggestion. Je viens d'essayer, mais tout comme ma tentative précédente, je n'ai ni erreur ni changement qui apparaisse.

Je ne vois pas ce qu'il manque

Bonjour,

Tu as bien appuyé sur la touche Entrée après avoir entré ton critère de recherche ?

Oui...

Si j'entre comme critère de recherche "Poste 015", il me coche bien ce poste après avoir appuyé sur la touche Entrée. Ton code ne permet qu'une seule sélection du fait de la présence de l'instruction : Exit For

            For i = 0 To Me.ListBox_Selection_Postes.ListCount - 1
                If UCase(Left(Me.ListBox_Selection_Postes.List(i), Len(sFind))) = UCase(sFind) Then
                    Me.ListBox_Selection_Postes.Selected(i) = True
                    Exit For
                End If
            Next i

Merci pour l'info !

Est-il possible de faire en sorte que si je tape "5", j'ai tous les résultats incluant ce chiffre qui s'affichent ?

J'ai besoin que la multisélection fonctionne aussi avec la recherche

bonsoir,

il suffit de modifier ton code ainsi :

            For i = 0 To Me.ListBox_Selection_Postes.ListCount - 1
                If UCase(Me.ListBox_Selection_Postes.List(i)) Like "*" & UCase(sFind) & "*" Then
                    Me.ListBox_Selection_Postes.Selected(i) = True
                End If
            Next i

Merci beaucoup, ça fonctionne parfaitement comme ça !

Bonne soirée

Rechercher des sujets similaires à "textbox recherche tri listbox"