Excel VBA 逆引き集 | 数式を書き込む

Excel VBA
スポンサーリンク

数式を書き込む

「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 を使うと日本語環境に合わせやすい。
タイトルとURLをコピーしました