不定の引数を定義するParamArrayキーワード
Excel ワークシート関数のSUM関数やMAX関数は可変の引数を渡すことができます。
VBA のプロシージャでも同じように不定の引数を扱う場合は ParamArrayキーワード を使用します。
今回はこの ParamArrayキーワード の概要を説明します。
ParamArrayキーワードの構文
ParamArrayキーワードは Subプロシージャ、Functionプロシージャ、Propertyプロシージャで使用できます。
構文:{ Sub | Function | Ptoperty } name( ParamArray args() )
指定項目 | 指定 | 内容 |
name | 必須 | 通常のプロシージャと同じようにプロシージャ名を指定します。 |
args | 必須 | Variant型の配列を定義する引数名を指定します。 |
引数配列の下限・上限
ParamArrayで引数を渡した場合、引数配列の下限は0、上限は 要素数-1 となります。モジュールの冒頭でOption Base 1として配列の下限を明示的に1と宣言していても、ParamArrayで渡された引数配列の下限は常に0になるので注意が必要です。
Option Base 1 Sub Test() ParamArraySub "ABC", 2, 3.5, False End Sub Sub ParamArraySub(ParamArray args()) Debug.Print "要素数:" & UBound(args) - LBound(args) + 1 Debug.Print "下限:" & LBound(args) Debug.Print "上限:" & UBound(args) End Sub
上記のコードでTestプロシージャを実行すると、イミディエイトウィンドウには以下のように出力されます。
下限:0
上限:3
具体的には Ubound(array) - Lbound(array) + 1 の式で求められます。
引数を省略した場合
引数を省略した場合、引数配列の下限は0、上限は-1になります。引数が省略されたか判定するにはUbound関数を使用して上限が-1かどうかを評価します。
Sub Test() '引数を省略 ParamArraySub End Sub Sub ParamArraySub(ParamArray args()) If UBound(args) = -1 Then Debug.Print "引数が省略されました" Else Debug.Print "引数が指定されました" End If End Sub
上記のコードでTestプロシージャを実行すると、イミディエイトウィンドウには以下のように出力されます。
いくつまで引数を指定できるの?
ParamArrayで渡すことができる引数は個数による上限はありません。ただし、Excel VBA のヘルプによると動的なローカル変数は32kbまで定義できるとあるので、ParamArrayの引数となるVariant型の配列では32768byte(32kb) / 16byte = 2048個 という計算になります。が、これはあくまで理論値になりますので実際はもう少し小さい個数になるはずです。この容量を超えると「動的なローカル変数が多すぎます。」のエラーが発生します。
ParamArrayキーワードの注意点や制限など
ParamArrayキーワードを使用する上で抑えておきたいポイントです。
型指定ができない
ParamArrayで定義される配列は型の指定ができず、すべてVariant型の配列になります。
配列の下限が常に0
先述のとおり、配列の下限を宣言するOption Baseステートメントは適用されず、ParamArrayで定義された配列の下限は常に0になります。
引数の数と位置
ParamArrayで定義する引数の他に引数を指定する場合、ParamArrayで定義する引数は最後に1つだけ指定可能となります。
以下の例ではarg1とarg2は通常の引数として定義し、Paramarrayで定義されているarg3は最後に1つだけ指定されています。
Sub ParamArraySub(arg1, arg2, ParamArray arg3()) '~ 処理 ~ End Sub
Optionalキーワード
省略可能な引数を定義するOptionalキーワードと同時に使用することはできません。同時にしようとするとコンパイルエラーとなります。
まとめ。
任意の数の引数を渡すことができるParamArrayキーワードはとても便利です。渡せる個数も現実的には無制限に等しいので汎用性も高いです。是非ともマスターしたい機能のひとつですね:)
ご質問等ございましたらお気軽にお問合せくださいまし:)
HAYs
コメントを残す