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

VBA Formula dans Excel — écrire des formules en code avec .Formula et .FormulaR1C1

|

VBA Formula dans Excel — écrire des formules en code avec .Formula et .FormulaR1C1

TL;DRRange("D2").Formula = "=B2*C2" place une formule vivante dans une cellule, à l'inverse de .Value, qui y place un résultat statique. La règle qui piège tout le monde : .Formula utilise toujours des noms de fonctions en anglais américain et des séparateurs virgule, quelle que soit la langue de l'utilisateur. =SUM(A1,B1) marche partout et Excel localise l'affichage ; une version allemande =SUMME(A1;B1) déclenche l'error 1004. Utilisez .FormulaR1C1 pour estamper une formule relative sur toute une plage, et n'oubliez jamais le = en tête.

Range("D2").Formula = "=B2*C2"               ' une formule vivante - Excel l'evalue
Range("E2").Formula = "=IF(D2>100,""Big"",""OK"")"   ' les guillemets internes sont doubles

' estamper une formule relative sur toute une colonne en une affectation :
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"     ' chaque ligne : deux cellules a gauche

Mettre une formule dans une cellule depuis le code ressemble à affecter du texte, et mécaniquement c'en est — vous passez une chaîne à .Formula. Mais cette chaîne vit dans un dialecte figé, et c'est l'idée sur laquelle repose ce guide : .Formula utilise toujours des noms de fonctions en anglais américain et des séparateurs virgule, quels que soient les paramètres régionaux de l'utilisateur, et Excel traduit l'affichage pour vous. Une fois cela tenu, les erreurs 1004, la question de .FormulaLocal et la forme R1C1 prennent tous leur sens.

Ce que vous allez apprendre

  • Le modèle mental — .Formula écrit une formule vivante dans un seul dialecte figé
  • La règle la plus importante — noms de fonctions anglais et virgules, toujours
  • .FormulaLocal — quand il vous faut vraiment la langue et les séparateurs de l'utilisateur
  • .FormulaR1C1 — estamper une formule relative sur toute une plage
  • Le = en tête est obligatoire, et les guillemets internes doivent être doublés
  • Relire une formule, et .HasFormula

Le modèle mental : une formule vivante dans un dialecte figé

.Value stocke un résultat ; .Formula stocke une recette qu'Excel recalcule. Affecter .Formula, c'est ainsi qu'on fait produire au code des feuilles de calcul qui continuent de fonctionner après la fin de la macro :

Range("C2").Value = 42               ' un nombre statique
Range("C2").Formula = "=A2+B2"       ' une formule - se met a jour quand A2 ou B2 changent

La chaîne que vous affectez est écrite dans un seul dialecte canonique : des noms de fonctions en anglais américain (SUM, VLOOKUP, IF) et des virgules entre les arguments — même sur une machine dont l'interface Excel affiche SUMME et utilise des points-virgules. Excel stocke la formule sous cette forme neutre et l'affiche dans la langue de l'utilisateur. Ainsi, la même ligne de VBA produit une formule correcte et localisée pour chaque utilisateur de la planète, et c'est précisément pourquoi le dialecte est figé. Dès l'instant où vous essayez d'écrire dans la langue de l'utilisateur, vous heurtez l'erreur ci-dessous.

La règle la plus importante : noms anglais, virgules, toujours

C'est le seul fait qui transforme une macro qui marche en un 1004 sur la machine d'un collègue. .Formula n'accepte que des noms de fonctions en anglais américain et que la virgule comme séparateur d'arguments :

Range("A1").Formula = "=SUM(B1:B10)"     ' correct sur CHAQUE machine
Range("A1").Formula = "=SUMME(B1;B10)"   ' noms allemands + points-virgules -> erreur d'execution 1004

Deux choses sont verrouillées, pas une. Les noms de fonctions sont anglais (SUM, pas SUMME ni SOMME), et le séparateur de liste est toujours une virgule — même dans les régions où l'interface Excel utilise un point-virgule et où la virgule sert de séparateur décimal. Rédiger dans ce dialecte figé est un atout : écrivez .Formula = "=SUM(...)" une fois et c'est correct pour un utilisateur allemand, français ou espagnol, qui chacun la voient dans leur propre langue. Si une chaîne de formule bâtie avec des noms anglais échoue quand même, le coupable habituel est le séparateur — un point-virgule égaré, venu d'un copier-coller de la formule depuis une interface Excel localisée.

.FormulaLocal : quand vous voulez la langue de l'utilisateur

Il existe une propriété sœur, .FormulaLocal, qui lit et écrit dans la langue et les séparateurs de l'utilisateur :

' sur une machine allemande :
Range("A1").FormulaLocal = "=SUMME(B1;B10)"   ' noms allemands + points-virgules - OK ici
Debug.Print Range("A1").Formula               ' relu comme "=SUM(B1:B10)"

.FormulaLocal est le bon outil quand vous restituez exactement ce que l'utilisateur a saisi, ou quand vous construisez une interface qui montre les formules dans sa langue. Mais elle rend votre code non portable — la même chaîne qui marche sur une machine allemande échoue sur une machine anglaise. La règle pratique : rédigez avec .Formula (anglais, virgules) pour tout ce que vous livrez, et ne recourez à .FormulaLocal que lorsque vous devez précisément parler le dialecte de l'utilisateur. Quand vous lisez la formule d'une cellule pour l'afficher, .FormulaLocal donne au lecteur sa propre langue ; quand vous la lisez pour comparer ou stocker, .Formula vous donne la forme stable et neutre.

.FormulaR1C1 : une formule relative pour toute une plage

Quand vous générez une formule sur de nombreuses lignes, le style A1 vous oblige à penser aux références de chaque ligne. La notation R1C1 décrit les références comme des décalages par rapport à la cellule courante, si bien qu'une seule chaîne est correcte pour chaque cellule de la plage :

' style A1 - la reference est litterale, ajustee a mesure qu'Excel la recopie vers le bas :
Range("D2:D1000").Formula = "=B2*C2"          ' Excel decale B2/C2 par ligne

' style R1C1 - la reference est un decalage, identique a chaque ligne :
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"   ' "deux cellules a gauche fois une cellule a gauche"

RC[-2] signifie « même ligne, deux colonnes à gauche » ; R[-1]C signifie « une ligne au-dessus, même colonne » ; un nombre sans crochets comme R1C1 est absolu (équivalent à $A$1). Les deux lignes ci-dessus produisent le même résultat, mais R1C1 est sans ambiguïté pour les formules générées : vous ne suivez pas de tête la façon dont Excel ajustera B2 à la ligne 837. Pour tout ce que votre code écrit sur une plage, R1C1 est en général le choix le plus clair, et c'est la notation qu'émet l'enregistreur de macros. Voir VBA Range pour construire la plage cible.

Le = en tête et les guillemets doublés

Deux pièges mécaniques attrapent chaque débutant. D'abord, la chaîne doit commencer par =, sinon Excel la stocke comme du texte littéral, pas comme une formule, sans la moindre erreur pour vous avertir :

Range("A1").Formula = "SUM(B1:B10)"      ' pas de "=" -> la cellule affiche litteralement le texte SUM(B1:B10)
Range("A1").Formula = "=SUM(B1:B10)"     ' correct

Ensuite, comme toute la formule est une chaîne VBA entre guillemets doubles, tout guillemet à l'intérieur de la formule doit être doublé :

Range("A1").Formula = "=IF(B1="""",""empty"",B1)"   ' chaque "" est un guillemet litteral dans la formule

Cela s'affiche dans la cellule comme =IF(B1="","empty",B1). Mal compter les guillemets est le deuxième 1004 le plus fréquent après le problème de séparateur. Quand une chaîne de formule devient longue et pleine de guillemets, construisez-la en morceaux ou utilisez un utilitaire qui échappe les guillemets pour vous.

Relire une formule

.Formula lit autant qu'elle écrit. Sur une cellule qui contient une formule, elle renvoie la chaîne de la formule ; sur une cellule qui contient une constante, elle renvoie la valeur sous forme de chaîne :

Debug.Print Range("D2").Formula          ' "=B2*C2" si D2 a une formule, sinon p. ex. "100"
Debug.Print Range("D2").HasFormula       ' True seulement si c'est reellement une formule

Utilisez .HasFormula pour savoir laquelle vous avez avant d'agir sur la chaîne — elle vaut True seulement pour une vraie formule, False pour une constante. C'est la façon fiable de distinguer une cellule calculée d'une cellule saisie, et elle se marie naturellement avec la lecture du nombre sous-jacent via .Value ou .Value2, traitée dans VBA Value vs Value2 vs Text. Si vous voulez plutôt la réponse dans une variable VBA sans jamais placer de formule dans une cellule, appelez la fonction directement via VBA WorksheetFunction — c'est la voie « résultat dans une variable », tandis que .Formula est la voie « formule vivante dans la cellule ».

Comment ExcelMaster aide

Les bugs de .Formula qui gâchent un après-midi sont les silencieux : un point-virgule qui marche sur votre machine et fait 1004 sur celle d'un coéquipier, un = manquant qui transforme une formule en texte, un "" mal compté au fond d'un IF imbriqué, et une formule A1 estampée sur 1 000 lignes avec les références décalées d'un cran. Chacun est un détail de chaîne, invisible jusqu'à l'exécution.

ExcelMaster écrit des chaînes de formule correctes sur chaque machine. Décrivez la formule — « multiplie les deux colonnes de gauche, sur toute la hauteur du tableau » — et il émet .Formula dans le dialecte anglais américain neutre, ou .FormulaR1C1 quand la formule est relative et générée, avec le = en tête et chaque guillemet interne correctement doublé. Il sait quand vous voulez réellement .FormulaLocal, et quand vous vouliez en fait la réponse dans une variable via WorksheetFunction. Vous décrivez le calcul ; il écrit la chaîne qui s'exécute partout.

Questions fréquentes

Comment définir une formule dans une cellule avec VBA ?

Affectez à la propriété Formula une chaîne qui commence par = : Range("D2").Formula = "=B2*C2". Utilisez des noms de fonctions en anglais américain et des virgules — =SUM(A1,B1), pas un nom localisé ni des points-virgules — et Excel affiche la formule dans la langue de l'utilisateur automatiquement. Pour écrire la même formule sur toute une plage, affectez-la à la plage ; pour des formules relatives générées, utilisez .FormulaR1C1.

Pourquoi ma formule VBA renvoie-t-elle l'erreur d'exécution 1004 ?

La cause la plus fréquente est d'écrire dans un dialecte localisé : .Formula exige des noms de fonctions en anglais américain et des séparateurs virgule, si bien que =SUMME(A1;B1) échoue tandis que =SUM(A1,B1) marche. Les autres causes sont un = en tête manquant, ou des guillemets déséquilibrés dans la chaîne de formule (chaque guillemet littéral doit être doublé en ""). Si vous devez écrire dans la langue et les séparateurs de l'utilisateur, utilisez plutôt .FormulaLocal.

Quelle est la différence entre .Formula et .FormulaR1C1 ?

Les deux écrivent une formule vivante ; elles diffèrent par le style de référence. .Formula utilise la notation A1 (=B2*C2), où les références sont des cellules littérales. .FormulaR1C1 utilise la notation R1C1 (=RC[-2]*RC[-1]), où les références sont des décalages par rapport à la cellule courante, si bien qu'une seule chaîne est correcte pour chaque cellule d'une plage. R1C1 est plus clair pour les formules que votre code génère sur de nombreuses lignes, et c'est ce que produit l'enregistreur de macros.

Quelle est la différence entre .Formula et .FormulaLocal en VBA ?

.Formula utilise toujours des noms de fonctions en anglais américain et des séparateurs virgule, elle est donc portable — la même chaîne marche sur n'importe quelle machine. .FormulaLocal utilise la langue et le séparateur de liste de l'utilisateur, si bien que =SUMME(A1;B1) marche sur une machine allemande mais échoue sur une machine anglaise. Utilisez .Formula pour le code que vous livrez, et .FormulaLocal seulement quand vous devez précisément lire ou écrire des formules dans la propre langue de l'utilisateur.

Comment lire la formule d'une cellule en VBA ?

Lisez la propriété Formula : s = Range("D2").Formula renvoie la chaîne de la formule (comme "=B2*C2") pour une cellule de formule, ou la valeur sous forme de texte pour une constante. Vérifiez d'abord Range("D2").HasFormula — elle vaut True seulement quand la cellule contient réellement une formule, de sorte que vous pouvez distinguer une cellule calculée d'une cellule saisie avant d'agir sur la chaîne.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 31/08/2026.

Guides connexes : VBA Cell Value · VBA Value vs Value2 vs Text · VBA WorksheetFunction · VBA Range · VBA VLOOKUP