オプションの引数が提供されているかどうかをテストするにはどうすればよいですか? -VB6/VBAで
Function func (Optional ByRef arg As Variant = Nothing)
If arg Is Nothing Then <----- run-time error 424 "object required"
MsgBox "NOT SENT"
End If
End Function
IsMissing
を使用:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
ただし、記憶が正しければ、引数にデフォルトを指定すると機能しません。いずれにしても、デフォルトの引数を使用するのは冗長です。
IsMissing()関数を使用できます。ただし、これはVariantデータ型でのみ機能します。
Sub func(Optional s As Variant)
If IsMissing(s) Then
' ...
End If
End Sub
文字列変数または数値変数を使用している場合、変数の値を確認できます。例えば:
Function func (Optional Str as String, Optional Num as Integer)
If Str = "" Then
MsgBox "NOT SENT"
End If
If Num = 0 Then
MsgBox "NOT SENT"
End If
End Function
これにより、非バリアント変数を使用できます。
If IsMissing(arg)Then ...
次のようなものを使用できます。
function func(optional vNum as integer:=&HFFFF) '&HFFFF value that is NEVER set on vNum
If vNum = &HFFFF Then
MsgBox "NOT SENT"
End If
End Function
バリアントでは、[〜#〜] nz [〜#〜]関数を使用します。
_Function func (Optional ByRef arg As Variant = Nothing)
If nz ( arg, 0 ) = 0 Then
MsgBox "NOT SENT"
End If
End Function
_
他のデータ型でも使用できます。ゼロはNullでもゼロ長でもないため、nz(0,"")
は0を返すことに注意してください。
これらのほとんどはバリアント型を参照するか、値が空白かどうかをテストします。
ただし、シート名などを確認せずに、範囲、ワークブック、ワークシート、またはその他の種類のオブジェクトが渡されていないかどうかを確認したい場合があります。
その場合:
DesiredRange is Nothing
ブール値を返します。例えば:
If DestinationRange Is Nothing Then
MsgBox "Need a destination range when importing data"
Else
'We're happy
End If
「IsMissing」...方法があるはずだと考えた。皆さんありがとう!
SQLには関数In()があり、複数の引数を渡して、ターゲット値がリストにあるかどうかを確認できます。私はいつもそれを解決策として気に入っていたので、ここに私の見解を示します。
Public Function IsIn(ByVal TestVal, ByVal VersusVal1, _
Optional ByVal VersusVal2, Optional ByVal VersusVal3, _
Optional ByVal VersusVal4, Optional ByVal VersusVal5, _
Optional ByVal VersusVal6, Optional ByVal VersusVal7, _
Optional ByVal VersusVal8, Optional ByVal VersusVal9, _
Optional ByVal VersusVal10, Optional ByVal VersusVal11, _
Optional ByVal VersusVal12, Optional ByVal VersusVal13, _
Optional ByVal VersusVal14, Optional ByVal VersusVal15, _
Optional ByVal VersusVal16, Optional ByVal VersusVal17, _
Optional ByVal VersusVal18, Optional ByVal VersusVal19, _
Optional ByVal VersusVal20) As Boolean
Dim CheckVals(1 To 20) as Variant
VersusVals(1) = VersusVal1
VersusVals(2) = VersusVal2
VersusVals(3) = VersusVal3
VersusVals(4) = VersusVal4
VersusVals(5) = VersusVal5
VersusVals(6) = VersusVal6
VersusVals(7) = VersusVal7
VersusVals(8) = VersusVal8
VersusVals(9) = VersusVal9
VersusVals(10) = VersusVal10
VersusVals(11) = VersusVal11
VersusVals(12) = VersusVal12
VersusVals(13) = VersusVal13
VersusVals(14) = VersusVal14
VersusVals(15) = VersusVal15
VersusVals(16) = VersusVal16
VersusVals(17) = VersusVal17
VersusVals(18) = VersusVal18
VersusVals(19) = VersusVal19
VersusVals(20) = VersusVal20
On Error Goto 0
IsIn = False
For x = 1 To 20
If Not IsMissing(VersusVals(x)) Then
If TestVal = VersusVals(x) Then
IsIn = True
Exit For
End If
End If
Next x
End Function
だから、それが明らかに「IsMissing」が必要な理由です。それなしでは機能しません。