如何测试是不是提供了可选参数?
Posted
技术标签:
【中文标题】如何测试是不是提供了可选参数?【英文标题】:How do I test if optional arguments are supplied or not?如何测试是否提供了可选参数? 【发布时间】:2010-12-12 06:12:25 【问题描述】:如何测试是否提供了可选参数? -- 在 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
【问题讨论】:
【参考方案1】:使用IsMissing
:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
但是,如果我没记错的话,这在为参数提供默认值时不起作用,并且在任何情况下它都会使使用默认参数变得相当多余。
【讨论】:
另外我认为 IsMissing 仅在参数被声明为变体时才有效 @Jon: true,因为IsMissing
是根据VARIANT
结构(IIRC,VT_EMPTY
)中的标志实现的。我没有提到这一点,因为 OP 的问题已经使用了Variant
。【参考方案2】:
您可以使用 IsMissing() 函数。但是这个只适用于 Variant 数据类型。
Sub func(Optional s As Variant)
If IsMissing(s) Then
' ...
End If
End Sub
【讨论】:
【参考方案3】:如果您使用的是字符串或数字变量,您可以检查变量的值。例如:
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
这允许您使用非变体变量。
【讨论】:
它无法区分完全有效的用法:func("", 0)
将错误地标记未设置的参数。一般来说,如果不使用Variant
s,就没有办法有这种区别。
@KonradRudolph 这是一个很好的观点。您需要确保您从未在可能发送空字符串或数字零的情况下使用它。
If Num = 0 Then 是 Int 值的问题。如果用户手动将参数设置为 0,你会怎么做?【参考方案4】:
你可以使用类似的东西:
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
【讨论】:
这个很聪明。推荐的“isMissing”仅适用于变体数据类型,而这一原则相当普遍。 这是 Microsoft 的正确答案,因为“程序无法在运行时检测给定参数是否被省略...将不太可能的值设置为默认值。” docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/…【参考方案5】:如果 IsMissing(arg) 那么 ...
【讨论】:
【参考方案6】:其中大部分是指变体类型,或测试值是否为空。
但是,有时您想检查范围、工作簿、工作表或其他类型的对象是否未通过,而不检查工作表名称之类的内容。
在这种情况下:
DesiredRange is Nothing
返回一个布尔值。例如:
If DestinationRange Is Nothing Then
MsgBox "Need a destination range when importing data"
Else
'We're happy
End If
【讨论】:
棘手的部分是不是每种类型的对象都可以使用is Nothing
检查,而任何对象都可以存储在Variant
类型中。需要明确的是,这是针对Range
s 或Worksheet
s 等对象的解决方案,但不适用于String
等其他类型的对象【参考方案7】:
如果有一个变体,我会使用 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。
【讨论】:
【参考方案8】:“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”的原因;没有它就不行。
【讨论】:
其实你不需要也不应该在这里使用IsMissing
。相反,这是一个ParamArray
的应用程序。以上是关于如何测试是不是提供了可选参数?的主要内容,如果未能解决你的问题,请参考以下文章