Probleme de traduction de formule

insosama

XLDnaute Nouveau
Bonjour

je vous présente ici une formule qui comporte des fonctions perso.
toutefois, c'est, je pense, plutot un soucis de SYNTAXE de formule qu'autre chose

j'ai une fonction d'interprétation qui transforme des mots clé dans une formule, noté comme un simple texte, par les références des cellules pointé (des alias)

cette premiere fonction retourne le "francais interprété". ce texte, mis dans une cellule avec un "=" fonctionne donc normalement tel quel.

une seconde fonction se charge ensuite de traduire la formule en anglais.
cette nouvelle notation n'est pas testable dans l'etat, mais c'est la syntaxe correcte pour pouvoir ensuite faire un "evaluate" dessus.

je précise aussi que je suis en notation anglaise de base pour les nombre. donc que meme en francais, j'utilise des "." pour les décimale, et non des ",".

premier cas :
avant interprétation :
[FORMULA]si(%{Action1}%%R%="Etaux";compristextlist(%{Taille}%%R%;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI);si(%{Taille}%%R%>5;"#ERROR : MontageTABLE non accepté pour cette surface";compristextlist(%{Taille}%%R%;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+11))


après interprétation (FR)
Code:
si(AG18="Etaux";compristextlist(W18;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI);si(W18>5;"#ERROR : MontageTABLE non accepté pour cette surface";compristextlist(W18;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+11))

après traduction (EN)
Code:
IF(AG18="Etaux",compristextlist(W18,"0.1//1.5//5//10//20","1.5//5//10//20//30",false,true),IF(W18>5,"#ERROR : MontageTABLE non accepté pour cette surface",compristextlist(W18,"0.1//1.5//5//10//20","1.5//5//10//20//30",false,true)+11))

pour cette premiere formule, tout marche.
en francais, dans une cellule, j'ai bien "4". et un "evaluate" sur la formule anglaise marche aussi.


second cas :

avant interprétation :
[FORMULA]splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");%{Type}%%R%;0))

après interprétation (FR)
Code:
splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");AO18;0))

après traduction (EN)
Code:
splitvalue("74//90//106//135//163","//",findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans","//"),AO18,0))


meme bilan. en francais comme en anglais via evaluate, pas d'erreure, résultat conforme (135)


troisieme cas :

j'ai voulu concatener les deux résultat dans un seul, donc creer une formule complete :

avant interprétation :
[FORMULA]si(%{Action1}%%R%="Etaux";compristextlist(%{Taille}%%R%;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");%{Type}%%R%;0));si(%{Taille}%%R%>5;"#ERROR : MontageTABLE non accepté pour cette surface";compristextlist(%{Taille}%%R%;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+11+splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");%{Type}%%R%;0))))


FR :
Code:
si(AG18="Etaux";compristextlist(W18;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");AO18;0));si(W18>5;"#ERROR : MontageTABLE non accepté pour cette surface";compristextlist(W18;"0.1//1.5//5//10//20";"1.5//5//10//20//30";FAUX;VRAI)+11+splitvalue("74//90//106//135//163";"//";findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans";"//");AO18;0))))

EN :
Code:
IF(AG18="Etaux",compristextlist(W18,"0.1//1.5//5//10//20","1.5//5//10//20//30",false,true)+splitvalue("74//90//106//135//163","//",findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans","//"),AO18,0)),IF(W18>5,"#ERROR : MontageTABLE non accepté pour cette surface",compristextlist(W18,"0.1//1.5//5//10//20","1.5//5//10//20//30",false,true)+11+splitvalue("74//90//106//135//163","//",findindexarray(splitvalue("1 face & 1 plan//1 face & 2 plans//1 face & 3/4 plans//2 faces & 2 plans//2 faces & 3 et 4 plans//3 faces & 3 plans//3 faces & 4 et 5 plans","//"),AO18,0))))


et là ... c'est le drame.

la version FR fonctionne sans soucis (139)
mais un evaluate refuse de s'executer et retourne systématiquement "error 2015", sans autre explication.
les rares infos trouvé sur le web plointent un soucis de syntaxe.
mais j'ai beau relire la version anglaise, je ne vois aucune coquille.

voyez vous ce que j'ai loupé ?

bien que ce ne soit pas utile (je pense), je vais vous expliquer rapidement à quoi correspondent les 3 fonctions appellé ici :
- splitvalue est une formule foure tout qui remplace le "split" de VBA en formule. elle permet de couper une chaine valeur1//valeur2//valeur3 en définissant // comme cara de séparation. elle peu donc retourner tout un tableau, si index est donné à -1. si l'index est a 0, elle retourne le total de valeur (ici 3). et si l'index est positif, elle retourne un seul element du tableau, celui de l'index. si index = 2, alors splitvalue retourne un tableau a 1 case contenant "valeur2" (pour cet exemple)
elle peu aussi sous découper un second sous tableau (valeur1//val1|val2|val3//valeur2) ... mais ici, j'utilise que la simple fonction d'extraction de donnée avec une valeur d'index définie.

- ensuite, findindexarray retourne le n° d'index d'un tableau ou un element recherché (contenu, proche, ou strictement identique) est retrouvé.
si on fait un findindexarray du splitvalue d'exemple de tout a l'heure, en cherchant "valeur2", il retourne donc 2

- compristextlist est une version évolué de "compris", une fonction non visible dans la présente formule à problème. je vais la détailler car il est plus simple alors de comprendre celle utilisé ici.
* compris permet seulement de retourner true / false si une valeur X est bien comprise entre min et max, en tenant compte de si min et/ou max est inclu dans cette plage de donnée
* comprislist permet de comparer plusieurs plage différentes, donné en tant que tableau, et retourne la valeur de l'index correspondant
* compristextlist permet de fournir les liste non sous forme de tableau, mais sous forme de chaine de carra que "splitvalue" se charge d'exploser.

si necessaire, je peu passer un fichier permetant de tester uniquement cette formule (et non le module de traduction).
il devrait alors etre simple pour vous de constater ce que j'avance (fonctionne dans les 3 cas en formule dans une cellule, mais evaluate non fonctionnel dans le tout dernier cas)



merci beaucoup pour toute aide, je craque un peu...


cordialement.
 

Pièces jointes

  • essais.xlsm
    42.2 KB · Affichages: 42
  • essais.xlsm
    42.2 KB · Affichages: 49
  • essais.xlsm
    42.2 KB · Affichages: 37
Dernière édition:

insosama

XLDnaute Nouveau
Re : Probleme de traduction de formule

j'ajoute le fichier

le module 1 contient les 3 fonctions
le second module contient des fonctions tiers necessaires de comparaison de chaine de texte (pour split value) qui ne sont pourtant pas utilisé dans le cas présent, mais sans, splitvalue ne se lancerais pas, puisque celon les param donné a splitvalue, il peu devenir necessaire.

les elements sont ligne W
je redonne directement dans le fichier les différentes traduction FR / EN
un double clic n'importe ou lancera un evaluate de W24.
il suffit donc d'ecrire une formule dans cette cellule en anglais pour la tester.
 

Discussions similaires

  • Résolu(e)
Microsoft 365 Formule SI
Réponses
8
Affichages
137
Réponses
2
Affichages
485