- ベストアンサー
EXCEL VBAのユーザ定義関数でOPTIONALパラメータを使う方法
Windows2000、Excel2000 です。 ユーザ定義関数を作成しようとしているのですが、 オプショナルパラメータの使い方がわかりません。 オプショナルパラメータをユーザが指定したかどうかは ユーザ定義関数内でどの様にコーディングするのでしょうか? つまり、 Public Function Test( p1 As string , _ Optional p2 As long ) _ As Boolean 上の様な関数の定義をした時、ユーザが p2 のパラメータ を指定したかどうかを判断する方法が知りたいのです。 どなたか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
HELPのIsMissing関数に IsMissing 関数では、バリアント型ではない、整数型や倍精度浮動小数点型などの通常のデータ型に対しては無効です。『これは、整数型などのデータ型では、引数が指定されたかどうかを判断するためのフラグが提供できないためです。よって、バリアント型以外の引数を判別したい場合は、プロシージャの構文内で変数の既定値を代入しておきます。』 (『』は私が付けました) 基本的には、通常のデータ型については『引数が指定されたかどうかを判断できない』ということです。 重要なことは、 ●通常のデータ型では、省略すると規定値が使われる Function fn_Test0(Optional p2 As Long) fn_Test0 = p2 * 10 End Function <使用例> fn_Test0() =0 fn_Test0(0)=0 省略と0をセットが同じ値 fn_Test0(1)=10 パラメータを指定しない場合、規定値の『0』が使われています。 省略すると規定値が使われることを知ってプログラムを作ることが大事です。 ●変数の既定値で判定できる? Function fn_Test1(Optional p2 As Long) If p2 = 0 Then fn_Test1 = "パラメータが省略されています" Else fn_Test1 = p2 * 10 End If End Function <使用例> fn_Test1()="パラメータが省略されています" fn_Test1(0)="パラメータが省略されています" こうしても判断できない! fn_Test1(1)=10 規定値なら省略と判断していますが省略の判定はできません。 ●Variant型ならIsMissingで判定する Function fn_Test2(Optional p2 As Variant) If IsMissing(p2) Then fn_Test2 = "パラメータが省略されています" Else fn_Test2 = p2 * 10 End If End Function <使用例> fn_Test2()="パラメータが省略されています" fn_Test2(0)=0 Variant型なら判断できる! fn_Test2(1)=10 ●ParamArrayで配列を渡す場合、UBoundで判定する Function fn_Test3(ParamArray myAry()) If UBound(myAry) = -1 Then fn_Test3 = "パラメータが省略されています" Else fn_Test3 = (UBound(myAry) + 1) & "個の変数です" End If End Function <使用例> fn_Test3() = "パラメータが省略されています" 判断できる! fn_Test3(1,2,3) = "3個の変数です" パラメータの指定には上記のように使っています。 少々、長くなりました。ご参考に。
その他の回答 (1)
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 実際に関数を使用する際に、 =Test("aaa",12) のようになっていれば、p2は指定した12になります。 一方、 =Test("aaa") または、 =Test("aaa",) のように省略されていれば、p2は既定値が使用されます。 既定値は、通常、 Optional p2 As Long = 10 のように指定しておきますが、省略されている場合(質問のコード)は、 変数を宣言した時の初期値になります。 今回p2はLong型(数値型)なので、「0」になります。 関数内のコードは、Optionalキーワードの有無はあまり気にしなくてもいいと思います。 p2を省略しようが、しまいが、何らかの値が入っていることには違いがないからです。
補足
うーん。 Optionalパラメータを指定しなかったのと、ゼロを指定 したのが同じ意味になってしまうんですか。 そうではなくて、何とかパラメータを省略したのと、 パラメータにゼロを指定したのを区別したいんですけど。
お礼
ありがとうございました。 大変参考になりました。