TL;DR —
Range("D2").Formula = "=B2*C2"は、静的な結果を入れる.Valueとは違い、セルに 生きた数式 を入れます。誰もがつまずくルール:.Formulaはユーザーの言語が何であれ、つねに US-English の関数名とカンマ区切り です。=SUM(A1,B1)はどこでも動き、Excel が表示を ローカライズします。ドイツ語の=SUMME(A1;B1)は error 1004 になります。1 つの相対数式を 範囲全体に押し込むには.FormulaR1C1を使い、先頭の=を決して忘れないでください。
Range("D2").Formula = "=B2*C2" ' 生きた数式 — Excel が評価する
Range("E2").Formula = "=IF(D2>100,""Big"",""OK"")" ' 内側の引用符は二重にする
' 相対数式を列全体に 1 回の代入で押し込む:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]" ' 各行:2 つ左のセル
セルにコードから数式を入れるのは、テキストを代入するように見えますし、仕組みとしてはそのとおり
です — .Formula に文字列を手渡します。しかしその文字列は 固定された方言 で生きており、それこそ
が本記事の軸です。.Formula はユーザーのロケールに関係なく、つねに US-English の関数名とカンマ
区切りを使い、Excel が表示をあなたの代わりに翻訳します。 これさえ押さえれば、1004 エラーも、
.FormulaLocal の問題も、R1C1 形式も、すべて筋が通ります。
この記事で学べること
- 考え方の軸 —
.Formulaは 1 つの固定された方言で生きた数式を書く - 最も大事なルール — 英語の関数名とカンマ、つねに
.FormulaLocal— ユーザーの言語と区切り文字が実際に必要なとき.FormulaR1C1— 1 つの相対数式を範囲全体に押し込む- 先頭の
=は必須で、内側の引用符は二重にする - 数式を読み戻すことと、
.HasFormula
考え方の軸:固定された方言の生きた数式
.Value は結果を格納し、.Formula は Excel が再計算する レシピ を格納します。.Formula を代入
することが、マクロが終わったあとも動き続けるスプレッドシートをコードで生み出す方法です。
Range("C2").Value = 42 ' 静的な数値
Range("C2").Formula = "=A2+B2" ' 数式 — A2 や B2 が変われば更新される
代入する文字列は、1 つの正準な方言で書かれます。US-English の関数名(SUM、VLOOKUP、IF)と、
引数のあいだの カンマ — Excel の UI が SUMME を表示しセミコロンを使うマシンであってもです。
Excel は数式をその中立な形で格納し、ユーザーの言語で 表示 します。だから同じ 1 行の VBA が、地球上
のどのユーザーにも正しくローカライズされた数式を生みます。方言が固定されているのは、まさにそのため
です。代わりにユーザーの言語で書こうとした瞬間、下のエラーにぶつかります。
最も大事なルール:英語名、カンマ、つねに
これが、動くマクロを同僚のマシンで 1004 に変えてしまう、たった 1 つの事実です。.Formula は
US-English の関数名だけ と、引数区切りとして カンマだけ を受け付けます。
Range("A1").Formula = "=SUM(B1:B10)" ' すべてのマシンで正しい
Range("A1").Formula = "=SUMME(B1;B10)" ' ドイツ語名 + セミコロン -> 実行時 error 1004
ロックされているのは 1 つではなく 2 つです。関数名 は英語(SUMME や SOMME ではなく SUM)
で、リスト区切り はつねにカンマ — Excel の UI がセミコロンを使い、小数点がカンマである地域でさえ
です。この固定された方言で書くことは長所です。.Formula = "=SUM(...)" と一度書けば、ドイツ語、
フランス語、スペイン語のユーザーにとって正しく、彼らはそれぞれ自分の言語で 見ます。英語名から
組み立てた数式文字列がそれでもエラーになるなら、たいていの犯人は区切り文字です — ローカライズ
された Excel の UI から数式をコピーしてきた、紛れ込んだセミコロンです。
.FormulaLocal:ユーザーの言語がほしいとき
姉妹プロパティの .FormulaLocal があり、これは ユーザーの 言語と区切り文字で読み書きします。
' ドイツ語のマシンで:
Range("A1").FormulaLocal = "=SUMME(B1;B10)" ' ドイツ語名 + セミコロン — ここでは OK
Debug.Print Range("A1").Formula ' "=SUM(B1:B10)" として読み戻される
.FormulaLocal は、ユーザーが打ち込んだものをそのまま反映するときや、数式をユーザーの言語で見せる
UI を作るときに正しい道具です。しかしこれはコードを 可搬でなくします — ドイツ語のマシンで動く
同じ文字列が、英語のマシンでは失敗します。実践的なルール:出荷するものはすべて .Formula(英語、
カンマ)で書き、ユーザーの方言を話す必要があるときだけ .FormulaLocal に手を伸ばす。表示のために
セルの数式を読むなら .FormulaLocal が読み手に自分の言語を返し、比較や保存のために 読むなら
.Formula が安定した中立の形を返します。
.FormulaR1C1:範囲全体に 1 つの相対数式
多数の行にわたって数式を生成するとき、A1 形式では各行の参照を考えさせられます。R1C1 記法は参照を 現在のセルからのオフセット として記述するので、1 つの文字列が範囲内のすべてのセルで正しくなり ます。
' A1 形式 — 参照はリテラルで、Excel が下方向にコピーする際に調整される:
Range("D2:D1000").Formula = "=B2*C2" ' Excel が行ごとに B2/C2 をずらす
' R1C1 形式 — 参照はオフセットで、どの行でも同一:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]" ' 「2 つ左 × 1 つ左のセル」
RC[-2] は「同じ行、2 列左」を意味し、R[-1]C は「1 行上、同じ列」、R1C1 のように角括弧のない
数値は 絶対参照($A$1 に相当)です。上の 2 行は同じ結果を生みますが、生成する数式には R1C1 が
曖昧さなく効きます。837 行目で Excel が B2 をどう調整するかを頭で追う必要がないからです。コードが
範囲全体に書き込むものには、たいてい R1C1 のほうが分かりやすい選択で、マクロ記録が出力する記法でも
あります。対象の範囲を作る方法は VBA Range を参照してください。
先頭の = と二重の引用符
初心者を必ず捕まえる機械的な罠が 2 つあります。1 つ目、文字列は = で始まらなければなりません。
さもないと Excel はそれを数式ではなくリテラルのテキストとして格納し、警告するエラーも出しません。
Range("A1").Formula = "SUM(B1:B10)" ' "=" がない -> セルには文字どおり SUM(B1:B10) と表示される
Range("A1").Formula = "=SUM(B1:B10)" ' 正しい
2 つ目、数式全体が二重引用符で囲まれた VBA 文字列なので、数式の中の引用符はすべて二重にしなければ なりません。
Range("A1").Formula = "=IF(B1="""",""empty"",B1)" ' 各 "" は数式内の 1 つのリテラル引用符
これはセルの中で =IF(B1="","empty",B1) として現れます。引用符の数え間違いは、区切り文字の問題に
次いで 2 番目に多い 1004 です。数式文字列が長く引用符だらけになったら、断片に分けて組み立てるか、
引用符をエスケープしてくれるヘルパーを使いましょう。
数式を読み戻す
.Formula は書くだけでなく読みもします。数式を保持するセルでは数式文字列を返し、定数を保持する
セルでは値を文字列として返します。
Debug.Print Range("D2").Formula ' D2 に数式があれば "=B2*C2"、なければ例えば "100"
Debug.Print Range("D2").HasFormula ' 実際に数式のときだけ True
.HasFormula を使えば、文字列に手を付ける前にどちらを持っているか分かります — 本物の数式のときだけ
True、定数なら False です。これは計算されたセルと打ち込まれたセルを見分ける確実な方法で、
.Value や .Value2 を通して下地の数値を読むことと自然に組み合わさります。
VBA Value vs Value2 vs Text で扱っています。代わりに、セルに数式を一切入れずに
答え を VBA 変数にほしいなら、VBA WorksheetFunction を通して
関数を直接呼び出します — それが「結果を変数に」の道で、.Formula は「セルに生きた数式を」の道です。
ExcelMaster の活用
午後を無駄にする .Formula のバグは、静かなものです。自分のマシンでは動いて同僚のマシンで 1004 に
なるセミコロン、数式をテキストに変えてしまう欠けた =、入れ子の IF の奥で数え間違えた ""、そして
参照が 1 つずれたまま 1,000 行に押し込まれた A1 数式。どれも文字列の細部で、走るまで見えません。
ExcelMaster は、どのマシンでも
正しい数式文字列を書きます。数式を説明すれば — 「左の 2 列を掛け合わせて、表全体を下まで」 — 中立な
US-English の方言で .Formula を、あるいは数式が相対的で生成されるものなら .FormulaR1C1 を、先頭の
= と、内側の引用符をすべて正しく二重にして出力します。あなたが本当に .FormulaLocal を望むときや、
本当は WorksheetFunction を通して答えを変数にほしかったときも、それは分かっています。あなたは計算を
説明するだけ。どこでも走る文字列を書くのは、それがやります。
よくある質問
VBA でセルに数式を設定するには?
= で始まる文字列を Formula プロパティに代入します。Range("D2").Formula = "=B2*C2" です。
US-English の関数名とカンマを使い — ローカライズされた名前やセミコロンではなく =SUM(A1,B1) — すると
Excel が自動的にユーザーの言語で数式を表示します。同じ数式を範囲全体に書くには、その範囲に代入します。
相対的な生成数式には .FormulaR1C1 を使いましょう。
VBA の数式が実行時 error 1004 になるのはなぜ?
最もよくある原因は、ローカライズされた方言で書くことです。.Formula は US-English の関数名とカンマ
区切りを要求するので、=SUMME(A1;B1) は失敗し =SUM(A1,B1) は動きます。ほかの原因は、先頭の = の
欠落、あるいは数式文字列の中の釣り合わない引用符(リテラルの引用符はそれぞれ "" と二重にする)
です。ユーザーの言語と区切り文字で書かなければならないなら、代わりに .FormulaLocal を使いましょう。
.Formula と .FormulaR1C1 の違いは?
どちらも生きた数式を書きますが、参照のスタイルが違います。.Formula は A1 記法(=B2*C2)を使い、
参照はリテラルのセルです。.FormulaR1C1 は R1C1 記法(=RC[-2]*RC[-1])を使い、参照は現在のセル
からのオフセットなので、1 つの文字列が範囲内のすべてのセルで正しくなります。R1C1 は、コードが多数の
行にわたって生成する数式に分かりやすく、マクロ記録が出力するものでもあります。
VBA の .Formula と .FormulaLocal の違いは?
.Formula はつねに US-English の関数名とカンマ区切りを使うので可搬です — 同じ文字列がどのマシンでも
動きます。.FormulaLocal はユーザーの言語とリスト区切りを使うので、=SUMME(A1;B1) はドイツ語の
マシンで動き、英語のマシンでは失敗します。出荷するコードには .Formula を、ユーザー自身の言語で
数式を読み書きする必要が具体的にあるときだけ .FormulaLocal を使いましょう。
VBA でセルの数式を読むには?
Formula プロパティを読みます。s = Range("D2").Formula は、数式セルなら数式文字列("=B2*C2" の
ような)を、定数なら値をテキストとして返します。先に Range("D2").HasFormula を確認しましょう —
セルが実際に数式を含むときだけ True を返すので、文字列に手を付ける前に、計算されたセルと打ち込まれた
セルを見分けられます。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-31。
関連ガイド: VBA Cell Value · VBA Value vs Value2 vs Text · VBA WorksheetFunction · VBA Range · VBA VLOOKUP
