数式を書き込む
「1セルに数式」「複数セルへ一括」「相対参照のズレ対策」「R1C1参照」「変数を混ぜた式」「安全テンプレート」まで、初心者が確実に使える形でまとめます。基本は Range(…).Formula に“文字列として”数式を代入することです。
基本:1セルに数式を書き込む
Sub WriteFormula_Basic()
'合計
Range("E5").Formula = "=SUM(E2:E4)"
'四則演算
Range("A1").Formula = "=B1+C1"
'関数例
Range("F2").Formula = "=AVERAGE(B2:D2)"
End Sub
VB- ポイント:
- 数式は文字列: 先頭に「=」を付けて文字列として代入します。
- A1参照: ふつうの表記(A1、B2:D2 など)が Formula で使えます。
相対参照のズレ対策:FormulaR1C1
Sub WriteFormula_R1C1()
'R1C1参照:ROW/ COLUMN 基準でズレない式
'例:E5セルに E2:E4 の合計(E列の現在行から上に3つ)
Range("E5").FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
'行方向の掛け算:金額 = 数量×単価(C列×D列 → E列)
'E3:E12 全体へ、各行で R C[-2] * R C[-1] を設定
Range("E3:E12").FormulaR1C1 = "=RC[-2]*RC[-1]"
End Sub
VB- ポイント:
- R1C1参照: Rは行、Cは列。RC は自セル、RC[-1] は左隣、R[-1]C は1つ上。
- ズレない式: 範囲に一括適用しても、各セルの相対位置に応じて正しく働きます。
複数セルに一括で数式を書き込む
Sub WriteFormula_ToRange()
'縦方向へ同型の式を一括(E3:E12)
Range("E3:E12").Formula = "=C3*D3" 'A1参照(相対)
'推奨:R1C1でズレ防止
Range("E3:E12").FormulaR1C1 = "=RC[-2]*RC[-1]"
End Sub
VB- ポイント:
- A1参照の注意: 「=C3*D3」を範囲に入れると各セルで参照が固定されがち。行方向にずらしたいなら R1C1 が安全。
変数や文字列を混ぜた数式(動的に組み立て)
Sub WriteFormula_WithVariables()
Dim lastRow As Long, tgt As Range
lastRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の最終行
Set tgt = Range("E3:E" & lastRow)
'動的範囲のSUM(A1参照)
Range("F2").Formula = "=SUM(E3:E" & lastRow & ")"
'動的に式を範囲へ(R1C1参照)
tgt.FormulaR1C1 = "=RC[-2]*RC[-1]"
End Sub
VB- ポイント:
- 文字列連結: 変数で範囲を作り、式文字列を連結して代入します。
- R1C1の楽さ: 位置関係が変わっても式修正が少なく済みます。
数式の結果を確定(値に変換)
Sub ConvertFormulaToValue()
With Range("E3:E12")
.FormulaR1C1 = "=RC[-2]*RC[-1]" '式を入れる
.Value = .Value '結果を値に固定(上書き)
End With
End Sub
VB- ポイント:
- .Value = .Value: 式の計算結果だけを残し、数式を消して固定します。再計算を避けたいときに便利。
シート・ブックを明示して安全に書き込む
Sub WriteFormula_SafeTarget()
With ThisWorkbook.Worksheets("売上")
.Range("E3:E12").FormulaR1C1 = "=RC[-2]*RC[-1]"
.Range("F2").Formula = "=SUM(E3:E12)"
End With
End Sub
VB- ポイント:
- 対象明示: ThisWorkbook/Worksheets を使って誤書き込みを防ぐ。
- ActiveSheet依存は避ける: 選択状態に左右されない安定コードに。
よく使うパターン集
Sub CommonFormulas()
'IF
Range("G3:G12").FormulaR1C1 = "=IF(RC[-2]>=1000,""大型"", ""通常"")"
'VLOOKUP(A1参照:テーブル固定、左端一致)
Range("H3:H12").Formula = "=VLOOKUP(A3,$M$2:$N$100,2,FALSE)"
'TEXTで整形
Range("I3:I12").Formula = "=TEXT(E3,""#,##0"")"
'TODAY/ NOW
Range("J1").Formula = "=TODAY()"
Range("J2").Formula = "=NOW()"
End Sub
VB- ポイント:
- ダブルクォートの扱い: 文字列リテラルは “” でエスケープ。VBAでは “” を二重に書いて式中に ” を表現します。
- 絶対参照: テーブル参照は $ を使って固定。
数式と書式の合わせ技
Sub FormulaWithFormat()
Range("E3:E12").FormulaR1C1 = "=RC[-2]*RC[-1]"
With Range("E3:E12")
.NumberFormatLocal = "#,##0;[赤]-#,##0"
.Font.Bold = True
End With
End Sub
VB- ポイント:
- 見た目調整: 計算式と表示形式は別で設定。仕上がりが安定します。
例題で練習
例題1:売上金額(数量×単価)を計算して合計も出す
Sub Example_CalcAmount()
Dim last As Long
last = Cells(Rows.Count, "B").End(xlUp).Row
Range("E3:E" & last).FormulaR1C1 = "=RC[-2]*RC[-1]"
Range("E2").Formula = "=SUM(E3:E" & last & ")"
End Sub
VB例題2:条件付きラベル(1,000以上なら「大型」)
Sub Example_LabelIF()
Dim last As Long
last = Cells(Rows.Count, "E").End(xlUp).Row
Range("G3:G" & last).FormulaR1C1 = "=IF(RC[-2]>=1000,""大型"",""通常"")"
End Sub
VB例題3:VLOOKUPでコード→名称に変換(表固定)
Sub Example_CodeToName()
Dim last As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
Range("H3:H" & last).Formula = "=VLOOKUP(A3,$M$2:$N$100,2,FALSE)"
End Sub
VB実務の落とし穴と対策
- 相対参照のズレ:
- 対策: 範囲へ一括代入は FormulaR1C1 を優先。A1参照は絶対参照($)や文字列組み立てで補正。
- ダブルクォートで詰まる:
- 対策: VBAの文字列中では “” を書くと式内の ” に相当。IFの文字列などは “”大型”” のように記述。
- 再計算が重い:
- 対策: 必要に応じて .Value = .Value で値固定。大量式は ScreenUpdating=False を併用。
- 対象の取り違え:
- 対策: ThisWorkbook/Worksheets(“名前”) を明示し、ActiveSheet依存を避ける。
- ロケールの違い:
- 対策: 英語関数名を使うのが無難。表示形式は NumberFormatLocal を使うと日本語環境に合わせやすい。
