Fonction Evaluate en VBA : BUG incompréhensible ?!
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
31 juil. 2009 à 22:45
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
3 août 2009 à 18:01
Bonsoir,
Depuis plusieurs heures je cherche à comprendre le bug de la fonction Evaluate, et j'en perds mon latin... Si vous avez une idée ? ou bien est-ce un bug du VBA ?
Voici un code exemple :
Sub eval2()
Dim eq As String, v As String
eq = "((cos(1.5*x-x+(-0.540419500270584))*(0.857492925712544*cos(x))^ 2)/(sin(1.5*x+(-0.540419500270584)))^ 3)*EXP(-(0.064)*((cos(1.5*x-x+(-0.540419500270584))*(0.857492925712544*cos(x))^ 2)/(sin(1.5*x+(-0.540419500270584)))^ 3))"
'v = "0.9" ' marche !
v = 0.9009 ' bug !
'v = "0.91" ' marche !
eq = WorksheetFunction.Substitute(eq, "x", v)
MsgBox Evaluate(eq)
End Sub
Donc pour une petite valeur de v (0.9009) la fonction Evaluate renvoi une erreur 13... Pour 2 autres valeurs encadrant cette dernière : pas de problème...
Bien sur, on peut croire qu'avec des cosinus et sinus, il y a un problème de division... mais non ! pour preuve... la même equation sans passer par evaluate :
Dim x As Double
x = 0.9009
MsgBox ((Cos(1.5 * x - x + (-0.540419500270584)) * (0.857492925712544 * Cos(x)) ^ 2) / (Sin(1.5 * x + (-0.540419500270584))) ^ 3) * Exp(-(0.064) * ((Cos(1.5 * x - x + (-0.540419500270584)) * (0.857492925712544 * Cos(x)) ^ 2) / (Sin(1.5 * x + (-0.540419500270584))) ^ 3))
renvoi les résultats sans problème... Entre 0,9 et 0,91 la fonction est continue et monotone...
Bref, je tourne en rond, et ce malgré mes nombreuses recherches pour trouver une explication logique... J'en vois pas. C'est d'autant plus embêtant que j'utilise qu'ici la fonction Evaluate dans beaucoup de mes petites fonctions...
L'exemple de l'equation n'a rien de particulier... Je peux en faire à l'infini...
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 31 juil. 2009 à 23:37
Bonsoir PCPT,
Hélas non... J'ai trituré le code dans tous les sens, et j'ai oublié de remettre les guillemets... Quel sens de l'observation !
En fait, j'ai aussi essayé v en Double... et toujours la même bug... En fait dès qu'on a v avec plus de 3 décimales... Par exemple : v="0.909" se calcul bien...
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 3 août 2009 à 17:12
Bonjour Renfield,
J'ai regardé ta source. Elle fonctionne effectivement, mais il est dommage qu'elle soit pas complète... En effet, pour remplacer "Evaluate" du VBA, il faudrait que toutes les fonctions de base soient prises en compte (Tan, Atn, etc...) Mais il est certain que posséder une fonction personnalisée (et complète) serait plus maniable...
Néanmoins, j'ai contourné complètement le problème entre gérant la chaine "eq" en lui mettant les caractères spéciaux "[" et "]" qui découpe l'expression à évaluer par morceau et reconstitue l'expression par le résultat... ceci me permet donc de traiter des expressions mathématiques assez grandes...
Euh... ton code est aussi assez imperméable... sans commentaire en plus !
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 3 août 2009 à 18:01
Bah, en fait un peu près toutes les fonctions ! puisque j'utilise la fonction Evaluate dans ma fonction personnalisée "F()" dans ma bibliothèque de fonctions de calcul "GAMMA" (=> voir mon modeste site)... En autre l'expression "eq" du départ correspond à une expression issu du calcul "Integrale" d'une fonction pour la loi Alpha-Stable... Bref, enfin pour dire que je ne peux plus me permettre de remplacer Evaluate par une fonction moins riche, au risque de me trouver coincé, d'autant que presque toutes mes autres fonctions font appellent à cette dernière. EN réalité, plus j'avance et plus j'utilise mes fonctions entre elles... c'est le but d'ailleurs... Néanmoins, la fonction Evaluate du VBA est un peu lente (mais complète)... IL reste qu'on peut aussi utiliser la syntaxe du type : =F(PI()) dans une cellule d'Excel... et faudrait aussi que ta fonction puisque rendre compte aussi des appels extérieures (basique ici, puisqu'on pourrait aussi s'en sortir en remplaçant PI() par 4*ATN(1), mais c'est pour l'exemple...)
Enfin, voilà... le pourquoi du comment !
IL reste que ta fonction est intéressante... Elle gère aussi de manière assez curieuse les parenthèses. Par exemple :
cos (1.5*x-x+-0.540419500270584)))))))))*cos(x)
ne lui pose pas de problème... Alors que n'importe qu'elle "programme" dirait STOP! mon gars! tu déconnes... enfin, c'est presque un avantage, à la réflexion...