Supposons que j'ai une chaîne de texte telle que "11+5"
ou même "=11+5"
stockée dans une cellule. Existe-t-il une fonction dans Excel qui me permette d’évaluer 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.
EVALUATE
est disponible en VBA dans toutes les versions actuelles
Vous pouvez l'inclure dans votre code VBA ou l'envelopper dans une 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
En gros, la valeur du paramètre passé est traitée comme une formule Excel, comme si elle était entrée dans une cellule.
"11+5"
et "=11+5"
produiront le même résultat
=evaluate(put_reference[s]_here)
Ceci est une demi-fonction - il ne peut que être utilisé 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).
Écrivez =evaluate(
et cliquez sur la cellule souhaitée (conservez la référence relative).
)
eva
).Supposons maintenant que vous avez sélectionné B1 et que tout cela est référé à A1. En A1 vous pouvez mettre "1 + 1"et dans B1 vous écrivez =eva
- une fois que vous avez appuyé sur ENTREE, la valeur B1 sera 2
. Comme la référence dans le gestionnaire de noms était relative, vous pouvez utiliser =eva
pour obtenir l'évaluation de toute cellule dont il reste une cellule à partir de l'endroit souhaité. (par exemple, dans B2, =eva
renverra le résultat de la cellule A2)
@Karel et @Laurentiu Mirica ont une mise en garde importante: la fonction d'évaluation ne recalculera pas à moins que la cellule référencée ne soit modifiée. 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 .
Cela peut être corrigé en introduisant une fonction volatile dans la chaîne ou dans la cellule eval. Cela forcera un recalcul chaque fois que la feuille de calcul est recalculée. Par exemple, la cellule C1 peut être remplacée par =if(today(),"A1+B1",)
. Ou bien, D1 pourrait être remplacé par =if(today(),eval,)
. Toute fonction volatile devrait faire l'affaire.
Une troisième solution, peut-être la plus simple, consiste à remplacer la fonction semi-function dans le gestionnaire de noms par =if(today(),evaluate(c1),)
=indirect()
si vous utilisez ceci dans une cellule (à côté de concaténer), 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.