Fonction Evaluate en VBA : BUG incompréhensible ?!

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 31 juil. 2009 à 22:45
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 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...

Donc est-ce que "evaluate" Bug, ou c'est moi ?

Si vous avez des idées...

Amicalement,
Us.

8 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 23:22
salut,

pas testé mais erreur 13 c'est un problème de type

or tu n'as pas mis de guillemet pour une chaine attendue, contrairement à tes 2 autres tests qui fonctionnent...

v = "0.9009"

qu'est-ce que çà donne?
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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...

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
31 juil. 2009 à 23:44
Ah merde ! Je viens de trouver ! C'est la longueur de la chaine "eq" ! Elle ne peut pas dépasser 255 caractères... flûte ! ça m'arrange pas !

Merci PCPT... Bon, il faut que je trouve un moyen de contourner cette limitation maintenant...

A+
Amicalement,
Us.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2009 à 11:36
tiens, j'ai ajouté Sin, Cos et Exp pour que ton expression puisse être traitée...
http://www.vbfrance.com/codes/EVALUATION-EXPRESSION-FONCTION-EVAL-AVEC-GESTION-VARIABLES_43566.aspx

testé, pas décelé d'erreur...


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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 !

Amicalement,
Us.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2009 à 17:32
je commente peu, desolé ^^

concernant les fonctions, on peu en ajouter aisément.

CLexer s'occupe de découper les elements
CParser s'occupe de l'evaluation

donc la liste des fonctions est dans CLexer:
If InStr(1, ";Date;Now;Format;Len;Min;Max;Sum;Abs;IIf;StrReverse;left;right;mid;cos;sin;exp;", ";" & Token & ";", vbTextCompare) Then
                    Token = LCase$(Token)
                    Operand = [TOK Function]
                Else
                    Operand = [TOK Variable]
                End If



et la logique des fonctions dans CParser:

ElseIf moLexer.Operand = [TOK Function] Then
            ...
            Select Case sBuffer
                Case "len"




Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2009 à 17:32
après, j'ignore combien de fonctions te manquent, ou si tu souhaites les avoir toutes :S

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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...

Amicalement,
Us.
0
Rejoignez-nous