2016-04-06

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

引数が指定されました:ABC
引数が省略されました

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

関連記事

コメントを残す

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