LWP | VBAで数式を入れる―保存・参照・展開の違い
VBAで数式を入れる―保存・参照・展開の違い
シャケモンとアユさんが、四行の明細を使い、数式を入れる場所と結果の変わり方を確かめます。
ストーリー
四行の金額を計算する表を作っていたシャケモン。「200が出れば同じ」と見えたセルでも、数量を変更すると結果が分かれました。アユさんと、セルに残るもの、参照の書き方、数式の個数を順に整理します。
対象はWindowsデスクトップ版Excelの通常のセル範囲です。スピルの例では、動的配列に対応したExcelを使います。B列が数量、C列が単価、一行が一件の明細です。末尾の見本マクロで、図と同じ四行を新しいブックへ作れます。
1 値200と数式は、残るものが違う

図1|値と数式は表示が同じでも、元の数量を変更したあとの振る舞いが違います。
提出時点の金額を固定したいなら値、数量や単価の変更に追従させたいなら数式を残します。先に「どの時点の何を残すか」を決めると、プロパティを選ぶ理由が明確になります。
VBAでは数式を文字列として渡しますが、Formulaへ渡した文字列はExcelが数式として扱います。数式を設定することと再計算のタイミングは別です。手動計算の環境では、式が入ったことだけで結果の更新まで完了したと判断しません。Range.Formula、Range.Value2
2 A1とR1C1で、同じ参照を書く

図2|R1C1では、対象セルからの行・列の差を数式に直接書けます。
R1C1の角括弧は相対的な距離、括弧のない数字は固定した行・列を表します。D列から数量B列を見るなら2列左、E列から同じB列を見るなら3列左です。式を置く列を変更するときは、相対位置も見直します。
画面がA1形式で表示されていても、FormulaR1C1へはR1C1形式で渡せます。画面の表示設定を変えることと、VBAが受け取る数式の記法を選ぶことを分けて考えましょう。Range.FormulaR1C1
3 一括設定では、各セルに式が入る

図3|同じ計算結果でも、指定した式を入れる操作と、先頭行の内容・書式をコピーする操作は区別します。
D2:D5のような連続範囲へ一つのA1形式の式を設定すると、この例では行ごとに参照が変わります。確認するときはD2だけでなく、D3や最後のD5に保存された式も見ます。結果だけを見ると、参照先の誤りを見落とす場合があります。
FillDownは先頭行の内容と書式をコピーします。下の行に異なる表示形式を残したい場合は、式の設定と書式の統一を別々に考えます。ここで示す結果を、非連続の選択範囲や条件付き書式のFormula1まで一般化しません。Range.FillDown
4 行ごとに違う式は、数式配列で渡す

図4|配列の一要素と一セルを対応させ、各要素へ必要な式を明示します。
同じ規則を全行へ適用できるなら一括設定で済みます。送料の加算や値引きなどで行ごとに異なる式が必要な場合は、出力範囲と同じ形の配列へ式を用意できます。図では説明のため、三行目に50を加算し、四行目に10%の値引きを入れています。
配列の第一要素がD2、第二要素がD3に対応します。数式中のB3やC3も自分で指定するため、配列の順番と参照先の行がそろっているかを確認します。これは数式の配列を各セルへ渡す方法で、起点一つから結果を出すスピルとは仕組みが違います。
5 四個の数式と、一個のスピル数式

図5|スピルでは、編集する起点セルと、結果が表示される範囲を区別します。
Formula2は配列として評価する入口です。式の結果が複数ならスピルし得ますが、結果が一つなら一セルです。複数の結果を作りたいからといって、同じ式をスピル先の各セルへコピーする必要はありません。FormulaとFormula2
この例ではF2:F5を空け、F2だけへ式を入れます。F3に値があれば、結果を置けずスピルエラーになります。図のような通常範囲から試し、展開先の既存値、結合セル、Excelテーブル内かどうかを確認します。長い表へ置き換える際は、二つの入力範囲の行数もそろえます。動的配列とスピルの動作
6 計算を確かめてから、結果を値にする

図6|値化は計算結果の固定です。数式を保存する場所も、値化の前に決めます。
同じ範囲へValue2を代入すると、保存されていた数式は結果の値に置き換わります。後から数量が変わっても、そのセルは追従しません。見本マクロでは比較しやすいよう、D列の式を残し、G列へ固定値を作ります。
Range.Calculateは指定範囲を計算するための操作です。外部データの取得完了まで保証するものではありません。実務では対象ブック・シート・範囲を明示し、入力側の更新が済んでいるかを確認してから、結果を固定します。Range.Calculate
まとめ
最初に、セルへ固定値を残すのか、更新する数式を残すのかを決めます。次に、A1とR1C1のどちらで参照を書くか、各セルへ式を置くのか、起点一つから結果を出すのかを選びます。確認する対象は「保存された式」「参照先」「結果」の三つです。
自分の表へ応用するときは、下の見本のB列・C列を入力列へ、D列以降を出力列へ置き換えます。R1C1の列の差、配列と出力範囲の大きさ、スピル先の空き、値化してよい範囲を順に確かめましょう。
コピーして比べる見本
サンプルコード 四行の入力から五通りの結果を作る
01 |
|
|---|---|
02 |
|
03 |
|
04 |
|
05 |
|
06 |
|
07 |
|
08 |
|
09 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
コードの説明
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 山中 一弘
本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。
