Boucle + .FindNext ne trouve pas toutes mes occurences
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
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
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
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
Bonjour,
Bonjour i20100, h2so4,
Une proposition avec un exemple.
Cdlt.
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
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
Re,
Télécharge mon fichier, si tu est autorisé à le faire.
La procédure ne fait pas petits.
Cdlt.
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 ...
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!
Je marque le sujet comme résolu.