『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】ParamArrayで可変長引数を設定します

【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

と逆に書いたりすると、実行するまでもなくコードの部分が真赤になって「ちがうよ」と教えてくれます。

コメント