
Windows2000、Excel2000 です。
ユーザ定義関数を作成しようとしているのですが、
オプショナルパラメータの使い方がわかりません。
オプショナルパラメータをユーザが指定したかどうかは
ユーザ定義関数内でどの様にコーディングするのでしょうか?
つまり、
Public Function Test( p1 As string , _
Optional p2 As long ) _
As Boolean
上の様な関数の定義をした時、ユーザが p2 のパラメータ
を指定したかどうかを判断する方法が知りたいのです。
どなたか教えてください。
No.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個の変数です"
パラメータの指定には上記のように使っています。
少々、長くなりました。ご参考に。
No.1
- 回答日時:
こんにちは。
maruru01です。実際に関数を使用する際に、
=Test("aaa",12)
のようになっていれば、p2は指定した12になります。
一方、
=Test("aaa")
または、
=Test("aaa",)
のように省略されていれば、p2は既定値が使用されます。
既定値は、通常、
Optional p2 As Long = 10
のように指定しておきますが、省略されている場合(質問のコード)は、
変数を宣言した時の初期値になります。
今回p2はLong型(数値型)なので、「0」になります。
関数内のコードは、Optionalキーワードの有無はあまり気にしなくてもいいと思います。
p2を省略しようが、しまいが、何らかの値が入っていることには違いがないからです。
この回答への補足
うーん。
Optionalパラメータを指定しなかったのと、ゼロを指定
したのが同じ意味になってしまうんですか。
そうではなくて、何とかパラメータを省略したのと、
パラメータにゼロを指定したのを区別したいんですけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのコードで Dim Obj As AccessObject でコンパイルエラーがでます。 「ユ 2 2022/07/01 06:57
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- その他(Microsoft Office) Excelでユーザ名を入力すればそのユーザの最大、平均が表示されるようにする、何も入力されてなければ 1 2022/07/28 00:31
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Excel(エクセル) Excelのセルの書式設定「通貨」で(\1,234)の選択肢が消えてしまった 2 2022/08/01 10:32
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
英語【Schedule】の省略はあり...
-
minuteの省略の「min」に「S」...
-
日付の前にtheをつける場合、つ...
-
( ) to himself, John might ha...
-
略語の対義語は何ですか?正式...
-
会社名の前に付いている M/s....
-
古文で 行く先急がるる御心地に...
-
dH2Oってなんすか?
-
cust. は省略形?
-
上と同じ、という意味で使用す...
-
Your fine. とはどういう意味で...
-
『Nite』=? Nightとは違う...
-
help (that) S+V という構文は...
-
Lotの表記方法
-
古典文法・「~にや」の後の省...
-
この文の 's は、is の省略でし...
-
係り結びについて
-
統計での英語、includeについて
-
【省略符】日本語の省略符って...
-
同格の接続詞thatの省略はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英語【Schedule】の省略はあり...
-
minuteの省略の「min」に「S」...
-
日付の前にtheをつける場合、つ...
-
略語の対義語は何ですか?正式...
-
会社名の前に付いている M/s....
-
cust. は省略形?
-
Lotの表記方法
-
dH2Oってなんすか?
-
「AとBが・・・」と「AとBとが...
-
Masterの省略形
-
この文の 's は、is の省略でし...
-
『Nite』=? Nightとは違う...
-
比較級 than SV について
-
「曜日」に該当する英語(省略...
-
where possible
-
The coming of clocks caused a...
-
Abbreviation for "Country"
-
上と同じ、という意味で使用す...
-
help (that) S+V という構文は...
-
省略を英語で表現すると何でし...
おすすめ情報