ワークシート上には、様々な関数があります。
そして、これを駆使すると、様々なことが処理できます。
関数は、データの数が決まっている時は抜群の処理能力をもっていますが、
データ数が変わっていったり、セルに書き込んだりしようと思うと、マクロが必要になってきます。
ところが、マクロの関数にワークシートで使っていた関数がないことがあります。
例えば、SUM関数です。
ワークシートではおなじみの関数ですが、マクロにはこの関数がありません。
となると、「合計を出すマクロを組む」ということになりそうですが、
実はワークシート関数を呼び出して使う方法があります。
ワークシート関数を使うには,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を使っています。 |
プロシージャで結果だけが欲しいときは、ワークシート関数を呼び出して使えばいいのですが、
場合によっては、ワークシート関数をワークシートに埋め込みたいときがあります。
ワークシートに関数が埋め込んであることのメリットは、リアルタイムで値が変化することです。
ひな形があって、そこにデータを随時入力していくような場合は、
ワークシートに関数が入っていた方が便利です。
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形式だと、行数が変わるので、変数を使って 組み合わせて設定しなければなりません。 |