VBAで数式を入れる―保存・参照・展開の違い

LWP | VBAで数式を入れる―保存・参照・展開の違い

VBAで数式を入れる―保存・参照・展開の違い

シャケモンとアユさんが、四行の明細を使い、数式を入れる場所と結果の変わり方を確かめます。

ストーリー

四行の金額を計算する表を作っていたシャケモン。「200が出れば同じ」と見えたセルでも、数量を変更すると結果が分かれました。アユさんと、セルに残るもの、参照の書き方、数式の個数を順に整理します。

対象はWindowsデスクトップ版Excelの通常のセル範囲です。スピルの例では、動的配列に対応したExcelを使います。B列が数量、C列が単価、一行が一件の明細です。末尾の見本マクロで、図と同じ四行を新しいブックへ作れます。

1 値200と数式は、残るものが違う

数量2・3・4・5と単価100・200・300・400から金額200・600・1200・2000を求め、固定値と数式の保存内容および数量変更後の違いを比較する

図1|値と数式は表示が同じでも、元の数量を変更したあとの振る舞いが違います。

提出時点の金額を固定したいなら値、数量や単価の変更に追従させたいなら数式を残します。先に「どの時点の何を残すか」を決めると、プロパティを選ぶ理由が明確になります。

VBAでは数式を文字列として渡しますが、Formulaへ渡した文字列はExcelが数式として扱います。数式を設定することと再計算のタイミングは別です。手動計算の環境では、式が入ったことだけで結果の更新まで完了したと判断しません。Range.Formula、Range.Value2

2 A1とR1C1で、同じ参照を書く

D3からB3とC3への参照をA1形式とR1C1形式で対応付け、相対参照・絶対参照・複合参照の固定軸を比較する

図2|R1C1では、対象セルからの行・列の差を数式に直接書けます。

R1C1の角括弧は相対的な距離、括弧のない数字は固定した行・列を表します。D列から数量B列を見るなら2列左、E列から同じB列を見るなら3列左です。式を置く列を変更するときは、相対位置も見直します。

画面がA1形式で表示されていても、FormulaR1C1へはR1C1形式で渡せます。画面の表示設定を変えることと、VBAが受け取る数式の記法を選ぶことを分けて考えましょう。Range.FormulaR1C1

3 一括設定では、各セルに式が入る

D2:D5へ数式を一括設定し各行の参照と結果を確認する方法を、R1C1での指定と先頭行をコピーするFillDownと比較する

図3|同じ計算結果でも、指定した式を入れる操作と、先頭行の内容・書式をコピーする操作は区別します。

D2:D5のような連続範囲へ一つのA1形式の式を設定すると、この例では行ごとに参照が変わります。確認するときはD2だけでなく、D3や最後のD5に保存された式も見ます。結果だけを見ると、参照先の誤りを見落とす場合があります。

FillDownは先頭行の内容と書式をコピーします。下の行に異なる表示形式を残したい場合は、式の設定と書式の統一を別々に考えます。ここで示す結果を、非連続の選択範囲や条件付き書式のFormula1まで一般化しません。Range.FillDown

4 行ごとに違う式は、数式配列で渡す

四行一列の数式配列をD2:D5へ対応付け、通常計算200、50加算650、10パーセント値引き1080、通常計算2000を比較する

図4|配列の一要素と一セルを対応させ、各要素へ必要な式を明示します。

同じ規則を全行へ適用できるなら一括設定で済みます。送料の加算や値引きなどで行ごとに異なる式が必要な場合は、出力範囲と同じ形の配列へ式を用意できます。図では説明のため、三行目に50を加算し、四行目に10%の値引きを入れています。

配列の第一要素がD2、第二要素がD3に対応します。数式中のB3やC3も自分で指定するため、配列の順番と参照先の行がそろっているかを確認します。これは数式の配列を各セルへ渡す方法で、起点一つから結果を出すスピルとは仕組みが違います。

5 四個の数式と、一個のスピル数式

D2:D5に四個の独立した数式がある状態と、F2のFormula2からF2:F5へ四個の結果がスピルする状態を比較する

図5|スピルでは、編集する起点セルと、結果が表示される範囲を区別します。

Formula2は配列として評価する入口です。式の結果が複数ならスピルし得ますが、結果が一つなら一セルです。複数の結果を作りたいからといって、同じ式をスピル先の各セルへコピーする必要はありません。FormulaとFormula2

この例ではF2:F5を空け、F2だけへ式を入れます。F3に値があれば、結果を置けずスピルエラーになります。図のような通常範囲から試し、展開先の既存値、結合セル、Excelテーブル内かどうかを確認します。長い表へ置き換える際は、二つの入力範囲の行数もそろえます。動的配列とスピルの動作

6 計算を確かめてから、結果を値にする

D2:D5へ数式を設定し再計算してからValue2で値へ置き換え、数式が残らないことと用途別のプロパティを確認する

図6|値化は計算結果の固定です。数式を保存する場所も、値化の前に決めます。

同じ範囲へValue2を代入すると、保存されていた数式は結果の値に置き換わります。後から数量が変わっても、そのセルは追従しません。見本マクロでは比較しやすいよう、D列の式を残し、G列へ固定値を作ります。

Range.Calculateは指定範囲を計算するための操作です。外部データの取得完了まで保証するものではありません。実務では対象ブック・シート・範囲を明示し、入力側の更新が済んでいるかを確認してから、結果を固定します。Range.Calculate

まとめ

最初に、セルへ固定値を残すのか、更新する数式を残すのかを決めます。次に、A1とR1C1のどちらで参照を書くか、各セルへ式を置くのか、起点一つから結果を出すのかを選びます。確認する対象は「保存された式」「参照先」「結果」の三つです。

自分の表へ応用するときは、下の見本のB列・C列を入力列へ、D列以降を出力列へ置き換えます。R1C1の列の差、配列と出力範囲の大きさ、スピル先の空き、値化してよい範囲を順に確かめましょう。

コピーして比べる見本

サンプルコード 四行の入力から五通りの結果を作る

01

Option Explicit

02

03

Public Sub 数式を比べる_見本()

04

    Dim 見本 As Workbook

05

    Dim 表 As Worksheet

06

    Dim 行 As Long

07

    Dim 式一覧(1 To 4, 1 To 1) As Variant

08

09

    Rem ## 元のブックとは別に、四行の見本を作る

10

    Set 見本 = Workbooks.Add(xlWBATWorksheet)

11

    Set 表 = 見本.Worksheets(1)

12

    表.Name = "数式見本"

13

14

    With 表

15

        .Range("B1:H1").Value2 = Array( _

16

            "数量", "単価", "A1一括", "R1C1一括", _

17

            "スピル", "値で固定", "行別の式")

18

        For 行 = 2 To 5

19

            .Cells(行, 2).Value2 = 行

20

            .Cells(行, 3).Value2 = (行 - 1) * 100

21

        Next 行

22

23

        Rem ## 同じ入力を、異なる入口へ渡す

24

        .Range("D2:D5").Formula = "=B2*C2"

25

        .Range("E2:E5").FormulaR1C1 = "=RC[-3]*RC[-2]"

26

        .Range("F2").Formula2 = "=B2:B5*C2:C5"

27

28

        式一覧(1, 1) = "=B2*C2"

29

        式一覧(2, 1) = "=B3*C3+50"

30

        式一覧(3, 1) = "=B4*C4*0.9"

31

        式一覧(4, 1) = "=B5*C5"

32

        .Range("H2:H5").Formula = 式一覧

33

34

        Rem ## 計算後、比較用の固定値を別列へ残す

35

        .Range("D2:H5").Calculate

36

        .Range("G2:G5").Value2 = .Range("D2:D5").Value2

37

        .Columns("B:H").AutoFit

38

    End With

39

End Sub

コードの説明

Workbooks.Addで見本専用のブックを作り、数量と単価を入力します。D列はA1形式、E列はR1C1形式で同じ四行を計算し、F列はF2だけへ配列数式を置きます。G列にはD列の計算結果を値として保存し、H列には行ごとに異なる数式を渡します。

E列からB列は3列左、C列は2列左なので、図2・3のD列基準とはR1C1の指定が異なります。比較用に出力列を増やしたことに合わせて、参照する位置も調整しています。

入力・概要

動的配列対応のWindowsデスクトップ版Excelで、VBEの標準モジュールへ貼り付け、「数式を比べる_見本」を実行します。別の新規ブックに結果が作られます。元の業務表への貼り付けは不要です。作成されたブックは自動保存しません。

結果

D・E・F・G列は、上から200、600、1200、2000になります。同じ値でも、D・E列は各セルの式、F列はF2からのスピル、G列は固定値です。

H列は、行ごとに用意した式に対応します。

  • H2:2×100=200。

  • H3:3×200+50=650。

  • H4:4×300×0.9=1080。

  • H5:5×400=2000。

読むポイント

B2を2から3へ変更して再計算すると、D2・E2・F2は300へ変わり、値で保存したG2は200のままです。F3はスピルの結果なので、そのセルだけ別の式に変える操作はできません。D3・E3・H3には、それぞれ独立した式があります。数式バーと表示結果を見比べて確認できます。

出典メモ

元資料:「VBAでセルに数式を設定する基本」。プロパティごとの動作は、次のMicrosoft公式資料を参照しています。

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。