ParamArray でユーザー定義関数の引数を可変にします

ParamArray で可変引数を設定します

 Excel関数のなかには、指定引数を 可変指定できる関数 があります。
 たとえばよく使う SUM関数は

=SUM(数値1,[数値2],[数値3],...)

という記述になっていて、最低1つは引数を入れなくてはいけませんけど、あとは好きなだけ入れてもいいし(といっても 255 個が限度)、入れなくてもかまいません。とにかく入れたぶんだけの引数を合計した値を返してきます。

,[数値2],[数値3],...

という部分がいわゆる可変引数で、VBA のユーザー定義関数 (Function Macro) にも同じような機能をもたせることができます。

指定引数を合計する SUMUP関数

 そこで練習のために SUM関数と似たような機能をもつ SUMUP関数 というユーザー定義関数を作ってみますよ(似ているけど、引数を範囲指定するオプションなどはないので、やっぱり SUM関数のほうが高機能です)。ちなみに sumup は「合計する」という意味の英語です。念のため。

 Function SUMUP(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

 SUMUP関数を使うときは、適当なセルに

=SUMUP(数値1,[数値2],[数値3],...)

という形式で入力してくださいな。たとえば

=SUMUP(1,2,3)

と入力すると 1 + 2 + 3 が計算されて 6 が返ります。SUM関数と同じように、最低1つは引数を指定しなくてはいけませんが、残りはユーザーさんが好きなだけ引数を入れることができます。そんなことを可能にしているのは最初の行にある

a As Double, ParamArray x()

という記述の中にある ParamArray というステートメントです (Parameter Array の略) 。これに続く変数は Variant型の配列 として宣言しておかなくてはなりません。型を何も宣言していないと自動的に Variant型となるので、上のコードでは変数名に () を添えて x() という配列にしてあります。ユーザーさんの指定した2番目以降の引数はこの配列に x(0), x(1), x(2), ... と順に格納されていく仕組みになっています。あとは

u = UBound(x)

で配列の要素数の上限を得て、繰り返し処理によって x(0) から x(u) までの値を全て足し合わせて、最後に1つめの引数 a を加えて全体の合計を返します。

Option Base 1 が効かない!?

 一般に配列変数を扱うときには、配列要素のインデックス番号の下限を 1 にするために宣言セクションなどに

Option Base 1

と記述されてる人も多いと思いますが、ParamArray のついた配列変数にはこの宣言がまったく効きません! 他で何をしたってインデックスは必ず 0 番から始まります。これはうっかりしやすいので要注意です。こばともこれまで何度もうっかり間違えましたよ。皆さんは、こばとみたいにバカなミスをしないようにしてくださいね ...... 誰ですかー!? 「うん。こばとちゃんみたいなバカはやらないよ」とか素直に頷いちゃってる人はー!?

ParamArray リストは必ず最後に記述します

 もう1つだけ注意点があります。ParamArray を付けた可変引数は、その他の引数を全て書き終えてから、一番最後に記述するようにしてください。SUMUP関数の例では

a As Double, ParamArray x()

となっていますが、これを

ParamArray x(), a As Double

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

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)