第38回.セルに計算式を設定(Formula)
セルに計算式(関数)を設定する場合のマクロVBAになります。
マクロVBAでセルに計算式を設定することは、そんなに多くないと思いますが、決して使わないわけではありません。
しかし、この計算式の設定には何種類ものプロパティがあり、結構やっかいなのです。
これはVBA処理が遅い時の対処として使う場合があり、とても重要なので是非最後までお読みください。
計算式を設定できるプロパティ
Formula
FormulaArray … これは配列数式でありVBAで使う事は滅多にありません
FormulaLocal
FormulaR1C1
FormulaR1C1Local
Formula2Local
Formula2R1C1
Formula2R1C1Local
Formulaはスピルしません「共通部分の参照」となります。
これに対してFormula2はスピルします。
Valueプロパティ
同様に、計算式も入れる事が出来ます。
Range("A1").Value = "=B1+C1"
これは、普通に計算式を指定すれば良いです。
関数を入れる場合でも同じです。
A1セル = B1:B10セルの合計
Range("A1").Value = "=SUM(B1:B10)"
Formulaプロパティ , FormulaLocalプロパティ
違いは、計算式の入っているRangeを取得した時になります。
Formulaプロパティは、計算式が取得されます。
FormulaR1C1プロパティ , FormulaR1C1Localプロパティ
Formulaプロパティとの違いは、
計算式をR1C1参照形式で指定するこということです。
R1C1形式の詳細は次で詳しく説明します。
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を使う事が多くなります。
しかし、計算式ではそんなに多くはありません。
ただし、全くないわけではありません、あるにはあります。
Range("B1").Formula = "=JIS(A1)"
これは、#NAME?となってしまいます。
"=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参照形式で設定する必要があるので、まあ当然ですね。
結論から言えば、そういう事になってしまいますが、
マクロを書くときには、可読性を考慮しますので、
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形式を使うメリット
以下のような場合には、便利な指定方法になります。
通常の参照形式では、
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
上記では2~10まで繰り返しています。
また、
Cells(Rows.Count, 1).End(xlUp).Row
これは最終行を取得するVBAコードです。
これらについては今後詳しく解説していきます。
設定するセルからの、相対参照・絶対参照の組み合わせになっていますので、
設定するセルがどこのセルであろうと、同一の計算式を設定する事が出来ます。
たった1行の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学習を続けてみてください。
これは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 ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。