不定の引数を定義するParamArrayキーワード

berry

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プロシージャを実行すると、イミディエイトウィンドウには以下のように出力されます。

要素数:4
下限:0
上限:3
配列の要素数は 上限 – 下限 + 1 で求めることができます。
具体的には Ubound(array) – Lbound(array) + 1 の式で求められます。
Option BaseステートメントはParamArrayの他にもArray関数で作成したVariant型の配列の下限にも影響を与えません。ParamArrayと同様に、Option Base 1が指定されていてもArray関数で作成した配列の下限は常に0になります。

引数を省略した場合

引数を省略した場合、引数配列の下限は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個 という計算になります。が、これはあくまで理論値になりますので実際はもう少し小さい個数になるはずです。この容量を超えると「動的なローカル変数が多すぎます。」のエラーが発生します。

Variant型の変数は16バイトのメモリ容量を使用します。

ParamArrayキーワードの注意点や制限など

ParamArrayキーワードを使用する上で抑えておきたいポイントです。

型指定ができない

ParamArrayで定義される配列は型の指定ができず、すべてVariant型の配列になります。

配列の下限が常に0

先述のとおり、配列の下限を宣言するOption Baseステートメントは適用されず、ParamArrayで定義された配列の下限は常に0になります。

引数の数と位置

ParamArrayで定義する引数の他に引数を指定する場合、ParamArrayで定義する引数は最後に1つだけ指定可能となります。
以下の例ではarg1arg2は通常の引数として定義し、Paramarrayで定義されているarg3は最後に1つだけ指定されています。

Sub ParamArraySub(arg1, arg2, ParamArray arg3())
    '~ 処理 ~
End Sub

Optionalキーワード

省略可能な引数を定義するOptionalキーワードと同時に使用することはできません。同時にしようとするとコンパイルエラーとなります。

Optionalキーワードの詳細は以下の記事を参照してください。
省略可能な引数を定義するOptionalキーワード

まとめ。

任意の数の引数を渡すことができるParamArrayキーワードはとても便利です。渡せる個数も現実的には無制限に等しいので汎用性も高いです。是非ともマスターしたい機能のひとつですね:)

ご質問等ございましたらお気軽にお問合せくださいまし:)

HAYs