Fonction Excel qui évalue une chaîne comme s'il s'agissait d'une formule?

26

Supposons que j'ai une chaîne de texte comme "11+5"ou même "=11+5"stockée dans une cellule. Existe-t-il une fonction dans Excel qui me permettra d'évaluer réellement cette chaîne comme s'il s'agissait d'une formule?

Cela serait utile pour un autre projet où j'aimerais pouvoir écrire des formules «dynamiques» dans Excel.

drapkin11
la source
3
Excel avait cette fonction EVALUATE () qui fait exactement cela. C'était il y a longtemps cependant, et je ne suis pas trop sûr de la nouvelle Excel. Va fouiller et voir si je peux trouver quelque chose d'équiv.
aCuria
1
cette fonction semble familière, mais je ne la trouve certainement pas dans Excel2007, ce que j'utilise actuellement.
drapkin11
Je ne peux pas le trouver non plus = /
aCuria

Réponses:

26

EVALUATE est disponible en VBA dans toutes les versions actuelles

Vous pouvez l'inclure dans votre code VBA ou l'envelopper dans un UDF simple pour le rendre disponible en tant que fonction de feuille de calcul

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function

Il traite essentiellement la valeur du paramètre passé comme une formule Excel, comme s'il était entré dans une cellule

"11+5"et "=11+5"produira le même résultat

chris neilsen
la source
1
J'ai tout oublié des fonctions définies par l'utilisateur dans Excel - merci.
drapkin11
J'ai fait une petite modification en changeant le paramètre Range en String et cela fonctionne bien sous ma forme. merci
Makah
17
=evaluate(put_reference[s]_here)

Il s'agit d'une semi-fonction - elle ne peut être utilisée que dans le gestionnaire de noms.

Voici comment vous pouvez l'utiliser:

  • Pointez sur une cellule et ouvrez le Gestionnaire de noms (à partir de l'onglet FORMULES ou en cliquant sur CTRL + F3)

    Évaluer l'exemple

  • Écrivez =evaluate(et cliquez sur la cellule souhaitée (il est préférable de conserver une référence relative).

  • Terminez la formule avec )
  • Donnez-lui un NOM - (dans cet exemple, je vais simplement l'appeler eva).
  • Cliquez OK .

Supposons maintenant que vous avez sélectionné B1 et que tout cela se réfère à A1. En A1, vous pouvez mettre " 1 + 1 " et en B1 vous écrivez =eva- une fois que vous avez appuyé sur ENTRÉE, la valeur B1 sera 2. Comme la référence dans le gestionnaire de noms était relative, vous pouvez utiliser =evapour obtenir l'évaluation d'une cellule à gauche de l'endroit où vous le souhaitez. (par exemple en B2, =evarenverra le résultat de la cellule A2)

Laurentiu Mirica
la source
1
Très bon - et agréable à savoir. Cela fonctionne même pour une colonne de table: = EVALUATE (Tablename [@ [column]]) Quelque chose que vous ne pouvez pas trouver facilement dans une aide Excel ou un didacticiel avancé
Paschi
1
... et comme d'habitude avec les formules Excel, si vous utilisez une construction localisée, vous devez utiliser la fonction localisée - par exemple, dans Excel 2016 DE, elle s'appelle=auswerten(...)
kiwiwings
7

Il y a une mise en garde importante avec la grande réponse de @karel et @Laurentiu Mirica: la fonction d'évaluation ne recalculera que si la cellule référencée change. Par exemple, la cellule C1 contient le texte "A1+B1"et D1 contient la fonction =eval. Si les valeurs dans A1 ou B1 changent, la cellule D1 n'est pas recalculée .

Démonstration du problème de l'évaluation

Cela peut être corrigé en introduisant une fonction volatile dans la chaîne ou la cellule eval. Cela forcera un recalcul chaque fois que la feuille de calcul est recalculée. Par exemple, la cellule C1 pourrait être remplacée par =if(today(),"A1+B1",). Ou, D1 pourrait être remplacé par =if(today(),eval,). Toute fonction volatile devrait faire l'affaire.

Une troisième solution, et peut-être la plus simple, consiste à remplacer la semi-fonction du gestionnaire de noms par =if(today(),evaluate(c1),)

jlear
la source
Merci, je cherchais un truc comme celui-ci depuis un certain temps :)
Ben Personick
4
=indirect()

si vous l'utilisez dans une cellule (avec concaténation), cela peut être très utile.

Par exemple, cette formule affichera la valeur de la cellule B5 sur une autre feuille de calcul (dont le nom est stocké dans la cellule A2 de cette feuille de calcul):

=INDIRECT(CONCATENATE(A2,"!B5"))

Pour que INDIRECT fonctionne, la feuille de calcul externe doit être ouverte.

user206351
la source
Ne fonctionne pas, renvoie #REF
SIslam
10
INDIRECT peut effectuer des calculs et des fonctions, mais uniquement dans le cadre de la création d'une référence de cellule. Il ne peut pas être utilisé dans le sens général posé dans la question.
fixer1234