変更を最小限に押さえて、プロシージャを変更したい事ってありますよね?
そういう場合は、省略可能な引き数を使用すると良いかもしれません。
何が良いかと言うと、そのプロシージャを呼んでいた今迄の部分は一切変更せずに、そのプロシージャと新しく呼び出そうとしている部分にだけ手を加えれば良いのです。
例えば、以下のようなマクロがあるとします(思いきり単純にしています)。
Sub Macro1() proc1 End Sub Sub proc1() MsgBox "これは前のまま" End Sub
さて、ここでproc1()を呼び出すMacro2()を作成する事になったとします。
但し、今迄のようにメッセージがすべて固定ではなく、"これは"の後の文字を任意にしたいとします。
ところが、今迄proc1()を呼び出しているMacro1()は今迄通り動いて欲しいし、できれば手を加えたくない。
これを防ぐには、以下のようにすればどうでしょうか。
Sub Macro1() proc1 End Sub Sub Macro2() proc1 "新しい" End Sub Sub proc1(Optional iAdd) Dim addMess As String If (IsMissing(iAdd)) Then addMess = "前のまま" Else addMess = iAdd End If MsgBox "これは" & addMess End Sub
ごらんの通り、Macro1()には手を加えていません。
新しく追加したMacro2()でも同様にProc1()を呼び出していますが、こちらは引き数ありですよね。
この違いを可能にする種は、Proc1()のOptionalにあります。
これをつけると呼び出し側がその引き数を省略する事ができます。
では、プロシージャ側から見て、その引き数が省略されているかいないかはどう判断するのでしょうか。
また、省略されている場合、その引き数をそのまま参照しても良いのでしょうか?
最初の答えは、IsMissing()にあります。この結果がTrueの場合はこの変数はなんだかわからないと言う事で、省略されていると言う事ができるのです。
逆にFalseの場合は、指定されていると言う事になりますね。で、指定されていない場合にそのまま使用してしまうとエラーが発生します。
つまり、省略可能な引き数を定義した場合は、IsMissing()で判断しておく必要があるんですね。
最後に注意点を2つほど。
・変数の型はVariantにしておきましょう。じゃないと、IsMissing()が期待した結果を返しませんよ。
・省略可能な引き数以降の引き数は、すべて省略可能でないといけません。なぜかは、内緒(感覚的にわかりますよ、きっと)