82

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

8 に答える 8

105

使用IsMissing

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

しかし、私が正しく覚えていれば、これは引数のデフォルトを与えるときに機能せず、いずれにせよ、デフォルトの引数の使用はかなり冗長になります。

于 2009-11-02T11:41:10.477 に答える
24

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

Sub func(Optional s As Variant)
   If IsMissing(s) Then
      ' ...
   End If
End Sub
于 2009-11-02T11:43:57.977 に答える
11

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

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

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

于 2016-05-19T16:19:07.260 に答える
6

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

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
于 2016-12-01T21:44:19.233 に答える
3

If IsMissing(arg)Then..。

于 2009-11-02T11:41:02.287 に答える
3

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

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

その場合:

DesiredRange is Nothing

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

    If DestinationRange Is Nothing Then
        MsgBox "Need a destination range when importing data"
    Else
        'We're happy
    End If
于 2019-04-24T19:31:55.137 に答える
2

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

于 2017-06-18T09:00:53.377 に答える
-1

「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」を必要とした理由です。それなしでは動作しません。

于 2018-08-16T18:40:28.663 に答える