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()

18essaitrouve.xlsm (17.99 Ko)

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

Rechercher des sujets similaires à "comment fonctionne methode findnext"