【VBA】ParamArray
Excel関数の中には指定引数が可変長となっている関数があります。たとえば、経理などでよく使う SUM関数は
=SUM(数値1,[数値2],[数値3],...)
という記述になっていて、最低1つは引数を入れなくてはいけませんけど、あとは好きなだけ入れてもいいし(といっても 255 個が限度)、入れなくてもかまいません。とにかく入れたぶんだけの引数を合計した値を返してきます。
,[数値2],[数値3],...
という部分がいわゆる可変引数で、VBA のユーザー定義関数(Function Macro)にも同じような機能をもたせることができます。
練習のために、SUM関数と似たような機能をもつ SUM_UP() というユーザー定義関数を作ってみます(似ているけど、引数を範囲指定するオプションなどはないので、やっぱり SUM関数のほうが高機能です)。ちなみに sum up は「合計する」という意味の英語です。念のため。
'[VBA] ParamArrayで可変引数を受け取る関数を設計します Function SUM_UP(a As Double, ParamArray x()) As Double Dim i As Integer Dim s As Double u = UBound(x) For i = 0 To u s = s + x(i) Next i SUMUP = a + s End Function
SUM_UP() を使うときは、適当なセルに
=SUMUP(数値1,[数値2],[数値3],...)
という形式で入力してくださいな。たとえば
=SUMUP(1,2,3)
と入力すると 1+2+3 が計算されて「6」が返ります。SUM関数と同じように、最低1つは引数を指定しなくてはいけませんが、残りはユーザーさんが好きなだけ引数を入れることができます。そんなことを可能にしているのは最初の行にある
a As Double, ParamArray x()
の中にある ParamArray というステートメントです。これに続く変数は Variant 型配列として宣言しておかなくてはなりません。型を何も宣言していないと自動的に Variant 型となるので、上のコードでは変数名に () を添えて x() という配列にしてあります。ユーザーさんの指定した2番目以降の引数はこの配列に x(0), x(1), x(2), … と順に格納されていく仕組みになっています。あとは
u = UBound(x)
で配列の要素数の上限を得て、繰り返し処理によって x(0) から x(u) までの値を全て足し合わせて、最後に1つめの引数 a を加えて全体の合計を返します。
一般に配列変数を扱うときには、配列要素のインデックス番号の下限を 1 にするために宣言セクションなどに
Option Base 1
と記述されてる人も多いと思いますが、ParamArray のついた配列変数にはこの宣言がまったく効きません! 他で何をしたってインデックスは必ず 0 番から始まります。これはうっかりしやすいので要注意です。こばともこれまで何度もうっかり間違えましたよ。
もう1つだけ注意点があります。ParamArray を付けた可変引数は、その他の引数を全て書き終えてから、一番最後に記述するようにしてください。SUMUP関数の例では
a As Double, ParamArray x()
となっていますが、これを
ParamArray x(), a As Double
と逆に書いたりすると、実行するまでもなくコードの部分が真赤になって「ちがうよ」と教えてくれます。
コメント