ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

No.004

VBAでワークシート関数を使用する 《Value・Formula・FormulaR1C1》

2003/2007/2010/2013

Excelでセルに関数を使用して結果を求めるのを、どのようにVBAで記述するかです。
VBAでは、ワークシート関数を使うときにさまざまな書き方があります。
ここで1つ、「ワークシート関数」とはExcelで利用している関数のことで、VBAではVBAで利用できるVBA関数というのが別にあるのです。

それでは、例えばセルD1にセルA1:C1の合計を計算する場合です。

VBAで数式を扱うには、Valueプロパティ、Formulaプロパティ、FormulaR1C1プロパティを使用し、基本的な構文は次のようになります。

  Range("D1").Formula = "=SUM(A1:C1)"

実は、Valueプロパティ、Formulaプロパティ、FormulaR1C1プロパティは省略可能ですので書かないことが多いですので、次のようになります。

  Range("D1") = "=SUM(A1:C1)"

なんだか「=」が2度出てきて変な感じかもしれませんが、左辺に結果を求めるセルを指定、右辺はセルに入力する式を文字列として(前後をダブルクォーテーションで囲んで)記述します。
VBAでは、イコール式が出てきた場合「左辺に右辺の値を代入する」という意味になりますので、今回は「左辺セルD1に右辺の数式を表す文字列を代入する」ということです。

さて、少し内容を進めていきましょう。
Valueプロパティ、FormulaプロパティはA1形式で数式の設定/取得、FormulaR1C1プロパティはR1C1形式で数式の設定/取得となります。
A1形式というのは、「C2」などセル参照の普通の書き方のことです。
R1C1形式では、行番号(R)と列番号(C)を指定した書き方で、セルC2の場合は2行目3列目ですので「R2C3」となります。
とすると、先ほどの数式は次のようになります。

  Range("D1").FormulaR1C1 = "=SUM(R1C1:R1C3)"

もちろん「.FormulaR1C1」は省略できます。
R1C1形式では、相対位置でのセル参照ができ、左辺のセルから見て、引数のセルの相対位置を角かっこ([ ])の中に数値で指定します。
先ほどの式では、セルD1から見てセルA1:C1は3つ左のセルから1つ左のセルです。
すると式は次のようにも書くことができます。

  Range("D1") = "=SUM(RC[-1]:RC[-3])"

相対位置は、基準セルから下方向、右方向はプラス値、上方向、左方向はマイナス値となります。今回、左辺のセルと引数のセルの行は同じ行なので、Rの後は書く必要がありません。またはR[0]と指定することも可能です。

そのほか、別のよくあるパターンとして、右辺の関数の引数に文字列を指定する場合です。そのときはなんと、2重ダブルクォーテーションとなります。

  Range("D1") = "=IF(SUM(A1:C1)>10,""A"",""B"")"

では最後に、行番号などに変数をあてがいたいパターンです。
変数を式の文字列の中に組み込むことになりますが、アンパサンド(&)を使用してつなげていくことになります。

先のSUM関数の例で、変数Gyoに行番号である1が代入されているとします。
「1」のところをすべて変数Gyoに置き換え、文字列と変数の間に「&」を入れてつなぎます。

  Dim Gyo As Integer   '変数宣言
  Gyo = 1   '変数Gyoに1を代入
  Cells(Gyo, "D") = "=SUM(A" & Gyo & ":C" & Gyo & ")"

左辺もRangeでなくCells(行番号, 列番号)を使いましょう。

関連ヘルプ

セル、セル範囲を参照する 《Range・Cells・Rows・Columns》
フォントの書式を設定する 《Font》
VBAで出てくる基礎用語について教えて
セルに塗りつぶしの色を設定する 《Interior.Color》
ワークシート関数の答えをセルに出さないで取得する 《WorksheetFunction》
twitter hatena line pocket