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

如果 IsMissing(arg) 则...

于 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 回答