Faire apparaitre plusieurs lignes dans userform

Bonjour à tous

j'ai créée un tableau avec 3 colonnes (année, nom, numero ) grâce à userform je peux rechercher tous ce qu'il se trouve dans le tableau

sauf que le résultat dans la ListBox est juste ma recherche . (c'est à dire si je cherche FER j’obtiens tous les noms avec FER mais pas les années ni les numéros correspondants)

ce que j'aimerais faire c'est en cherchant un nom, une année ou un numéro, la ligne correspondante s'affiche c'est à dire l'année le nom et le numéro

voir plusieurs lignes si plusieurs résultats

et là je sèche

je vous poste mon fichier pour mieux visualiser ma requête

Pourriez-vous m'aiguiller dans la procédure s'il vous plait

par avance merci

27recherche-nom.xlsm (30.64 Ko)

Bonjour,

A voir ton code, j'en déduis que tu as fais des amalgames de codes trouvés par ci par là

Voici un code (qui doit remplacer tout le tien) qui rempli la liste en fonction de ce qui est entré dans le TextBox au fur et à mesure :

Private Sub UserForm_Initialize()

    '3 colonnes pour la liste
    Me.ListBox1.ColumnCount = 3

End Sub

Private Sub CommandButton2_Click()

    Unload Me

End Sub

'la liste est remplie à chaque saisie dans le TextBox
Private Sub TextBox1_Change()

    Dim Cel As Range
    Dim Depart As String

    ListBox1.Clear

    If Trim(Me.TextBox1) = "" Then Exit Sub

    'défini la plage sur la colonne B
    With Worksheets("Feuil1"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 3).End(xlUp)): End With

    For Each Cel In Plage

        'certaines valeurs sont précédées d'un espace que je pense parasite, d'ou l'utilisation de Trim()
        If Trim(UCase(Cel.Value)) Like UCase(TextBox1.Text) & "*" Then

            Select Case Cel.Column

                Case 1
                    ListBox1.AddItem Cel.Value
                    ListBox1.Column(1, ListBox1.ListCount - 1) = Cel.Offset(, 1).Value
                    ListBox1.Column(2, ListBox1.ListCount - 1) = Cel.Offset(, 2).Value

                Case 2
                    ListBox1.AddItem Cel.Offset(, -1).Value
                    ListBox1.Column(1, ListBox1.ListCount - 1) = Cel.Value
                    ListBox1.Column(2, ListBox1.ListCount - 1) = Cel.Offset(, 1).Value

                Case 3
                    ListBox1.AddItem Cel.Offset(, -2).Value
                    ListBox1.Column(1, ListBox1.ListCount - 1) = Cel.Offset(, -1).Value
                    ListBox1.Column(2, ListBox1.ListCount - 1) = Cel.Value

            End Select

        End If

    Next Cel

End Sub

Bonjour

Voici le fichier modifié

La saisie n'a pas besoin d'être faite en majuscules , c'est automatique (évènement change du textbox)

59recherche-nom.xlsm (28.91 Ko)

Bonne continuation

Chers Patty et Theze,

merci beaucoup pour votre aide

effectivement j'ai pioche par ci et là des bouts de codes que j'ai essayé d'adapter à mon USF

je suis impressionné par la rapidité de votre réponse

merci

maintenant je poursuis ma quête de connaissance

à très bientôt sur le fofo

Bonjour

et moi je préfère comme ça

A+

Maurice

71recherche-nom.xlsm (32.44 Ko)

Bonjour,

Correction de mon code, comme la recherche porte sur les trois colonnes et que des valeurs commencent par exemple par "1" dans deux colonnes il y aura forcément des doublons donc utilisation d'un dictionnaire pour filtrer et ensuite, inscription du numéro de la ligne dans une colonne cachée afin de pouvoir éventuellement modifier ces valeurs :

Private Sub UserForm_Initialize()

    '3 colonnes pour la liste
    ListBox1.ColumnCount = 4
    ListBox1.ColumnWidths = "80;80;70;0"

End Sub

Private Sub CommandButton2_Click()

    Unload Me

End Sub

'la liste est remplie à chaque saisie dans le TextBox
Private Sub TextBox1_Change()

    Dim Fe As Worksheet
    Dim Dico As Object
    Dim Cel As Range
    Dim Depart As String

    ListBox1.Clear

    If Trim(Me.TextBox1) = "" Then Exit Sub

    Set Fe = Worksheets("Feuil1")

    'défini la plage sur la colonne B
    With Fe: Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 3).End(xlUp)): End With

    Set Dico = CreateObject("Scripting.Dictionary")

    For Each Cel In Plage

        'certaines valeurs sont précédées d'un espace que je pense parasite, d'ou l'utilisation de Trim()
        If Trim(UCase(Cel.Value)) Like UCase(TextBox1.Text) & "*" Then

        If Dico.exists(Fe.Cells(Cel.Row, 1).Value & "," & Fe.Cells(Cel.Row, 2).Value & "," & Fe.Cells(Cel.Row, 3).Value) = False Then

            Dico.Add Fe.Cells(Cel.Row, 1).Value & "," & Fe.Cells(Cel.Row, 2).Value & "," & Fe.Cells(Cel.Row, 3).Value, ""

            ListBox1.AddItem Fe.Cells(Cel.Row, 1).Value
            ListBox1.Column(1, ListBox1.ListCount - 1) = Fe.Cells(Cel.Row, 2).Value
            ListBox1.Column(2, ListBox1.ListCount - 1) = Fe.Cells(Cel.Row, 3).Value
            ListBox1.Column(3, ListBox1.ListCount - 1) = Cel.Row

            End If

        End If

    Next Cel

End Sub

Private Sub ListBox1_Click()

    With ListBox1

        MsgBox "Année : " & .Column(0, .ListIndex) & _
               vbCrLf & _
               "Nom : " & .Column(1, .ListIndex) & _
               vbCrLf & _
               "Code : " & .Column(2, .ListIndex) & _
               vbCrLf & _
               "Numéro de ligne : " & .Column(3, .ListIndex)

    End With

End Sub

Merci, c'est de plus en plus précis

bravo

Rechercher des sujets similaires à "apparaitre lignes userform"