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 ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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