ユーザー定義関数の引数に配列を渡します
今回は 引数に配列を渡す方法 について解説します。配列を渡して値を受け取ったり、あるいは配列を渡して配列を受け取ったりということを自在に操れるようになると、VBA プログラミングの幅がぐーんと広がります。覚えておいて損はありません。とはいっても、そんなに難しい話ではないのです。要は引数のところに配列変数 a() をぽいっと放り込むだけです。
あ、そうだ。言い忘れるところだったけど、宣言セクションに Option Base 1 と書いてインデックスの下限を 1 に揃えておいてください。引数として受け取る配列のインデックス下限値は自動的に 1 となってしまうからです。
まずは簡単なテストコードを書いてみます。
Option Base 1
Function TestArray(a() As Variant) As Variant
a(1) = a(1) * 2
a(2) = a(2) * 2
a(3) = a(3) * 2
TestArray = a()
End Function
見ての通り、受け取った配列要素をすべて 2 倍にして返す Function プロシージャ(ユーザー定義関数)です。このマクロは「配列を受け取って配列を返す関数」です。この関数をワークシートで呼びだすときは、下の図にあるように横並びのセルを3つ選んだ状態で、引数を配列定数の形で指定して
と入力して、[Ctrl] + [Shift] + [Enter] を押すと値が返ります。
次はこの関数を別のマクロで呼びだしてみます。
Sub CallTestArray()
Dim x As Variant
Dim b(3) As Variant
Dim j As Long
b(1) = 3
b(2) = 5
b(3) = 2
x = TestArray(b())
For j = 1 To 3
Debug.Print x(j);
Next j
End Sub
TestArray の引数に配列要素 b() を渡して、戻ってきた配列をバリアント変数 x に格納して、x(1), x(2), x(3) の値を表示させます。実行してみると
というように、b() の各要素が 2 倍になって戻ってきます。
配列の合計を求めるマクロ
受け取った配列の合計を計算するユーザー定義関数をつくってみましょう。
Function SumArray(a() As Variant) As Variant
Dim k As Long
Dim lb As Long
Dim ub As Long
'インデックス番号の下限値を取得
lb = LBound(a)
'インデックス番号の下限値を取得
ub = UBound(a)
a(1) から a(k) まですべての要素を加えます
For k = lb To ub
SumArray = SumArray + a(k)
Next k
End Function
この関数を呼び出して、10, 20, 30 を加えてみます。
Sub SumTest()
Dim x As Double
Dim a(3) As Variant
a(1) = 1
a(2) = 2
a(3) = 3
x = SumArray(a())
Debug.Print x
End Sub
実行すると「 60 」が戻ります。同じような要領で配列要素の平均値や分散を計算させるマクロをつくることもできます。配列要素を演算させるマクロは大きなデータを扱うための強力なツールになりうるので、ぜひ皆さんも配列を駆使したマクロを色々と試作してみてください。そういうマクロをライブラリとしてまとめておけば、様々な用途で活躍させることができます。