Comment fonctionne la méthode FindNext?
Bonjour,
Je débute la pratique du VBA avec Excel, et je butte sur un comportement bizarre des fonctions Find et FindNext.
J'ai consulté la doc et plusieurs pages sur le forum, et je comprends que ces deux fonctions mémorisent le contexte d'exécution précédent, ce qui est source de nombreuses erreurs.
Mon erreur doit se situer autre part, car mon utilisation de ces fonctions ne marche pas, m^me dans le cas simple suivant, dont je vous fourni le code:
Exemple: je souhaite rechercher dans la zone "A2:A7", les cellules contenant la valeur 1.
Pour cela, j'ai fait la fonction TrouveValeur que j'invoque comme cela: ==TrouveValeur(A1:A7;F2) dans une cellule de mon classeur où la valeur F2 contient 1.
Voici mon code:
Function TrouveValeur(zonerecherche As Range, valeur As Integer) As Integer
Dim premiereadresse As Integer
Dim c As Range
Dim nb As Integer
nb = 0
' Parametres optionnels de Find
' After:=
' SearchOrder:=xlByColumns
' SearchDirection:=xlNext
' LookIn:=xlValues
' LookAt:= Can be one of the following XlLookAt constants: xlWhole or xlPart.
' SearchOrder:= Can be one of the following XlSearchOrder constants: xlByRows or xlByColumns.
' After:=.Cells(1, 1)
' SearchDirection:=xlPrevious Can be one of these XlSearchDirection constants: xlNext or xlPrevious_
' MatchCase:= True to make the search case sensitive. The default value is False.
With zonerecherche
Set c = .Find(What:=valeur, LookIn:=xlValues)
If Not c Is Nothing Then
premiereadresse = c.Row
Do
nb = nb + 1
Set c = .FindNext()
MsgBox "Rangée " & c.Row
Loop While Not c Is Nothing And c.Row <> premiereadresse
End If
End With
TrouveValeur = nb
End Function
La fonction FindNext ne renvoie rien, alors que l'itération devrait remonter successivement les cellules contenant 1 dans la plage "zonerecherche" passée en argument de la fonction.
Merci d'avance à qui peut me pointe mes omissions.
Cordialement,
StefToulouse
Bonjour,
Déjà quelques remarques :
- tu devrais utiliser la balise Code (bouton en haut quand tu édites) pour qu'il soit lisible facilement, et l'indenter correctement. Il faut donner envie de lire si tu veux des réponses.
- utilises de préférence As Long plutôt que As Integer trop court dans de nombreux cas.
- dans .find() définit toujours le paramètre :=lookat. Sinon un jour tu te retrouveras à rechercher 'contient' au lieu de 'exact' ou l'inverse, ce qui n'a plus rien à voir.
Pour en venir à .findnext j'ai eu différents cas où il bugait.
J'ai résolu le problème en ne l'utilisant presque plus.
Je suppose que l'utilisation dans une fonction personnalisée utilisée sur feuille doit s'ajouter à la liste des cas. Rien dans ton code peut expliquer le non-fonctionnement.
A la place utilise .find avec le paramètre After:=c :
Set c = .Find(What:=valeur, after:=c, LookIn:=xlValues, lookat:=xlWhole)
eric
edit : autre conseil, dans les options VBE coche 'Déclaration des variables obligatoires' pour te rappeler à l'ordre (en cas d'oubli mais surtout en cas d'erreur de saisie dans le nom. Bug très difficile à trouver, tu pourras lire 20 fois tu ne verras pas l'erreur).
Merci de tes remarques, Eriic.
Je soignerai la qualité du code posté la prochaine fois.
Je vais m'inspirer d'un contournement avec la méthode .Resize que tu avais explicité dans un autre post (Find Findnext problème de bouclage).
Cordialement
Stéphane