Voici ma premiere source sur ce site, en faite cette source va etre utilisée pour un projet dans ma boite (résolution d'arbre décisionnel), et le meilleur moyen de tester un peu la robustesse du code est de la soumettre à un grand nombre de developpeur comme vous.
vous pouvez utiliser tous (enfin presque) les opérateurs de comparaison, logique,... (-,+,-(unaire),+(unaire),*,/,%,<,<=,>,>=,=,<>,AND,OR) de VB
syntaxe :
oObj.Analyze("(10+5)") 'Analyse de la chaine
oObj.Evaluate 'retourne le résultat
Il est possible de crééer des variables :
oObj.Analyze("(var1+10)")
oObj.SetVariable "var1",5
oObj.Evaluate 'retourne 15
oObj.SetVariable "var1",10
oObj.Evaluate 'retourne 20
Cela evite d'avoir à relancer l'analyse syntaxique de la chaine à chaque fois.
Voila, j'attends vos commentaire.
a+.
-------------------------------------------------------
Dim a As integer
a = -1
Expression = "a^2"
Expression2 = Replace(Expression, "a", a)
resultat = Evaluer (Expression2)
-------------------------------------------------------
et que je voie , ça retourne -1 !!!!!
en fait un remplacement ne résoud pas le problème ;
car une fois le a remplacé , il l'interprète commme -1^2 =-(1^2)=-1 et l'erreur !!
une solution est :Expression2 = Replace(Expression, "a", "(" & a & ")").
mais je cherche une source plus performante.
bonne chance
Juste un petit mot pour vous dire que je suis super heureux d'etre tombe sur cet echange de posts. Ca fait presque trois jours que je cherchais desesperement un evaluateur d'expression robuste et fiable... J'ai retourne tout le site VBfrance : analyseurs syntaxique, calculettes, evaluateurs de formules... A peu pres toutes les sources a ce sujet y sont passee, mais impossible de trouver chaussure a mon pied.
J'avais bien vu la solution d'Olilefou en passant par les bases de donnees (http://www.vbfrance.com/code.aspx?ID=2869), mais impossible de la faire fonctionner (impossible de saisir du texte dans les textboxs).
Et voila que je tombe sur ce nouveau post d'Olilefou qui resoud mon probleme en dix lignes... genial ! Derniere frayeur, ne pas pouvoir evaluer des expressions contenant des variables deja declarees.
Exemple, evaluation de Expression :
------------------------------------------------------
Dim a, b As integer
a = 1
b = 2
Expression = "3*a*b"
resultat = Evaluer (Expression)
-------------------------------------------------------
Probleme resolu rapidement avec un Replace :
-------------------------------------------------------
Dim a, b As integer
a = 1
b = 2
Expression = "3*a*b"
Expression2 = Replace(Expression, "a", a)
Expression2 = Replace(Expression, "b", b)
'qui remplace la chaine "3*a*b" en "3*1*2".
resultat = Evaluer (Expression2)
-------------------------------------------------------
Voila. Ca va me servir dans le cadre d'un programme utilisant des algorithmes genetique pour optimiser une structure composite (je suis eleve ingenieur en mecanique, j'etudie le comportement des structures composite dans le cadre d'un stage en labo de recherche). L'utilisateur pourra entrer la fonction qu'il souhaite optimiser en fonction de parametres non constants (d'ou les a, b...).
Voila, je ne suis pas sur que ca interesse grand monde, mais quand je suis content j'aime bien racconter ma vie... Je suppose que vous connaissez tous la sensation d'euphorie lorsque vous trouvez la solution a un probleme (dire que j'ai choisi la meca pour ne pas etre ingenieur informaticieeeeeeeeeeen... ;-) ).
Sinon, je voulais remercier par la meme occasion les admin et autres utilisateurs de ce site. Ca fait quatre mois que je bosse sur ce programme d'optimisation des stratifies composites, j'ai donc pas mal traine sur VBfrance pour chercher des reponses a mes nombreuses questions sur le language Visual Basic. Et j'y ai toujours trouve (plus ou moins facilement) des solutions a mes problemes. Je termine mon stage dans quinze jours (et le prgm par la meme ocassion... ) et je ne pense pas reprogrammer dans un futur proche (je suis mecanicien quand meme ;-) ), donc encore un grand merci a la communaute VBfrance.
Ciao a tous depuis Boulder dans le Colorado (ah oui, j'ai oublie de preciser, je suis aux USA... au pays de Bill et George... ;-( ).
P.S.: je pense a vous sur les pistes de Vail et Aspen ce week end !!!!
Il y a longtemps que je l'avais fais mais ils manquait les commentaires, c'est fait.
http://www.vbfrance.com/code.aspx?ID=27437
Vive de SQL...
Voici la methode qu'on utilise dans ma boite
(Ca peut interesser plus d'un):
on execute un select avec le texte de la formule
Par exemple:
"SELECT 5+2*3"
Certains SGBDs comme Sql Server n'ont pas besoin
de la clause FROM.
Pour d'autres comme ACCESS, il faut utiliser le FROM.
Dans ce cas, on peut definir une table contenant une seule ligne avec un seul field du type boolean pour minimizer l'espace
ce qui donne:
"SELECT " & GetFormule & " FROM TABLE_FORMULE;"
si la table a plus d'une ligne, utiliser le TOP 1.
Avantages:
- pas d'api
- methode 100% fiable (jusqu'à preuve du contraire)
Inconvenients:
- on a pas accés au code de conversion
- obligation d'utiliser un SGBD
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.