Fonction VBA FIND
Bonjour,
Quelle déception!! Après 24 ans d'utilisation d'Excel et 22 ans de VBA, je "découvre" qu'en cherchant par valeur la fonction range.find() NE TROUVE PAS une cellule dont la formule contenue à l'intérieur donne une valeur de 1200, dans le cas où elle est formatée avec #'### !!! Par exemple:
=1090+110Et je parie que 90% de mes lecteurs ne le savent pas non plus!
Le paramètre xlValues induit en erreur, car ce n'est pas la valeur qu'il cherche, mais bien la séquence affichée avec l'apostrophe et tout et tout... D'après moi ça ne sert à rien pour 2 motifs:
1. lorsqu'on cherche un nombre, il se peut qu'on ne connaisse pas le format d'affichage à l'avance. D'ailleurs cela ne nous intéresse pas non plus!
2. dans un même classeur, il se peut que différentes cellules soient formatées de manière différente (#'##0 les unes et $#,##0 les autres par exemple) et dans ce cas find() ne trouverait pas toutes les cellules contentant la même valeur, mais seulement celles dont le formatage correspond à la séquence exacte qui est recherchée.
Personnellement je trouve que c'est un bug, d'après la définition qu'un bug est un comportement non-conforme à ce qu'on aurait voulu que le programme fasse.
Qu'en pensez-vous?
Connaissiez-vous cette particularité de range.find(), qu'on remarque lorsque des cellules contiennent des formules et sont formatées autrement qu'avec le format General?
Merci d'avance pour toutes vos réponses!
PS: Est-ce Microsoft lui-même est-il au courant? Peut-être pas...
Bonjour,
pas certain d'avoir compris, mais en cherchant 1200 dans plusieurs formats, je les trouve.
Tu peux montrer un fichier d'exemple ?
P.
Bonjour stefano.gatto,
La méthode Range.find permet d'effectuer une recherche suivant le type d'information.
Dans le cas que tu présentes, il faut utiliser LookIn:=xlFormulas.
C'est une particularité de cette fonction qui peut poser problème (en particulier avec les dates).
A+
@frangy
frangy a écrit :Bonjour stefano.gatto,
La méthode Range.find permet d'effectuer une recherche suivant le type d'information.
Dans le cas que tu présentes, il faut utiliser LookIn:=xlFormulas.
C'est une particularité de cette fonction qui peut poser problème (en particulier avec les dates).
A+
Justement, je me permets de me demander si ce n'est pas un bogue dans le sens précisé ci-dessus et pour les raisons présentées ci-dessus...
En tout cas, pour ce qui me concerne je n'ai pas trouvé FIND() assez utile tel qu'il fonctionne dans la version 2010:
Je voulais écrire une macro qui insère un client dans une liste de clients, seulement dans le cas où le client en question n'est pas déjà dans la liste. Pour vérifier s'il s'y trouve déjà, j'ai cru bien faire en faisant appel à la fonction FIND et n'insérer que dans le cas où elle retourne une erreur. Or cela ne marche pas car la colonne est formattée en "000 000 000" et les cellules contiennent des formules vlookup() qui retournent ces codes clients en question. Pour finir j'ai utisé WorksheetFunction.CountIf qui lui ne tient pas compte du formatage et compte aussi bien les valeurs que les chiffres rentrés en dur... Ca marche bien, mais c'est tordu d'utiliser WorksheetFunction...
@patrick1957:
Merci pour votre réponse rapide!
Je n'ai pas été assez clair, mais ce problème se manifeste seulement lorsqu'on recherche dans des cellules qui contiennent une formule (par exemple =VLOOKUP(...) ) qui résultent dans la valeur 1200.
Si les cellules contiennent 1200 en tant que valeur codée en dur alors ça marche, ce qui est d'ailleurs en contradiction avec le cas où c'est une formule qui résulte en 1200!.. car dans un cas FIND() tient compte du format, mais pas dans l'autre...
J'ai ajouté une formule qui résulte en 1200 dans le classeur que vous m'avez envoyé et vous pouvez constater que votre macro ne la trouve pas, alors que la valeur est bien 1200!
Dans ton exemple, la seule recherche qui n'aboutit pas avec LookIn:=xlFormulas est L8 qui contient une formule (=200+1000).
Ce qui parait normal puisque la barre de formules ne contient pas 1200.
Par contre, elle aboutit avec LookIn:=xlValues.
Toute la difficulté est de savoir ce que l'on cherche.
A+
@frangy
Effectivement ce n'est toujours pas clair...
Je me suis permis de modifier encore le classeur ci-joint pour montrer que rechercher par valeur ne marche pas lorsque la cellule est formatée. Dans cet exemple j'aimerais trouver toutes les cellules contenant la valeur 1200, indépendamment du format. Vous voyez bien que le premier bouton qui cherche par valeur ne trouve pas toutes les 4 cellules N9 à N12, qui pourtant contiennent toutes les 4 1200 comme valeur. La raison étant que certaines de ces cellules sont formatées, ce qui devrait être irrelevant à mon avis (et à celui de tant d'autres personnes).
Je suis d'accord pour dire qu'il y a "anomalie" du fait que la méthode Range.find ne permet pas de trouver la valeur 1200 avec le type LookIn:=xlValues dès lors qu'un format personnalisé est appliqué.
C'est d'autant plus inadmissible que ces formats personnalisés sont génériques.
C'est pire dans le cas de la cellule N10 puisque la méthode Range.find ne permet pas non plus de trouver cette valeur avec le type LookIn:=xlFormulas.
Je remarque par ailleurs que cette méthode est souvent décriée.
A+
ok je vous remercie 1000 fois pour votre franchise!
Je retrouve toujours une certaine crainte de critiquer MS et Excel, qui est peut-être le meilleur programme du monde oui, mais qui peut aussi comporter des problèmes.
Alors utilisons Application.WorksheetFunction.CountIf() pour vérifier si une valeur est comprise dans une liste, indépendamment du format de la cellule!