如何测试是否提供了可选参数?


Answers:


96

用途IsMissing

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

但是,如果我没记错的话,在为参数提供默认值时,这是行不通的,在任何情况下,使用默认参数都相当多余。


29
我也认为IsMissing仅在参数被声明为变体的情况下才有效
Jon Fournier

5
@Jon:是的,因为IsMissing是根据VARIANTstruct(IIRC,VT_EMPTY)中的标志实现的。我没有提到这一点,因为OP的问题已经被使用Variant了。
康拉德·鲁道夫


10

如果您使用字符串或数字变量,则可以检查该变量的值。例如:

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

这使您可以使用非变量变量。


2
但是,它不能区分完全有效的用法:func("", 0)将错误地标记未设置的参数。一般来说有没有办法有没有使用这种区别Variant秒。
康拉德·鲁道夫

@KonradRudolph这是一个很好的观点。您可能要确保从未使用过这种情况,因为您可能会发送一个空字符串或一个零数字。
OSUZorba


3

您可以使用类似:

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

1

对于变体,我将使用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

其中大多数引用变量类型,或测试值是否为空。

但是,有时您想检查范围,工作簿,工作表或其他类型的对象是否未传递,而不检查工作表名称之类的东西。

在这种情况下:

DesiredRange is Nothing

返回一个布尔值。例如:

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

1
棘手的部分是,并非可以使用每种对象类型进行检查,is Nothing而可以将任何对象存储为一种Variant类型。因此需要明确的是,这针对Ranges或Worksheets这样的对象的解决方案,而不是针对其他类型的对象的解决方案String
Marcucciboy2

-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”;没有它是行不通的。


4
实际上,您不需要也不应IsMissing在这里使用。相反,这是的应用程序ParamArray
康拉德·鲁道夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.