VBA

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

投稿日:2016.04.06 更新日:

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関数の使用例です。

OptionalTestプロシージャを実行するとイミディエイトウィンドウには以下のように出力されます。

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

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

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

Optionalキーワードを指定した以降はすべてOptionalキーワードを指定する

Optionalキーワードを指定して引数を省略可能にした場合、その引数以降に定義する引数はすべてOptionalキーワードを指定して宣言しなければなりません。

以下の例では引数arg2でOptionalキーワードが指定されているためarg3にもOptionalキーワードを指定しています。もしarg3にOptionalキーワードを指定しないとコンパイルエラーになります。

ただし、Property Let|Set プロシージャで複数の引数を指定する場合は例外的にこのルールは適用されません。Property Let|Setプロシージャは引数を複数指定した場合最後の引数がValueとして評価されるため以下のような構文となります。

ParamArrayキーワードと同時に指定できない

不定の引数を受け取るParamArrayキーワードと同時に指定することはできません。同時に指定しようとするとコンパイルエラーとなります。

オブジェクト型の引数を省略可能にした場合の初期値

オブジェクト型の引数を省略可能にした場合の初期値は、Nothingのみ指定可能です。つまり、何も指定していない場合と変わらないため、実質的にはオブジェクト型の引数には初期値を指定することができないことになります。

まとめ。

引数を省略可能にすることでコーディングの冗長性を無くし保守性の向上が期待できます。省略した場合の初期値などもうまく使って機能的でスマートなコーディングを心掛けたいですね:)

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

HAYs

-VBA
-, , ,


comment

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

関連記事

Alphabet blocks

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

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

Excel VBA 高速化アプローチ【プロパティ編】

Excel VBA を高速化する方法をまとめてみました。今回は「プロパティ編」です。 このエントリーで記載しているサンプルコードは説明のためにあえて冗長にしてる部分もあります。ご自分のマクロに適した形 …

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

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

VBA配列基礎

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

StringBuilder For Excel VBA

Excel VBAでStringBuilderを使う

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