Reputation: 114056
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 <----- run-time error 424 "object required"
MsgBox "NOT SENT"
End If
End Function
Upvotes: 87
Views: 111552
Reputation: 596
"IsMissing(var)" for variants
"StrPtr(var) = 0" for strings
For other data types there's no perfect solution, you can only test for their default values, therefore not distinguishing between a not passed argument and a passed argument valued as default.
Upvotes: 1
Reputation: 1255
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
Upvotes: 4
Reputation: 3675
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
Upvotes: 25
Reputation: 1
"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.
Upvotes: -2
Reputation: 21639
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.
Upvotes: 2
Reputation: 89
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
Upvotes: 8
Reputation: 1129
If you are using a string or number variable you can check the value of the variable. For example:
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
This allows you to use non-variant variables.
Upvotes: 10
Reputation: 545963
Use IsMissing
:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
However, if I remember correctly, this doesn’t work when giving a default for the argument, and in any case it makes using the default argument rather redundant.
Upvotes: 114