45 votes

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

Supposons que j'aie 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 permette d'évaluer cette chaîne comme s'il s'agissait d'une formule ?

Cela me serait utile pour un autre projet dans lequel j'aimerais pouvoir écrire des formules "dynamiques" dans Excel.

32voto

chris neilsen Points 4226

EVALUATE est disponible en VBA dans toutes les versions actuelles

Vous pouvez l'inclure dans votre code VBA ou l'intégrer dans un simple UDF pour en faire une fonction de feuille de calcul.

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

Il traite la valeur du paramètre passé comme une formule Excel, de la même manière que si elle était saisie dans une cellule.

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

18voto

Laurentiu Mirica Points 191
=evaluate(put_reference[s]_here)

Il s'agit d'une semi-fonction - elle peut seulement à utiliser dans le gestionnaire de noms.

Voici comment vous pouvez l'utiliser :

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

    Evaluate Example

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

  • Terminer la formule avec )

  • Donnez-lui un NOM - (dans cet exemple, je l'appellerai simplement eva ).

  • Cliquez sur OK .

Supposons maintenant que vous ayez sélectionné B1 et que vous ayez fait référence à A1. Dans A1, vous pouvez mettre " 1+1 "et en B1 vous écrivez =eva - une fois que vous avez appuyé sur ENTER, 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 n'importe quelle cellule située à une cellule à gauche de l'endroit voulu. (par exemple, dans B2, =eva renvoie le résultat de la cellule A2)

13voto

jlear Points 141

Les excellentes réponses de @karel et @Laurentiu Mirica sont accompagnées d'une mise en garde importante : la fonction d'évaluation ne recalculera pas à moins que la cellule référencée ne change. Par exemple, la cellule C1 contient le texte "A1+B1" et D1 contient la fonction =eval . Si les valeurs de A1 ou B1 changent, la cellule D1 n'est pas recalculé .

Demonstration of eval problem

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

Une troisième solution, peut-être la plus simple, consiste à modifier la semi-fonction dans le gestionnaire de noms en =if(today(),evaluate(c1),)

6voto

Saurabh Points 911
=indirect()

si vous l'utilisez dans une cellule (en même temps que la concaténation), il peut être très utile.

Par exemple, cette formule affichera la valeur de la cellule B5 d'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 la fonction INDIRECT fonctionne, la feuille de calcul externe doit être ouverte.

1voto

Dvir Levy Points 1777

Fonction améliorée permettant d'exécuter une chaîne de caractères comme s'il s'agissait d'une formule. Fonction étendue à partir de la fonction ev() ci-dessus.

Nouveau Nom de la fonction : EvaluateEx()

  • Fonction Coller dans un module Excel VBA.
  • Placer le nom de la fonction dans un cellule de la feuille de calcul.

Exemple Syntaxe d'appel : * =EvaluateEx("=11 + 5") * =EvaluateEx("=g1 + g2")+ evaluateEX("2 + 3") * =EvaluateEX("nom défini")

Fonction testée avec :

  • Références des tableaux structurés
  • Noms définis qui font référence au texte,
    fonction filter(), etc.

    Function evaluateEx(r As Variant) As Variant
    'Note: Renaming function requires same change after the ExitFunction label.
    'User Function to evaluate string as formula.
     Dim ev As Variant
    
       Select Case TypeName(r)
    
           Case "Range"
                If r.Value <> vbNullString And Trim(r.Value) <> "=" Then
                   ev = Evaluate(r.Value)
                Else
                   ev = r.Value
                End If
    
           Case "String"
                If r <> vbNullString And Trim(r) <> "=" Then
                   ev = Evaluate(r)
                 Else
                   ev = r
                 End If
    
           Case "Variant()"
                 ev = r
    
           Case "Double"
                 ev = r
    
           Case "Error"
                 ev = "Defined Name not found in list of Defined Names. Cannot Evaluate"
    
           Case Else
                 ev = "Unknown parmeter type. Cannot Evaluate"
        End Select
    
        On Error GoTo ExitFunction 'Handle possible type mismatch
        If ev = CVErr(2029) Then
                 'ev = "The parameter passed to the EV function results in a value (i.e. " & r & ") that cannot be evaluated by the EV function."
                  ev = r
        End If
    
    ExitFunction:
    
        evaluateEx = ev
    
    End Function

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X