web-dev-qa-db-ja.com

オプションの引数が提供されているかどうかをテストするにはどうすればよいですか?

オプションの引数が提供されているかどうかをテストするにはどうすればよいですか? -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 
66
Robinicks

IsMissingを使用:

If IsMissing(arg) Then
    MsgBox "Parameter arg not passed"
End If

ただし、記憶が正しければ、引数にデフォルトを指定すると機能しません。いずれにしても、デフォルトの引数を使用するのは冗長です。

81
Konrad Rudolph

IsMissing()関数を使用できます。ただし、これはVariantデータ型でのみ機能します。

Sub func(Optional s As Variant)
   If IsMissing(s) Then
      ' ...
   End If
End Sub
19

文字列変数または数値変数を使用している場合、変数の値を確認できます。例えば:

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

これにより、非バリアント変数を使用できます。

10
OSUZorba

If IsMissing(arg)Then ...

4
Pontus Gagge

次のようなものを使用できます。

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
3
user7238479

バリアントでは、[〜#〜] 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を返すことに注意してください。

1
ashleedawg

これらのほとんどはバリアント型を参照するか、値が空白かどうかをテストします。

ただし、シート名などを確認せずに、範囲、ワークブック、ワークシート、またはその他の種類のオブジェクトが渡されていないかどうかを確認したい場合があります。

その場合:

DesiredRange is Nothing

ブール値を返します。例えば:

    If DestinationRange Is Nothing Then
        MsgBox "Need a destination range when importing data"
    Else
        'We're happy
    End If
0
Selkie

「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」が必要な理由です。それなしでは機能しません。

0
RLE