【问题标题】: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 

【问题讨论】:

    标签: vba function vb6 arguments optional-arguments


    【解决方案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) 将错误地标记未设置的参数。一般来说,如果不使用Variants,就没有办法有这种区别。
      • @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
      

      【讨论】:

      【解决方案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类型中。需要明确的是,这针对Ranges 或Worksheets 等对象的解决方案,但不适用于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 的应用程序。
          猜你喜欢
          • 1970-01-01
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多