Anomalie de fonctionnement de la méthode Find de VBA/Excel [Résolu]

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 oct. 2013 à 14:01 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 17 oct. 2013 à 11:35
Bonjour,
L'ouverture de cette discussion fait suite à une observation que j'ai signalée aujourd'hui dans cette autre discussion :
http://codes-sources.commentcamarche.net/forum/affich-10008955-trouver-les-cellules-contenant-un-mot?page=2#29

J'y promettais une démonstration, que voici :

Ouvrons un classeur vierge.
Sur sa feuille Feuil1, insérons deux boutons de commande CommandButton1 et CommandButton2 et ce code :


Private Sub CommandButton1_Click()
  Range("A1:A2").NumberFormat = "dd/mm/yyyy hh:mm:ss;@ "
  Range("A1").Value = DateAdd("s", 3, Now)
  Range("A2").Value = Now
End Sub

Private Sub CommandButton2_Click()
  Dim q As Range, Z As Date
  Z = CDate(WorksheetFunction.Min(Range("A1:A2")))
  Set q = Range("A1:A2").Find(Z)
  If Not q Is Nothing Then MsgBox q.Address Else MsgBox "pas trouvé"
End Sub


Bien ! cliquons sur CommandButton1 === On obtient deux dates dans la plage A1:A2. La plus petite ayant été mise en A2, n'est-ce pas ?

Cliquons maintenant sur CommanButton2 ===>> la ligne 2 est bien trouvée (celle de la plus petite date) ==>> parfait parfait !
Recommençons à cliquer autant que l'on veut sur commandbutton2 ===>> impeccable !

Amusons-nous maintenant à modifier ainsi l'évènement click de Commandbutton2

Private Sub CommandButton2_Click()
   Dim q As Range, Z As Date
  Z = CDate(WorksheetFunction.Min(Range("A1:A2")))
  Set q = Range("A1:A2").Find(Z, LookIn:=xlValues)
  If Not q Is Nothing Then MsgBox q.Address Else MsgBox "pas trouvé"
End Sub

Comme nous le voyons, nous n'avons que spécifié la constante à attribuer à lookin, n'est pas ?

Cliquons donc maintenant sur CommanButton2 ===>> message "pas trouvé" !

Mais le plus fort, maintenant :
enlevons notre petite modif précédente et réécrivons ce qui fonctionnait avant, à savoir, donc :

Private Sub CommandButton2_Click()
  Dim q As Range, Z As Date
  Z = CDate(WorksheetFunction.Min(Range("A1:A2")))
  Set q = Range("A1:A2").Find(Z)
  If Not q Is Nothing Then MsgBox q.Address Else MsgBox "pas trouvé"
End Sub


On se dit que rien ne devrait s'opposer à ce que cela "marche", maintenant, puisque remis comme avant ?
===>> Ben non ! Pas du tout ===>> message "pas trouvé"
Et ce sera ainsi sans cesse dorénavant pour ce classeur !
Pour retrouver la première situation, pas d'autre solution que de le quitter et tout recommencer !
Voilà voilà ! C'est là une démo du comportement dénoncé et non son explication, que j'ignore !

Afficher la suite 

8 réponses

Répondre au sujet
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - Modifié par jordane45 le 16/10/2013 à 14:04
0
Utile
7
Je pense que ta réponse est dans le second lien.

Concernant la recherche de Dates, je vous invite à lire ceci :
/>Using Excel Find Method to Search for a Date

et un autre petit article qui peut aussi vous interesser :
Pourquoi utiliser XlFormulas ou XlValues ?

Cordialement,
Jordane
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 oct. 2013 à 17:57
Bon..
Je ne parviens pas à trouver une explication certaine au phénomène exposé plus haut.
Je viens par contre de trouver une parade.
Elle est tortueuse, mais sans faille, au moins :
Private Sub CommandButton2_Click()
  Dim q As Range, Z As String
  Z = CStr(CDate(WorksheetFunction.Min(Range("A1:A2"))))
  Set q = Range("A1:A2").Find(Z, LookIn:=xlValues)
  If Not q Is Nothing Then MsgBox q.Address Else MsgBox "pas trouvé"
End Sub


Je répète : il s'agit là d'une parade. Et rien d'autre qu'une parade.
Le mystère reste entier en ce qui concerne la non possibilité décrite plus haut de faire "revivre" le code qui marchait avant l'emploi de xlValues ...
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 oct. 2013 à 18:04
Le mystère (la vraie raison de cette discussion) restant entier, je ne peux cliquer sur le tag "Résolu" pour clore.
Une parade a certes été ainsi mise en place, mais elle n'est pas l'explication du phénomène (la seule pouvant faire que je clique sur "résolu").
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 oct. 2013 à 10:52
Coucou,
La découverte de ce phénomène m'empêche de bien dormir...
J'ai donc passé beaucoup de temps à faire des essais dans tous les sens et en suis arrivé aux conclusions suivantes :
VBA/Excel mémorise la dernière valeur affectée à l'argument Lookin et s'en sert comme valeur par défaut (lorsque, donc, cet argument n'est pas spécifié) pour toutes les utilisations ultérieures de la méthode Find
Reprenons maintenant la démonstration (mon tout premier message) de l'existence du phénomène.
1) La toute première utilisation de la méthode Find n'utilisait pas l'argument Lookin ===>> VBA, qui n'avait donc encore rien mémorisé pour Lookin, lui à spontanément (programmé par l'équipe microsoft ?) attribué une valeur par défaut (inconnue de nous) qui a permis le succès du Find
2) la seconde utilisation (en spécifiant Lookin = xlValues) a abpouti à un échec, mais a également entraîné la mise en mémoire de xlValues comme valeur par défaut de Lookin.
3) lorsque nous avons "rétabli" le code qui marchait (le 1er), donc sans spécifier l'argument Lookin ===>> VBA lui a d'office attribué la valeur par défaut (xlValues) qu'il avait mémorisée.

Que nous dit maintenant l'aide VBA pour ce qui est des valeurs possibles pour l'argument Lookin ? ===>>
xlComments -4144 Commentaires.
xlFormulas -4123 Formules.
xlValues -4163 Valeurs.


Il y en a pourtant une autre, qui nous est cachée puisque le tout premier code fonctionnait alors que l'argument lookin n'avait aucune de ces 3 valeurs, ni ne devrait logiquement pouvoir fonctionner, d'ailleurs, avec aucune de ces 3 valeurs (puisque les données traitées ne sont ni des formules, ni des commentaires.. et que, comme nous l'avons vu, xlValues provoque l'échec !

Chercher quelle est cette valeur "cachée" ne va pas être une partie de plaisir, mais je vais malgré tout essayer de la trouver
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 17 oct. 2013 à 11:33
en suis arrivé aux conclusions suivantes :
VBA/Excel mémorise la dernière valeur affectée à l'argument Lookin et s'en sert comme valeur par défaut

Toi tu n'as pas lu les liens que je t'ai donné.... tout y est expliqué...


La méthode cherche soit dans l'expression X ou Y selon que tu as affecté le paramètre "LookIn" avec" xlValues" ou "Xlformulas".



Cependant, il faut prendre le temps de lire la petite note de l'aide concernant cette méthode :

'---------------------

Les paramètres des arguments RechercherDans, Regarder, OrdreRecherche et RespecterNbreOctets sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucune valeur pour ces arguments lors du prochain appel à la méthode, les valeurs enregistrées sont utilisées. Le fait de définir ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments explicitement chaque fois que vous utilisez cette méthode.

'-----------------------

Ce qui précède est vrai que la recherche soit faite par du code VBA ou par la commande de l'interface de calcul.


ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 oct. 2013 à 11:35
Hé bien voilà : c'est contre toute attente et échappe à toute logique !
C'est la valeur -4123 (donc xlFormulas) alors que les cellules concernées ne contiennent aucune formule !!!
Et je viens d'ailleurs de voir que l'un des deux liens signalés par Jordane45 (salut) préconise (mais sans en donner la moindre explication) l'utilisation de cette valeur ...
Comment VBA traite-t-il dans un tel cas (puisque pas de formule) ? Allez donc le savoir !!!
On peut maintenant clore, donc ===>> "résolu".

PS : croisés, Jordane45.
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.