省略可能な引数を定義するOptionalキーワード
Excel VBA で省略可能な引数を持つプロシージャを作成するにはOptionalキーワードを使用します。このエントリーではOptionalキーワードの概要を説明します。
Optionalキーワードの構文
Optionalキーワードは Subプロシージャ、Functionプロシージャ、Propertyプロシージャで使用できます。
構文:{Sub | Function | Ptoperty } name( Optional varname [As type] [= defaultvalue] )
指定項目 | 指定 | 内容 |
name | 必須 | 通常のプロシージャと同じようにプロシージャ名を指定します。 |
varname | 必須 | 通常の引数と同じように引数の名前を指定します。 |
type | 省略可 | 通常の引数と同じようにデータ型を指定します。 |
defaultvalue | 省略可 | Optionalキーワードで指定した引数には、引数が省略された場合の初期値として任意の定数(または定数式)を設定することができます。 |
引数が省略されたかどうか判定する
Optionalキーワードで指定された引数が省略されたかどうか判定するには IsMissing関数 を使用します。IsMissing関数は引数が省略された場合にTrueを返します。ただし、この場合はデータ型を省略しVariant型の変数としないとIsMissing関数は無効となり、すべてFalseを返します。これはVariant型以外のデータ型は引数が指定されたかどうかを判断するフラグを提供できないためです。
以下のコードは引数が省略されたかどうか判定するIsMissing関数の使用例です。
Sub OptionalTest() '1回目の呼び出しは引数を指定 OptionalSub "ABC" '2回目の呼び出しは引数を省略 OptionalSub End Sub Sub OptionalSub(Optional arg) If IsMissing(arg) Then Debug.Print "引数が省略されました" Else Debug.Print "引数が指定されました:" & arg End If End Sub
OptionalTestプロシージャを実行するとイミディエイトウィンドウには以下のように出力されます。
引数が省略されました
Optionalキーワードの注意点や制限など
Optionalキーワードを使用する上で抑えておきたいポイントです。
Optionalキーワードを指定した以降はすべてOptionalキーワードを指定する
Optionalキーワードを指定して引数を省略可能にした場合、その引数以降に定義する引数はすべてOptionalキーワードを指定して宣言しなければなりません。
以下の例では引数arg2でOptionalキーワードが指定されているためarg3にもOptionalキーワードを指定しています。もしarg3にOptionalキーワードを指定しないとコンパイルエラーになります。
Sub OptionalSub(arg1, Optional arg2, Optional arg3) '~ 処理 ~ End Sub
ただし、Property Let|Set プロシージャで複数の引数を指定する場合は例外的にこのルールは適用されません。Property Let|Setプロシージャは引数を複数指定した場合最後の引数がValueとして評価されるため以下のような構文となります。
Property Let Clips(Optional index, NewValue) '~ 処理 ~ End Property
ParamArrayキーワードと同時に指定できない
不定の引数を受け取るParamArrayキーワードと同時に指定することはできません。同時に指定しようとするとコンパイルエラーとなります。
オブジェクト型の引数を省略可能にした場合の初期値
オブジェクト型の引数を省略可能にした場合の初期値は、Nothingのみ指定可能です。つまり、何も指定していない場合と変わらないため、実質的にはオブジェクト型の引数には初期値を指定することができないことになります。
まとめ。
引数を省略可能にすることでコーディングの冗長性を無くし保守性の向上が期待できます。省略した場合の初期値などもうまく使って機能的でスマートなコーディングを心掛けたいですね:)
ご質問等ございましたらお気軽にお問い合わせくださいまし:)
HAYs
コメントを残す