ワークシート関数を使おう。

ワークシート上には、様々な関数があります。
そして、これを駆使すると、様々なことが処理できます。
関数は、データの数が決まっている時は抜群の処理能力をもっていますが、
データ数が変わっていったり、セルに書き込んだりしようと思うと、マクロが必要になってきます。

ところが、マクロの関数にワークシートで使っていた関数がないことがあります。
例えば、SUM関数です。
ワークシートではおなじみの関数ですが、マクロにはこの関数がありません。
となると、「合計を出すマクロを組む」ということになりそうですが、
実はワークシート関数を呼び出して使う方法があります。

1.ワークシート関数を呼び出す

ワークシート関数を使うには,Applicationオブジェクトを使います。
次のプロシージャは、範囲にデータがいくつあるか調べています。

上の段はマクロだけで記述したものです。
それに対して、下の段は、ワークシート関数を使ってすっきりと記述しています。

Sub test()

  Dim R As Integer
  Dim C As Integer
  Dim 個数 As Integer

  For R = 1 To 5
    For C = 1 To 5
      If Cells(R, C) <> "" Then 個数 = 個数 + 1 ←@
    Next C
  Next R

  MsgBox 個数

End Sub
 
@ セルが空じゃなければ、
  個数という変数に1ずつ足していきます。 
Sub test()

  Dim 個数 As Integer

  個数 = Application.WorksheetFunction.CountA(Range(Cells(1, 1), Cells(5, 5))) ←A

  MsgBox 個数

End Sub
 
A ワークシート関数CountAを使っています。

   ただし、マクロ内なので、範囲の設定は
   Rangeを使っています。

2.ワークシートに関数を埋め込む。

プロシージャで結果だけが欲しいときは、ワークシート関数を呼び出して使えばいいのですが、
場合によっては、ワークシート関数をワークシートに埋め込みたいときがあります。
ワークシートに関数が埋め込んであることのメリットは、リアルタイムで値が変化することです。
ひな形があって、そこにデータを随時入力していくような場合は、
ワークシートに関数が入っていた方が便利です。

Sub test()

  Dim R As Integer
  Dim rr As Integer
  Dim cc As Integer

  rr = Cells(2, 1).End(xlDown).Row ←@
  cc = Cells(1, 2).End(xlToRight).Column ←A

  For R = 2 To rr
    Cells(R, cc + 1).FormulaR1C1 = "=sum(rc2:rc[-1])" ←B
  Next R

End Sub
 
@ 名前が何行まであるか調べます。
A 項目が何列まであるか調べます。
   (右端にある合計という項目まで)

B SUM関数を入力します。
  RC2 → その行の2列目のセル
  RC[−1] → その行の1つ前の列のセル

  RCと書いた場合は、指定したセルになります。


 R1C1形式のメリットは、このようなSUM関数で、
 全部同じ記述でいいことです。
 これがA1形式だと、行数が変わるので、変数を使って
 組み合わせて設定しなければなりません。