VBA入門
セルに計算式を設定(Formula)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2021-08-17

第38回.セルに計算式を設定(Formula)


セルに計算式(関数)を設定する場合のマクロVBAになります。
マクロVBAでセルに計算式を設定することは、そんなに多くないと思いますが、決して使わないわけではありません。
しかし、この計算式の設定には何種類ものプロパティがあり、結構やっかいなのです。


最後の節の「たった1行のVBAで複数のセルに計算式を入れる」
これはVBA処理が遅い時の対処として使う場合があり、とても重要なので是非最後までお読みください。

この回は38回ですが、RangeとCells(8回~11回)の続きとして学習してください。

計算式を設定できるプロパティ

以下は、Rangeオブジェクトのプロパティです。

Value
Formula
FormulaArray … これは配列数式でありVBAで使う事は滅多にありません
FormulaLocal
FormulaR1C1
FormulaR1C1Local

これら全てを覚える必要はありませんが、一応の知識として一通り紹介しておきます。

スピルにより追加されたプロパティもあります。
Formula2
Formula2Local
Formula2R1C1
Formula2R1C1Local

Formulaとの違いはスピルするかどうかの違いです。
Formulaはスピルしません「共通部分の参照」となります。
これに対してFormula2はスピルします。

スピルでVBAの何が変わったか|VBA技術解説
・Rangeオブジェクトに追加されたプロパティ ・セルに数式を設定する場合 ・1次元配列を返すユーザー定義関数 ・2次元配列を返すユーザー定義関数 ・JAG配列を返すユーザー定義関数 ・スピルのVBAでの活用について


Valueプロパティ

これは今まで、文字・数値をセルに入れる場合に使用してきました。
同様に、計算式も入れる事が出来ます。

A1セル = B1セル + C1セル

Range("A1").Value = "=B1+C1"

これは、普通に計算式を指定すれば良いです。
関数を入れる場合でも同じです。
A1セル = B1:B10セルの合計

Range("A1").Value = "=SUM(B1:B10)"


Formulaプロパティ , FormulaLocalプロパティ

これは計算式を設定することに関しては、Valueと同じです。
違いは、計算式の入っているRangeを取得した時になります。

Valueプロパティは、計算結果の値が取得され、
Formulaプロパティは、計算式が取得されます。

FormulaとFormlaLocalの違いについては後述します。


FormulaR1C1プロパティ , FormulaR1C1Localプロパティ

これが解りづらいかもしれません。
Formulaプロパティとの違いは、
計算式をR1C1参照形式で指定するこということです。
R1C1形式の詳細は次で詳しく説明します。

FormulaR1C1とFormlaR1C1Localの違いについては後述します。


R1C1参照形式

セルの相対位置、つまり、計算式を設定しようとしているセルからの移動量を、
行位置をRに続けて記述し、列位置をCに続けて記述します。

R ・・・ Rの後に何も記述しない場合は同一行
C ・・・ Cの後に何も記述しない場合は同一列
R1 ・・・ Rの後に数値のみ記述した場合はその絶対行数
C1 ・・・ Cの後に数値のみ記述した場合はその絶対列数
R[1]・・・ Rに続けて[数値]とした場合は、数値行数分、行位置をずらした行
C[1]・・・ Cに続けて[数値]とした場合は、数値列数分、列位置をずらした列

これらを組み合わせて、計算式を設定するセルからの位置を指定します。
例.C5セルに計算式を設定する場合

RC1 ・・・ A5セル
R1C ・・・ C1セル
R[1]C[2] ・・・ E6セル
RC[-1] ・・・ B5セル

このようになります。


Localが付くプロパティについて

Localと付くものと付かないものの違いは、PC環境に依存するかどうかです。
Localと付くものは、PC環境に依存する設定を有効にする場合に使います。

書式の設定でも、NumberformatLocalを使いますが、これも同じような事です。
書式では、マシンに依存する表示を使う事が多いので、Localを使う事が多くなります。
しかし、計算式ではそんなに多くはありません。
ただし、全くないわけではありません、あるにはあります。

Localが必要な場合
JIS関数を設定するなら、Localを使わないとエラーとなり正しく設定できません。
Range("B1").Formula = "=JIS(A1)"
これは、#NAME?となってしまいます。

JIS関数を入れたセルのFormulaプロパティを取得すると、
"=DBCS(A2)"と入っている事が分かります。
従って、この"=DBCS(A2)"をFormulaプロパティに入れれば正しく設定きます。
しかし、
FormulaLocalプロパティなら、
Range("B1").FormulaLocal = "=JIS(A1)"
これで正しく設定できます。


それぞれの違い(Localは除く)

Range("A1").Value = "=B1+C1"
Range("A2").Formula = "=B1+C1"
Range("A3").FormulaR1C1 = "=B1+C1"
Range("A4").Value = "=RC[1]+RC[2]"
Range("A5").Formula = "=RC[1]+RC[2]"
Range("A6").FormulaR1C1 = "=RC[1]+RC[2]"

上記では、A3セルのみ正しく設定されません。
R1C1の場合は、R1C1参照形式で設定する必要があるので、まあ当然ですね。

上記の例を見る限りでは、Valueだけで良い事になります。
結論から言えば、そういう事になってしまいますが、
マクロを書くときには、可読性を考慮しますので、
R1C1参照形式で設定する場合は、FormulaR1C1を使うようにします


何故、こんなに多くのプロパティが存在しているのか

多くのプロパティが存在して、そして何故紹介する必要があるのかと言うと、
それは計算式を設定する時ではなく、設定された計算式を参照する時に使うからです。

以下の設定をした場合、

Range("A1").Value = "=B1+C1"

これを実行した後に、そのプロパティを参照すると、

Range("A1").Value ・・・ 計算結果の値
Range("A1").Formula ・・・ =B1+C1
Range("A1").FormulaR1C1 ・・・ =RC[1]

このように、取得されるものが違ってきます。

つまり、計算式を設定する場合は、
Value
だけでも良いが、
計算式を参照する場合は、
.Formula
または、
.FormulaR1C1
を使う必要が出てくることがあると言う事になります。
ただし次に紹介するように、R1C1を使う事でVBA記述が楽になる場合もあります。


R1C1形式を使うメリット

R1C1参照形式は、少し面倒に感じるかもしれませんが、
以下のような場合には、便利な指定方法になります。

2行目から10行目まで、B列にA列*100の計算式を設定するとしたとき、
通常の参照形式では、
2行目は、=A2*100
3行目は、=A3*100
というようになり、行ごとに計算式を変更しなければならなくなります。
しかし、R1C1参照形式を使えば、

Sub サンプル1()
  Dim i As Long
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 2).FormulaR1C1 = "=RC[-1]*100"
  Next i
End Sub
For…Nextは繰り返し処理です。
上記では2~10まで繰り返しています。
また、
Cells(Rows.Count, 1).End(xlUp).Row
これは最終行を取得するVBAコードです。
これらについては今後詳しく解説していきます。

R1C1参照形式は、
設定するセルからの、相対参照・絶対参照の組み合わせになっていますので、
設定するセルがどこのセルであろうと、同一の計算式を設定する事が出来ます。


たった1行のVBAで複数のセルに計算式を入れる

マクロVBAの学習を進めていくと、
たった1行のVBAで複数のセルに計算式を入れることもできるようになります。
2行目から最終行までのB列に、A列*100の計算式を設定する場合、

Sub サンプル2()
  Range(Range("B1"), Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value = "=A1*100"
End Sub

このように、1行でも書く事が出来るようになります。
(Offsetについては、後々説明します。)
この「マクロVBA入門」をある程度まで読み進めれば、これをすんなり書けるようになるはずです。
少なくとも、これがすんなり読めて書けるようになるまではここでのVBA学習を続けてみてください。

※1行ずつVBAで処理するより、セル範囲に一括で計算式を入れ、その後に値貼り付けするという手法があります。
これはVBA高速化のとても有効かつ重要な手法になります。




同じテーマ「マクロVBA入門」の記事

第9回.Rangeでのセルの指定方法
第10回.Range以外の指定方法(Cells,Rows,Columns)
第11回.RangeとCellsの使い方
第38回.セルに計算式を設定(Formula)
第12回.変数宣言のDimとデータ型
第13回.定数宣言のConstと型宣言文字
第14回.文字の結合(&アンパサンド)と継続行(_アンダーバー)
第15回.四則演算と注釈(コメント)
第16回.繰り返し処理(For Next)
第17回.繰り返し処理(Do Loop)
第18回.最終行の取得(End,Rows.Count)


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ