代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

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

  •  58
  • Robin Rodricks  · 技术社区  · 15 年前

    如何测试是否提供了可选参数?在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 
    
    7 回复  |  直到 7 年前
        1
  •  74
  •   Ould Abba    12 年前

    使用 IsMissing :

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

    但是,如果我记得正确的话,在为参数提供默认值时,这不起作用,而且在任何情况下,使用默认参数都是多余的。

        2
  •  17
  •   Florian Fankhauser    7 年前

    您可以使用isMissing()函数。但这个只适用于变量数据类型。

    Sub func(Optional s As Variant)
       If IsMissing(s) Then
          ' ...
       End If
    End Sub
    
        3
  •  7
  •   OSUZorba    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
    

    这允许您使用非变量变量。

        4
  •  4
  •   Pontus Gagge    15 年前

    如果正在发送(arg),则…

        5
  •  2
  •   Luka Kerr Max Dercum    8 年前

    您可以使用如下内容:

    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
    
        6
  •  1
  •   ashleedawg    8 年前

    对于一个变体,我将使用 新西兰 功能:

    Function func (Optional ByRef arg As Variant = Nothing)
        If nz ( arg, 0 ) = 0 Then
            MsgBox "NOT SENT"
        End If
    End Function 
    

    它也可以与其他数据类型一起使用,请记住,零既不算作空值,也不算作零长度,因此 nz(0,"") 仍然返回0。

        7
  •  0
  •   RLE    7 年前

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