(Excel No15)「引き数を省略する」


変更を最小限に押さえて、プロシージャを変更したい事ってありますよね?
そういう場合は、省略可能な引き数を使用すると良いかもしれません。
何が良いかと言うと、そのプロシージャを呼んでいた今迄の部分は一切変更せずに、そのプロシージャと新しく呼び出そうとしている部分にだけ手を加えれば良いのです。
例えば、以下のようなマクロがあるとします(思いきり単純にしています)。

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つほど。icon_surprised.gif

・変数の型はVariantにしておきましょう。じゃないと、IsMissing()が期待した結果を返しませんよ。

・省略可能な引き数以降の引き数は、すべて省略可能でないといけません。なぜかは、内緒(感覚的にわかりますよ、きっと)

コメントを残す

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

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください