重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Windows2000、Excel2000 です。

ユーザ定義関数を作成しようとしているのですが、
オプショナルパラメータの使い方がわかりません。
オプショナルパラメータをユーザが指定したかどうかは
ユーザ定義関数内でどの様にコーディングするのでしょうか?

つまり、

Public Function Test( p1 As string , _
            Optional p2 As long ) _
As Boolean

上の様な関数の定義をした時、ユーザが p2 のパラメータ
を指定したかどうかを判断する方法が知りたいのです。
どなたか教えてください。

A 回答 (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個の変数です"

パラメータの指定には上記のように使っています。


少々、長くなりました。ご参考に。
    • good
    • 0
この回答へのお礼

ありがとうございました。
大変参考になりました。

お礼日時:2004/01/29 21:03

こんにちは。

maruru01です。

実際に関数を使用する際に、

=Test("aaa",12)

のようになっていれば、p2は指定した12になります。
一方、

=Test("aaa")
または、
=Test("aaa",)

のように省略されていれば、p2は既定値が使用されます。
既定値は、通常、

Optional p2 As Long = 10

のように指定しておきますが、省略されている場合(質問のコード)は、
変数を宣言した時の初期値になります。
今回p2はLong型(数値型)なので、「0」になります。

関数内のコードは、Optionalキーワードの有無はあまり気にしなくてもいいと思います。
p2を省略しようが、しまいが、何らかの値が入っていることには違いがないからです。

この回答への補足

うーん。
Optionalパラメータを指定しなかったのと、ゼロを指定
したのが同じ意味になってしまうんですか。

そうではなくて、何とかパラメータを省略したのと、
パラメータにゼロを指定したのを区別したいんですけど。

補足日時:2004/01/29 20:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!