🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Evaluate dans Excel — Transformer une chaîne de formule en valeur

|

VBA Evaluate dans Excel — Transformer une chaîne de formule en valeur

TL;DR — Evaluate("SUM(A1:A10)") remet une formule sous forme de texte au moteur de calcul d'Excel et en renvoie le résultat. Le raccourci [ ] — [A1], [SUM(A1:A10)] — n'est littéralement qu'Evaluate déguisé. La différence qui compte : les crochets sont du texte figé, vous ne pouvez donc pas y glisser de variable ; Evaluate(aString) accepte une chaîne que vous construisez à l'exécution. Une formule erronée revient sous forme de variant Error, pas de plantage : testez-la donc avec IsError avant de vous en servir. Sortez-le du tiroir pour exécuter une formule assemblée dans le code — sinon, une simple formule de cellule ou WorksheetFunction est plus clair.

Sub EvaluateAFormula()
    Dim result As Variant
    result = Evaluate("SUM(A1:A10)")      ' Excel le calcule, comme le ferait une cellule
    If IsError(result) Then
        MsgBox "That formula did not compute"
    Else
        MsgBox "Total: " & result
    End If
End Sub

Les deux autres outils de cette famille exécutent du code par son nom — Application.Run exécute une macro, CallByName exécute un membre. Evaluate complète le tableau en exécutant une formule : vous remettez à Excel une expression de feuille sous forme de texte et il en calcule la réponse avec le moteur même dont se servent vos cellules. C'est l'idée unique derrière les trois — une chaîne devient une action exécutée à l'exécution — et Evaluate en est la version la plus typée Excel, car la chaîne que vous passez n'est qu'une formule, le langage que vous connaissez déjà depuis la grille. Le même avertissement se transpose : parce que la formule est du texte, rien ne la vérifie avant qu'elle ne s'exécute ; ne passez donc à Evaluate qu'une expression que vous avez vous-même construite ou validée.

Ce que vous allez apprendre

  • La place d'Evaluate aux côtés de Application.Run et CallByName
  • Le raccourci entre crochets [ ] et pourquoi c'est la même méthode
  • La différence cruciale : les crochets sont du texte figé, Evaluate accepte une chaîne construite à l'exécution
  • Lire le variant Error que renvoie une formule erronée, avec IsError
  • Qualifier l'appel vers la bonne feuille pour que les références se résolvent là où vous l'entendez
  • Quand utiliser Evaluate plutôt que WorksheetFunction ou une formule de cellule

Le modèle mental : emprunter le moteur de calcul de la feuille

Tout ce qui, dans Excel, calcule une valeur — chaque =SUM(...), chaque =VLOOKUP(...) — passe par un unique moteur de calcul. Evaluate est une porte d'entrée vers ce moteur depuis VBA. Vous passez une formule telle que vous la taperiez dans une cellule (avec ou sans le = de tête), et Excel l'évalue et vous en donne le résultat sous forme de Variant :

d = Evaluate("TODAY()")                    ' une date
n = Evaluate("2*PI()*10")                  ' un nombre
r = Evaluate("VLOOKUP(""Ada"", A:B, 2, 0)") ' une recherche, guillemets doubles pour la chaine

Le déclic mental, c'est que vous n'écrivez pas ici de la logique VBA — vous écrivez une formule Excel et vous demandez à Excel de l'exécuter. Tout ce qui est valide dans une cellule l'est à l'intérieur d'Evaluate, y compris des fonctions sans équivalent VBA.

Le raccourci entre crochets n'est qu'Evaluate déguisé

Cela surprend presque tout le monde : la notation [ ] que vous avez vue dans les macros des autres n'est pas un opérateur spécial. C'est un raccourci pour Evaluate. Ces deux lignes sont identiques :

x = [SUM(A1:A10)]          ' raccourci
x = Evaluate("SUM(A1:A10)") ' ce que cela fait reellement

[A1] vaut Evaluate("A1"), [Sales] (une plage nommée) vaut Evaluate("Sales"), et [1+2] vaut Evaluate("1+2") qui renvoie 3. Voir les crochets comme Evaluate, c'est le déclic qui relie cette page au reste de la famille : même le raccourci soigné n'est, sous la surface, qu'une indirection pilotée par une chaîne.

La différence qui compte : les crochets sont figés, Evaluate accepte une variable

Voici la règle unique qui décide de la forme à employer, et le point de confusion le plus fréquent. Le texte à l'intérieur de [ ] est littéral — vous ne pouvez pas y concaténer de variable, parce que les crochets ne sont pas une chaîne :

Dim col As String: col = "B"
' FAUX - vous ne pouvez pas construire une expression entre crochets depuis une variable :
' total = [SUM(col & "1:" & col & "10")]     ' ne fait pas ce que vous esperez

' CORRECT - construisez la chaine, puis Evaluate-la :
total = Evaluate("SUM(" & col & "1:" & col & "10)")   ' SUM(B1:B10)

Le choix est donc mécanique : utilisez [ ] quand la formule entière est une constante que vous tapez une fois — c'est plus court et cela se lit bien. Utilisez Evaluate(...) dès qu'une partie de la formule est construite à l'exécution à partir de variables, de valeurs de cellules ou d'une saisie utilisateur. Voilà toute la différence pratique entre les deux formes, et choisir la forme entre crochets pour une formule dynamique, c'est la raison pour laquelle on conclut que « les crochets sont cassés » alors qu'ils sont simplement le mauvais outil pour une variable.

Lire le résultat : une formule erronée renvoie un variant Error

Evaluate ne déclenche pas d'erreur d'exécution quand la formule est fausse — il renvoie un variant Error, la forme VBA de #NAME?, #REF!, #DIV/0! et consorts. Si vous utilisez le résultat sans le vérifier, l'erreur se propage en silence :

Dim result As Variant
result = Evaluate("SUM(Nonexistent)")     ' renvoie un variant Error, ne plante pas
If IsError(result) Then
    MsgBox "Formula error - check the expression"
Else
    ' utilisation de result sans risque
End If

Protégez toujours une expression construite à l'exécution avec IsError avant de faire confiance à la valeur. C'est le comportement inverse de WorksheetFunction, qui déclenche une erreur d'exécution interceptable en cas d'échec — une différence bonne à connaître au moment de choisir entre les deux.

Qualifier l'appel pour que les références se résolvent là où vous l'entendez

Un Evaluate non qualifié (et tout raccourci [ ]) résout ses références par rapport à la feuille active. Si la feuille active n'est pas celle que vous visiez, Evaluate("A1") lit la mauvaise cellule — un bug subtil quand une macro s'exécute depuis une feuille différente de celle sur laquelle le développeur a fait ses essais. Qualifiez l'appel pour le fixer :

' Resout A1:A10 sur Sheet1 quelle que soit la feuille active :
total = Worksheets("Sheet1").Evaluate("SUM(A1:A10)")

Worksheet.Evaluate et Workbook.Evaluate vous permettent de dire où la formule s'exécute. Se fier à la feuille active convient pour un coup ponctuel ; pour tout ce qui part en production, qualifiez l'appel afin qu'il ne dépende pas de ce que l'utilisateur a cliqué en dernier.

Evaluate, WorksheetFunction ou une formule de cellule

Trois façons d'obtenir une valeur calculée, trois métiers. Une formule de cellule convient quand le résultat a sa place sur la feuille et doit se recalculer — mettez =SUM(A1:A10) dans une cellule. WorksheetFunction convient quand vous voulez une fonction précise depuis VBA, avec l'IntelliSense et une erreur propre que vous pouvez intercepter : WorksheetFunction.Sum(Range("A1:A10")). Evaluate convient quand l'expression elle-même est dynamique — vous avez construit la chaîne de la formule à l'exécution — ou quand vous avez besoin d'une fonction de feuille que WorksheetFunction n'expose pas. Si la formule est une constante et que la fonction existe sur WorksheetFunction, préférez WorksheetFunction ; c'est plus clair et ses erreurs sont plus faciles à gérer.

Comment ExcelMaster vous aide

Les pièges, ici, sont silencieux : une forme entre crochets qui ignore sans bruit votre variable, un variant Error utilisé comme s'il était un nombre, une référence non qualifiée qui lit la mauvaise feuille. Aucun ne s'annonce.

ExcelMaster vous laisse décrire le calcul en mots simples — « additionne cette colonne, quelle que soit celle que le rapport a retenue, et signale-le si la formule échoue » — et il écrit le code Evaluate qui construit la chaîne sans risque, la vérifie avec IsError et qualifie la feuille. Vous conservez le classeur et le code, et vous évitez la mauvaise réponse silencieuse.

Questions fréquentes

Que fait Evaluate en VBA ?

Evaluate("expression") transmet une formule de feuille Excel, écrite sous forme de texte, au moteur de calcul d'Excel et renvoie le résultat calculé sous forme de Variant. Tout ce qui est valide dans une cellule fonctionne à l'intérieur. Utilisez-le pour exécuter une formule assemblée à l'exécution, ou pour atteindre une fonction de feuille que WorksheetFunction n'expose pas.

Que signifient les crochets en VBA ?

La notation [ ] est un raccourci pour Evaluate : [A1] vaut Evaluate("A1") et [SUM(A1:A10)] vaut Evaluate("SUM(A1:A10)"). Elle est plus courte pour les expressions constantes, mais le texte à l'intérieur est littéral — vous ne pouvez pas concaténer de variable dans les crochets. Dès qu'une partie de la formule est dynamique, utilisez plutôt la forme complète Evaluate(aString).

Pourquoi ne puis-je pas mettre de variable dans les crochets ?

Parce que [ ] n'est pas une chaîne — c'est du texte figé remis tel quel à Evaluate, si bien que [col & "1"] ne construit pas de référence à partir de col. Construisez la formule sous forme de chaîne et passez-la à Evaluate : Evaluate("SUM(" & col & "1:" & col & "10)"). C'est toute la raison pour laquelle la forme complète existe à côté du raccourci.

Comment vérifier si Evaluate a renvoyé une erreur ?

Evaluate renvoie un variant Error pour une formule erronée plutôt que de déclencher une erreur d'exécution : testez donc le résultat avec IsError(result) avant de l'utiliser. Cela diffère de WorksheetFunction, qui déclenche à la place une erreur interceptable — choisissez selon que vous préférez tester une valeur ou gérer une exception.

Faut-il utiliser Evaluate ou WorksheetFunction ?

Utilisez WorksheetFunction quand la fonction y existe et que la formule est fixe — elle offre l'IntelliSense et une erreur interceptable. Utilisez Evaluate quand l'expression est construite à l'exécution, ou quand vous avez besoin d'une fonction de feuille que WorksheetFunction n'expose pas. Pour une valeur qui doit vivre et se recalculer sur la feuille, utilisez plutôt une formule de cellule ordinaire que l'une ou l'autre.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 27/09/2026.

Guides associés : VBA Application.Run · VBA CallByName · VBA WorksheetFunction · VBA Range · VBA On Error · VBA Function · VBA Dictionary