Formula は「セルに入っている“数式そのもの”を読み書きするプロパティ」
まずイメージから。
Value が「セルの中身(結果の値)」だとしたら、
Formula は「セルに入っている数式そのもの(= から始まる式)」 を扱うプロパティです。
セルに =SUM(A1:A10) と入っているなら、
Formula は "=SUM(A1:A10)" という文字列を返します。
逆に、Formula に "=SUM(A1:A10)" を代入すると、その数式がセルに入ります。
「数式バーに見えているもの」= Formula
「セルに表示されている結果」= Value
と覚えるとスッと入ります。
基本中の基本:Formula で数式を“書く”・“読む”
数式をセルにセットする(書き込む)
Sub SampleFormulaWrite()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1").Formula = "=SUM(B1:B10)"
ws.Range("A2").Formula = "=B2*C2"
End Sub
VBポイントは次の通りです。
数式は必ず = から始める
VBA では文字列なので、 "=SUM(B1:B10)" のようにダブルクォーテーションで囲む
Value に文字列 "=SUM(B1:B10)" を入れても動くが、「数式を扱う」という意味では Formula を使う方が意図が明確
「手でセルに数式を打つ」のを、そのままコードで書いているイメージです。
セルに入っている数式を取得する(読み取る)
Sub SampleFormulaRead()
Dim ws As Worksheet
Dim f As String
Set ws = ThisWorkbook.Worksheets("入力")
f = ws.Range("A1").Formula
MsgBox "A1 の数式は " & f & " です。"
End Sub
VBA1 に =SUM(B1:B10) が入っていれば、
メッセージボックスには =SUM(B1:B10) と表示されます。
ここで大事なのは、
「結果(合計値)が欲しいなら Value」
「式そのものが欲しいなら Formula」
と、目的によって使い分けることです。
Formula と Value の違いを、具体例でハッキリさせる
同じセルでも、見ているものが違う
例えば、A1 に =1+2 と入っているとします。
Dim v, f As String
v = Range("A1").Value ' v = 3
f = Range("A1").Formula ' f = "=1+2"
VBValue は「計算結果の 3」
Formula は「=1+2 という式そのもの」
この違いを、感覚としてしっかり持っておいてください。
数式がないセルの場合
A1 にただの数値 100 が入っている場合:
Range("A1").Value ' 100
Range("A1").Formula ' 100(定数として返る)
VBFormula は「数式がなければ、そのセルの定数を返す」仕様です。
超初心者のうちは、「数式が入っていれば式、そうでなければ値が返る」くらいの理解でOKです。
複数セルに一気に数式を入れる
同じ数式をまとめて入れる
Sub SampleFormulaMulti()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("C2:C10").Formula = "=A2+B2"
End Sub
VBこの書き方は、「C2 には =A2+B2 が入り、C3 には =A3+B3 …」というふうに、
行番号が自動的に調整されます(通常のオートフィルと同じ感覚)。
「1セルに入れた数式を下にコピーする」のを、1行でやっているイメージです。
行番号を自分で組み立てたいとき(少し先の話)
行番号や列を変数で組み立てたいときは、文字列連結で式を作ります。
Sub SampleFormulaDynamic()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("入力")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
ws.Range("C2").Formula = "=SUM(A2:A" & lastRow & ")"
End Sub
VBここでは、"=SUM(A2:A" & lastRow & ")" という文字列を作ってから Formula に入れています。
「数式もただの文字列」として扱える、という感覚が持てると、
かなり自由度が上がります。
Formula と FormulaR1C1 の違いをざっくり知っておく
A1 形式と R1C1 形式
Formula は、普段の Excel と同じ「A1 形式」で書きます。
Range("A2").Formula = "=B2+C2"
VB一方、FormulaR1C1 は「R1C1 形式」で書きます。
Range("A2").FormulaR1C1 = "=RC[1]+RC[2]"
VBここでの意味は、
RC[1] → 「今のセルと同じ行の、1 列右」
RC[2] → 「今のセルと同じ行の、2 列右」
つまり、どちらも「A2 = B2 + C2」と同じ意味です。
超初心者の段階では、
「まずは Formula(A1 形式)だけで十分」
「R1C1 は“相対参照の式を組み立てたいときに便利”くらいの理解で OK」
と割り切ってしまって大丈夫です。
Formula を使うときに意識してほしい重要ポイント
「数式バーに見えているものを、そのまま文字列で書く」
Formula に代入するときは、
「自分が手でセルに打つ数式」を、そのまま "..." で囲んで書きます。
=SUM(B1:B10) と打つなら、"=SUM(B1:B10)" を Formula に渡す、というだけです。
難しく考えず、
セルに手で打つ式
↓
それをダブルクォーテーションで囲んで Formula に代入
という流れをイメージしてください。
「結果が欲しいのか」「式そのものが欲しいのか」を毎回意識する
セルから何かを取り出すとき、
無意識に Value を使いがちですが、
「式そのものを見たいのか」「計算結果を見たいのか」で使い分けます。
結果が欲しい → .Value
式そのものが欲しい → .Formula
ここを意識して書けるようになると、
「なんで 3 じゃなくて =1+2 が入ってるんだ?」みたいな混乱が減ります。
まとめ:Formula は「セルの数式をコードから操るための窓」
Formula の本質は、
「セルに入っている数式そのもの(= から始まる式)を、文字列として読み書きするプロパティ」
です。
押さえておきたいポイントをコンパクトにまとめると、
Formula は「数式バーに見えているもの」、Value は「計算結果」Range("A1").Formula = "=SUM(B1:B10)" のように、手で打つ式をそのまま文字列で渡す
複数セルに一気に数式を入れることもでき、行番号は自動調整される
結果が欲しいときは Value、式そのものが欲しいときは Formula を使い分ける
