Convertir un string en instruction

Bonjour,

Je cherche comment convertir un string (contenu dans une cellule ou dans un array/collection) en une instruction (une ligne de code donc).

par exemple si dans ma cellule A3 j'ai "A1*A2" (en texte), la ligne de code "var1 = fonction(range(A3).value)" serait exécuté de la même manière que "var1 = A1*A2"

Est-ce possible ?

Bien sur dans la finalité ce serait bcp plus complexe que de faire une multiplication entre 2 cellules. Ce serait de stocker des formules au format texte (mais avec la bonne syntaxe), et que ces formules soient exécutée par le code sur de nombreuses lignes de nombreux onglets. Les dites formules seraient des formules simples du genre "0,75*var1+2,54" ou au pire du pire avec un si pour différencier le cas positif ou negatif comme ça : "if (var3<0 then calc(var3) = -1*ABS(var3)^1,4 else calc(var3) = (var3)^1,4 end if ". Ainsi on pourrait changer le code en modifiant une des formules directement dans l'onglet sans avoir à ouvrir l'éditeur de macro.

Si besoin je peux faire un fichier excel du rendu avec un exemple sur quelques lignes.

Merci beaucoup par avance

Bonjour,

perso je mettrai les formules en réel avec = ce qui te permet de valider la syntaxe, pas grave si elle retourne une erreur autre.

Quitte à utiliser Ctrl+" si tu veux les voir en texte.

Ensuite, avec par exemple =ARRONDI(C2*2+D2;0) en A2 :

Sub test()
    Dim form As String
    form = [A2].Formula ' formule en anglais
    form = Replace(form, "C2", 14) ' 14 ou une autre référence
    MsgBox Evaluate(form)
End Sub

eric

Bonjour Eriiic et merci bcp de ta réponse

Si je comprend bien c'est evaluate(form) qui remplit la fonction que je souhaite ?

la formule stockée en chaine de caractère doit être au format excel ou VBA ? par exemple pour une condition si "si(cond;calcSiVrai;calcSiFaux)" ou "if cond then calcSiVrai else calcSiFaux endif"

le replace(form,C2,14) c'est pas obligatoire non ? elle est capable de cherche la référence, ou il faudrait que la référence soit sous la forme [C2].value ? Dans mon cas ce sera plutôt des variables définies précédemment dans le code. Donc utiliser la validation de formule me parait compliqué, sauf à nommer des cellules de l'onglet de la même manière que mes variables juste à des fins de tests de la formule, mais j'ai peur de tomber sur des conflits de noms et qu'il appelle cette cellule à la place de ma variable.

Encore merci à toi

Si je comprend bien c'est evaluate(form) qui remplit la fonction que je souhaite ?

pour le savoir applique le 1er réflexe à avoir : F1 dessus

Moi je te conseillais de mettre une vraie formule que tu aura testée et que tu récupères par .Formula.

Donc utiliser la validation de formule me parait compliqué, sauf à nommer des cellules de l'onglet...

Difficile de suivre sans exemple concret.

Si tu continues avec "si(cond;calcSiVrai;calcSiFaux)" c'est du traitement de chaine classique mais c'est à toi de faire tout le boulot de contrôle de la syntaxe. VBA ne te laissera rien passer comme erreur.

Tu mets un Stop, un espion sur ta chaine en cours de construction et tu regardes si c'est bien ce que tu veux en pas à pas.

Avec Evaluate c'est fonction en anglais, références type A1.

Sinon tu as la possibilité de coller ta formule en français dans une cellule de travail avec .FormulaLocal ou FormulaLocalR1C1, et de récupérer le résultat avec .Value.

Si ce sont des matricielles lourdes il faudra ajouter une instruction avant pour être sûr qu'excel ait eu le temps de l'évaluer complètement.

le replace(form,C2,14) c'est pas obligatoire non ?

exemple bidon

eric

Ok je comprends mieux merci.

ça marche pas exactement comme je l'aurais souhaité, mais je vois comment je peux modifier le reste de ma macro pour que ces formule aille chercher les bonnes valeurs pour s'exécuter. La solution vient finalement de la fonction replace qui me permet d'adapter la formule à chaque itération pour cibler la cellule que je veux, plutôt que d'utiliser une variable VBA.

Merci beaucoup ! je passe en résolu

Rechercher des sujets similaires à "convertir string instruction"