Utilisation methode "Evaluate" sur fonction française

Jackdoug Messages postés 6 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 4 septembre 2011 - 3 sept. 2011 à 16:36
Jackdoug Messages postés 6 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 4 septembre 2011 - 4 sept. 2011 à 16:48
Bonjour,

Je cherche à évaluer le résultat de fonctions Excels contenues dans des variables.

Pour cela, on utilise la méthode Evaluate().
Seulement le hic c'est qu'elle n'évalue uniquement des fonctions rédigées dans le langage de macro (c.à d. en anglais) et non dans la langue local du système d'exploitation (ici le français).

Par exemple la fonction excel française
= SI(20>0;"C'est positif";"C'est nul ou négatif")
retournera une erreur si je la passe en paramètre dans la méthode Evaluate() .
Alors que la fonction excel macro
 =IF(20>0;"C'est positif";"C'est nul ou négatif")
sera correctement évaluée par Evaluate().

Habituellement, lorsqu'on travail avec des cellules, on utilise les propriétés .Formula ou FormulaLocal selon que l'on souhaite récupérer la fonction contenue dans la cellule sous la forme du langage Macro ou sous la forme du langage local.

Seulement je travail avec des variables string et j'aimerai savoir s'il existe une fonction ou une méthode qui permette de transformer une expression excel depuis la langue française vers le langage macro afin que je puisse évaluer des fonctions Excel rédigées en langue française.

Merci de votre aide

12 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
3 sept. 2011 à 17:39
Bonjour,

Pense à "poster" là où il convient, s'il te plait. Tu ne développes pas sous VB6, mais sous VBA (le VBA d'EXCEL)
je préfère te répondre de cette manière :
regarde ce que fait ceci :
Range("B1").FormulaLocal = "=SI(A1=1;2;0)"
MsgBox Range("B1").Formula


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Jackdoug Messages postés 6 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 4 septembre 2011
3 sept. 2011 à 18:12
Désolé si je n'ai pas posté au bon endroit, j'ai fais l'amalgamme. VB6, VBA pour moi c'est du lard ou du cochon
Ceci dit je ne sais toujours pas où devrait être posté ce sujet (après avoir chercher 5 minutes dans la longue liste).

Merci de votre réponse, cependant comme expliqué dans mon message, je sais déjà ce que font les propriétés Formula et FormulaLocal. Je les ai également déjà testées et utilisées (je suis un programmeur "intermediate").

Je repose donc ma question :

Seulement je travail avec des variables string et j'aimerai savoir s'il existe une fonction ou une méthode qui permette de transformer une expression excel depuis la langue française vers le langage macro afin que je puisse évaluer des fonctions Excel rédigées en langue française. 
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
3 sept. 2011 à 19:17
Bonjour

Comme ceci peut être:

Public Function Eval(X As String)

ActiveSheet.[A1].FormulaLocal = X
Eval = Evaluate(ActiveSheet.[A1].Formula)

End Function


En adoptant éventuellement A1 selon les contraintes.
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
3 sept. 2011 à 19:29
Et pourquoi pas

Public Function Eval(X As String)

ActiveSheet.[A1].FormulaLocal = X
Eval = ActiveSheet.[A1]

End Function
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 sept. 2011 à 19:46
Bonjour,

(J'ai ton 2ième aussi)

J'ai qu'une question, peut-être idiote, mais tout de même... Disons, si ta cellule A1 contient la formule :
=SI(20>0;"C'est positif";"C'est nul ou négatif")
Pourquoi tu cherches à connaitre son résultat avec Evaluate, plutôt que de reprendre directement sa valeur ?
(En effet, normalement, sa valeur vaut l'évaluation de la cellule...)

Amicalement,
Us.
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
3 sept. 2011 à 20:37
Parce que j'ai cru comprendre dans le 1er message du demandeur que ses formules se trouvaient dans des variables et non dans des cellules Excel.
d'où
ActiveSheet.[A1].FormulaLocal = X


C'est vrai, ça peut paraitre curieux.

Pourquoi tu cherches à connaitre son résultat avec Evaluate, plutôt que de reprendre directement sa valeur ?

Tout à fait d'accord avec toi. C'est exactement ce que j'ai rectifié dans mon dernier message.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
3 sept. 2011 à 20:53
Bonsoir GG72, oui j'ai vu aussi.

Jackdoug, ce n'est pas une critique, mais une simple question. En réalité, il me semble que tu compliques la vie. Tu dis travailler avec des "strings"... Mais les strings qui contiennent les formules du tableur est une structure très peu naturelle, peut-être même encore plus sous Excel...
Il me semble, à priori, que la meilleure solution est de revoir ce que tu veux faire, en utilisant le tableur, et non en essayant de le supplanter par une belle contorsion du VBA...

Amicalement,
Us.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
3 sept. 2011 à 21:22
Bonsoir, tous,

Je commencer personnellement à me poser des questions.
Il n'est pas impossible que l'on n'ait finalement (une fois de plus) affaire à autre chose que ce qui a été exprimé, avec les termes utilisés.
Plusieurs détails m'interdisent d'écarter cette hypothèse :
1)
méthode Evaluate()

2)
le hic c'est qu'elle n'évalue uniquement des fonctions rédigées dans le langage de macro

3)
Alors que la fonction excel macro
Code :

= IF(20>0;"C'est positif";"C'est nul ou négatif")

sera correctement évaluée par Evaluate().

Je serais reconnaissant au demandeur de nous confirmer qu'il ne s'agit finalement pas de l'utilisation de l'outil de l'ide d'Excel pour évaluer des formules
A propos de formules, celle visée au point 3 est un curieux mélange de notation anglaise (le IF) et française (le ;) !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Jackdoug Messages postés 6 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 4 septembre 2011
4 sept. 2011 à 11:01
Merci à tous pour vos réponse

Bon je vais rentrer un peu plus profondément dans le but de mon code, vu que cela suscite des interrogations.

Je réalise une programme sous Excel qui permet de générer des de multiples feuilles de données formatées sous formes de graphiques de type, de forme, de couleurs, etc.. différents.

Les données sont importées dans l'application depuis d'autres fichiers Excel et stockées par colonnes dans la worksheet "Benchmarks" de mon application.
Ainsi chaque fichier représente un questionnaire rempli par des utilisateurs lanbada.
Les réponses de ces questionnaires sont ensuite populées par colonne de la worksheet "Benchmark".
Chaque colonne représente ainsi les réponses d'un utilisateur lambda.

Une seconde worksheet "Generation" contient une liste d'instructions de génération des feuilles de graphiques avec leur mise en forme.

Une troisième worksheet "Paramètres" contient les paramètres généraux de l'application lui permettant de s'adapter facilement aux changements de canevas de données importées et autres aspects généraux. (Cette worksheet ne nous intéresse pas).

La seconde worksheet "Generation" est organisée de manière à définir de façon générique quel type de graphique sera affiché sur chaque feuille, avec quels titres, couleurs, etc... (il y a 4 graphiques par page) ainsi que les formules Excel qui détermineront les séries de données constituant chaque graphique.

Chaque formule est rédigée de manière générique avec une notation par élément pour permettre une gestion et un contrôle efficace des données la constituant.
Ainsi une formule prend la forme par exemple : "=(+)/", où les éléments , etc... représente des numéro de ligne des cellules à insérer dans la formule.
Les numéros de colonnes des cellules à insérer dans la formule sont quant à eux variables puisque les données importées sont classées sur différentes colonnes, chacune correspondante à un fichier importé et donc à chaque utilisateur lambda.

Les formules peuvent contenir les opérations arithmétiques standard, mais également des fonctions Excel financières ou autre.

Lors de la génération des feuilles de graphique chaque formule doit être adaptée pour intégrer les références de cellules à la place des notation par élément.
Ainsi par exemple "=(+)/" se transformera alternativement en "=(A15+A18)/A15", puis "=(B15+B18)/B15", etc..

Avant d'être utilisée, une formule ainsi adapté doit être évaluée afin d'éviter de planter l'application avec une erreur. Comme par exemple les divisions par zéro, les références en boucles, etc...

Vous comprenez, ainsi, pourquoi je travaille avec des string contenant des formules Excels qui elles même peuvent contenir des fonctions Excels.

Comme il y a de nombreux éléments à traiter et deux longues boucles, toute optimisation du code influence de façon notoire le temps de génération des graphiques.
D'autant plus si l'on imagine plusieurs version de l'application qui sont susceptibles d'importer des questionnaires différent.

J'espère avoir éclairci ma demande.

Merci à vous :)
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
4 sept. 2011 à 12:43
Bonjour,

Oui c'est bcp plus clair. J'entrevois mieux ce que tu cherches à faire.

Si je résume en quelques points, ce que tu cherches à faire :
1) Demander à l'utilisateur de rentrer une formule générique avec la syntaxe d'Excel ( "=(+)/" )
2) Demander à l'utilisateur les lignes qui correspond à et , etc. (pour chaque élément symbolique <x>)
3) [A priori : faire la même chose pour les colonnes, où retrouver les données par recherche]
4) Calculer les formules symboliques en les remplaçant par les lignes (+colonnes) itérés sur chaque élément.

Si j'ai bien compris, alors...

Pourquoi tu n'utilises pas une colonne vide (ou sur un autre feuille créée pour l'occasion), pour copier la formule symbolique en remplaçant les éléments génériques par les références précises.
Ainsi tu obtiendras les résultats, sans problème d'interprétation (et sans "surcouche" par Evaluate, donc bien plus rapide).
Ensuite tu auras aussi bien plus de facilité pour générer les graphiques avec (puisque tu te retrouves dans une situation habituelle). De plus, la recherche des calculs impossibles (division par zéro par exemple) sera également beaucoup facilité.

Je pense que tu devrais envisager les choses ainsi. Tu t'en sortira bien mieux.

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
4 sept. 2011 à 12:46
Re,

A noter que la recopie de la formule symbolique, sera également très simple, une fois la première rentrée. En effet, ce qui explique, c'est faire un COPIER/COLLER d'une formule avec des références relatives... On voit de suite l'avantage ici, par rapport à ton problème.

Amicalement,
Us.
0
Jackdoug Messages postés 6 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 4 septembre 2011
4 sept. 2011 à 16:48
Pourquoi tu n'utilises pas une colonne vide (ou sur un autre feuille créée pour l'occasion), pour copier la formule symbolique en remplaçant les éléments génériques par les références précises.
Ainsi tu obtiendras les résultats, sans problème d'interprétation (et sans "surcouche" par Evaluate, donc bien plus rapide).
Ensuite tu auras aussi bien plus de facilité pour générer les graphiques avec (puisque tu te retrouves dans une situation habituelle). De plus, la recherche des calculs impossibles (division par zéro par exemple) sera également beaucoup facilité.


C'est une bonne remarque. Je peux l'appliquer en partie sur certains "type" de graphiques.
Malheureusement, il y en a où une moyenne doit être calculée sur la base des formules symboliques. (Cela permet de comparée un utilisateur avec les autres sur des graph de type xlColumnClustered)
Et dans ce cas, je serais donc obligé de "tricoter" en passant via une cellule arbitraire pour vérifier la validité du résultat avant de l'intégrer dans le calcul de moyenne.

Bonne idée également pour l'auto-remplissage des cellules une fois la première entrée.

Merci
0