Boucle + .FindNext ne trouve pas toutes mes occurences Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
M
Mho33
Nouveau venu
Nouveau venu
Messages : 8
Inscrit le : 18 février 2019
Version d'Excel : 2010 fr

Message par Mho33 » 18 février 2019, 14:02

Bonjour,

J'ai un fichier excel avec toutes mes infos sur une seul page.
Un bloc de lignes pour l'année 2016 avec toutes les personnes pour 2016 et ainsi de suite pour 2017, 2018 Etc...
Je souhaite trouver dans la colonnes des noms toutes les cellules contenant ma valeur cherchée.
Si le résultat cherché est trouvé, il apparaît dans une ListBox et ainsi de suite pour les autres résultats.

Mon problème est que je trouve bien un résultat, je cherche bien le résultat suivant mais je dois avoir un problème dans ma boucle car lors de tout mes tests je n'arrive à afficher que deux résultats dans ma ListBox, surement le résultat de Find et le résultat de FindNext.
Je ne comprend pas pourquoi je n'ai que 2 résultats.
Par exemple pour "James" qui a une ligne présente dans chaque bloc de chaque année, il devrait apparaitre 4 fois et non pas 2 fois dans ma ListBox.

Merci d'avance!

Edit: je débute avec le visual basic

Mon code ici ==>
Private Sub RechercheButton1_Click()
Dim Val_chercher As Range
Dim Val_trouver As Range
Dim Value As String
Dim result As String

Set Val_chercher = Worksheets("Feuil2").Range("C2:C171")
'zone de recherche
'Vidage de la ListBox1
ListBox1.Clear


   With Val_chercher
       Set Val_trouver = .Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
       ' si le resultat chercher est trouvé
       If Not Val_trouver Is Nothing Then
            result = Val_trouver.Address
            'Set Val_chercher = .FindNext(Val_chercher)
            UserForm1.ListBox1.AddItem Val_trouver.Value
            'c.Select
            'essais de boucle + addlistebox
            Do
            Set Val_trouver = .FindNext(Val_trouver)
            Loop While Not Val_trouver Is Nothing And Val_trouver.Address = result
            UserForm1.ListBox1.AddItem Val_trouver.Value
       ' si résultat pas trouvé
       Else
            Value = MsgBox(TextBox1.Value & " résultat PAS trouvé!")
       End If
   End With

End Sub
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 4'494
Appréciations reçues : 199
Inscrit le : 16 mars 2017
Version d'Excel : 2010 sur PC

Message par i20100 » 18 février 2019, 14:25

Bonjour,

à tester,
Private Sub RechercheButton1_Click()
Dim Val_chercher As Range
Dim Val_trouver As Range
Dim Value As String
Dim result As String

ListBox1.Clear
Set Val_chercher = Worksheets("Feuil2").Range("C2:C171")

   With Val_chercher
       Set Val_trouver = .Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)

       If Not Val_trouver Is Nothing Then
            result = Val_trouver.Address

            Do
                Set Val_trouver = .FindNext(Val_trouver)
                UserForm1.ListBox1.AddItem Val_trouver.Value
            Loop While Not Val_trouver.Address = result
            
       Else
            Value = MsgBox(TextBox1.Value & " résultat PAS trouvé!")
       End If
   End With
End Sub
Si le problème est résolu, pensez au clic sur le bouton
isabelle
M
Mho33
Nouveau venu
Nouveau venu
Messages : 8
Inscrit le : 18 février 2019
Version d'Excel : 2010 fr

Message par Mho33 » 18 février 2019, 14:43

Merci pour votre retour.
En continuant à debug se petit morceau de code, je me suis dis que l'instruction ci-dessous bloqué la suite de la boucle, enfin sans en être sûr.
UserForm1.ListBox1.AddItem Val_trouver.Value
Du coup j'ai remis le bloc de la boucle à la suite, et là en effet je réussi bien a trouver les 4 occurences de ma recherche.
Par contre je pense que je "triche" un peu en faisant ça et en plus je rajoute du code superflue...
       If Not Val_trouver Is Nothing Then
            result = Val_trouver.Address
            'Set Val_chercher = .FindNext(Val_chercher)
            UserForm1.ListBox1.AddItem Val_trouver.Value
            'c.Select
            'essais de boucle + addlistebox
            Do
            Set Val_trouver = .FindNext(Val_trouver)
            Loop While Not Val_trouver Is Nothing And Val_trouver.Address <> result
            UserForm1.ListBox1.AddItem Val_trouver.Value
            Do
            Set Val_trouver = .FindNext(Val_trouver)
            Loop While Not Val_trouver Is Nothing And Val_trouver.Address <> result
            UserForm1.ListBox1.AddItem Val_trouver.Value
            Do
            Set Val_trouver = .FindNext(Val_trouver)
            Loop While Not Val_trouver Is Nothing And Val_trouver.Address <> result
            UserForm1.ListBox1.AddItem Val_trouver.Value
Je reste toujours à la recherche d'une solution légère et efficace :lctr:
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 7'938
Appréciations reçues : 238
Inscrit le : 16 juin 2013
Version d'Excel : 2013 UK Windows 10

Message par h2so4 » 18 février 2019, 14:55

bonjour,
proposition de correction
Private Sub RechercheButton1_Click()
    Dim Val_chercher As Range
    Dim Val_trouver As Range
    Dim Value As String
    Dim result As String

    Set Val_chercher = Worksheets("Feuil2").Range("C2:C171")
    'zone de recherche
    'Vidage de la ListBox1
    ListBox1.Clear
    With Val_chercher
        Set Val_trouver = .Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
        ' si le resultat chercher est trouvé
        If Not Val_trouver Is Nothing Then
            result = Val_trouver.Address
            Do
                UserForm1.ListBox1.AddItem Val_trouver.Value
                Set Val_trouver = .FindNext(Val_trouver)
            Loop Until Val_trouver.Address = result
            ' si résultat pas trouvé
        Else
            Value = MsgBox(TextBox1.Value & " résultat PAS trouvé!")
        End If
    End With

End Sub
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 14'694
Appréciations reçues : 435
Inscrit le : 27 août 2012
Version d'Excel : O365 32 bits

Message par Jean-Eric » 18 février 2019, 15:01

Bonjour,
Bonjour i20100, h2so4,
Une proposition avec un exemple.
Cdlt.
mh033.xlsm
(20.83 Kio) Téléchargé 2 fois
Private Sub UserForm_Initialize()
    Me.ListBox1.Clear
End Sub

Private Sub CommandButton1_Click()
Dim rngData As Range, Result As Range
Dim FirstResult As String
    Set rngData = Worksheets("Feuil2").Range("C2:C21")
    With rngData
        Set Result = .Find(TextBox1.Text, LookIn:=xlValues, LookAt:=xlPart)
        If Not Result Is Nothing Then
            FirstResult = Result.Address
            Do
                Me.ListBox1.AddItem Result.Value
                Set Result = .FindNext(Result)
            Loop While Not Result Is Nothing And Result.Address <> FirstResult
        Else
            MsgBox (TextBox1.Text & " résultat PAS trouvé !...")
        End If
    End With
End Sub
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
M
Mho33
Nouveau venu
Nouveau venu
Messages : 8
Inscrit le : 18 février 2019
Version d'Excel : 2010 fr

Message par Mho33 » 18 février 2019, 15:45

Merci à vous de vos retours.

J'ai testé les deux solutions.

la solution de Jean-Eric: Fonctionne en retrouvant les 4 occurrences mais même une cinquième qui sort de je ne sais pas où...?! Je réfléchis la-dessus.

La solution de h2so4: Fonctionne aussi, trouve bien les 4 occurrences mais efface la ListBox et n'en laisse plus qu'une à la fin, je souhaiterai que les 4 occurrences restent dans la ListBox et ne s'efface qu'au démarrage d'une nouvelle recherche.

Je continue mes recherches et mes tests :lctr: :lctr:
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 14'694
Appréciations reçues : 435
Inscrit le : 27 août 2012
Version d'Excel : O365 32 bits

Message par Jean-Eric » 18 février 2019, 15:49

Re,
Télécharge mon fichier, si tu est autorisé à le faire.
La procédure ne fait pas petits. ::D
Cdlt.
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 7'938
Appréciations reçues : 238
Inscrit le : 16 juin 2013
Version d'Excel : 2013 UK Windows 10

Message par h2so4 » 18 février 2019, 16:26

bonjour,
Fonctionne aussi, trouve bien les 4 occurrences mais efface la ListBox et n'en laisse plus qu'une à la fin, je souhaiterai que les 4 occurrences restent dans la ListBox et ne s'efface qu'au démarrage d'une nouvelle recherche.
c'est ce que fait la macro que j'ai fournie. il y a peut-être une interaction avec d'autres parties de ton code ...
M
Mho33
Nouveau venu
Nouveau venu
Messages : 8
Inscrit le : 18 février 2019
Version d'Excel : 2010 fr

Message par Mho33 » 19 février 2019, 15:21

Et Bonjour,

Je n'ai pas pu re-tester vos solutions avant cette après-midi car j'ai eu le déménagement de mon service se matin.

Et du coup, en re-testant la solution proposé par i20100, je me rend compte qu'elle fonctionne à merveille. Je ne sais pas se que j'ai fais (ou ce que j'ai oublier de faire) lors de mes tests hier.

Je vous remercie des retours, vraiment efficace et rapide! :thx: :p<3:
Je marque le sujet comme résolu.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message