How do I test if optional arguments are supplied or not?

前端 未结 8 415
后悔当初
后悔当初 2020-12-05 09:20

How do I test if optional arguments are supplied or not? -- in VB6 / VBA

Function func (Optional ByRef arg As Variant = Nothing)

    If arg Is Nothing Then          


        
相关标签:
8条回答
  • 2020-12-05 09:50

    You can use something like:

    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
    
    0 讨论(0)
  • 2020-12-05 09:50

    Most of these refer to the variant type, or test if a value is blank.

    However, sometimes you want to check if a range, workbook, worksheet, or other type of object is not passed, without checking things like sheetnames.

    In that case:

    DesiredRange is Nothing
    

    Returns a boolean. For example:

        If DestinationRange Is Nothing Then
            MsgBox "Need a destination range when importing data"
        Else
            'We're happy
        End If
    
    0 讨论(0)
  • 2020-12-05 09:55

    "IsMissing"...Figured there would have to be a way. Thanks all!

    SQL has a function, In(), where you can pass multiple arguments to see if the target value is in the list. I've always liked that as a solution, so here's my take on that, hope it helps:

    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
    

    So, that's obviously why I needed "IsMissing"; doesn't work without it.

    0 讨论(0)
  • 2020-12-05 09:56

    If IsMissing(arg) Then ...

    0 讨论(0)
  • 2020-12-05 09:57

    You can use the IsMissing() Function. But this one only works with the Variant datatype.

    Sub func(Optional s As Variant)
       If IsMissing(s) Then
          ' ...
       End If
    End Sub
    
    0 讨论(0)
  • 2020-12-05 09:57

    With a variant I would use the NZ function:

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

    It can be used with other data types too, just keep in mind that Zero counts as neither Null nor Zero-Length, so nz(0,"") still returns 0.

    0 讨论(0)
提交回复
热议问题