如何测试是否提供了可选参数? - 在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
答案 0 :(得分:77)
使用IsMissing
:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
但是,如果我没记错的话,在给出参数的默认值时这不起作用,并且在任何情况下它都使用默认参数而非冗余。
答案 1 :(得分:17)
您可以使用IsMissing()函数。但是这个只适用于Variant数据类型。
Sub func(Optional s As Variant)
If IsMissing(s) Then
' ...
End If
End Sub
答案 2 :(得分:9)
如果使用字符串或数字变量,则可以检查变量的值。例如:
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
这允许您使用非变量变量。
答案 3 :(得分:4)
如果IsMissing(arg)那么......
答案 4 :(得分:2)
您可以使用以下内容:
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
答案 5 :(得分:1)
对于变体,我会使用 NZ 功能:
Function func (Optional ByRef arg As Variant = Nothing)
If nz ( arg, 0 ) = 0 Then
MsgBox "NOT SENT"
End If
End Function
它也可以与其他数据类型一起使用,请记住Zero既不是Null也不是Zero-Length,所以nz(0,"")
仍然返回0。
答案 6 :(得分:0)
“正在丢失” ...想必一定有办法。谢谢大家!
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”的原因;没有它是行不通的。
答案 7 :(得分:0)
其中大多数引用变量类型,或测试值是否为空。
但是,有时您想检查范围,工作簿,工作表或其他类型的对象是否未传递,而不检查工作表名称之类的东西。
在这种情况下:
DesiredRange is Nothing
返回一个布尔值。例如:
If DestinationRange Is Nothing Then
MsgBox "Need a destination range when importing data"
Else
'We're happy
End If