VBA

不定の引数を定義する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になるので注意が必要です。

上記のコードで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かどうかを評価します。

上記のコードで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つだけ指定されています。

Optionalキーワード

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

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

まとめ。

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

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

HAYs

-VBA
-, ,


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

StringBuilder For Excel VBA

Excel VBAでStringBuilderを使う

 VB.NET には StringBuilder というクラスが実装されています。このクラスは文字列連結に特化しており、ループ内での文字列連結など処理中に文字列の連結が何度も出現する場合にその力を発揮 …

VBA配列基礎

通常の変数は1つの変数に1つの値しか格納できませんが、配列を利用すれば一つの変数に同じデータ型の複数の値を格納することができます。このエントリーでは、VBAで配列を利用するための基本事項をご紹介致しま …

Alphabet blocks

Mid関数とMidステートメント

Excel VBA のヘルプで「Mid」と検索すると、Midキーワードは「Mid関数」と「Midステートメント」の2つの構文で使用される旨の説明が表示されます。今回はこの「Mid関数」と「Midステー …

options

省略可能な引数を定義するOptionalキーワード

Excel VBA で省略可能な引数を持つプロシージャを作成するにはOptionalキーワードを使用します。このエントリーではOptionalキーワードの概要を説明します。 Optionalキーワード …

【Excel VBA】ブックが閉じられた事を検出する方法

先日ちょっとしたツールを作っている時に他のブックが閉じられた事を検出したい場面に遭遇したのですが、WorkbookオブジェクトにもApplicationオブジェクトにも既定のイベントにはそれっぽいのは …