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