Как мне проверить, указаны ли необязательные аргументы или нет?
Как проверить, поставляются ли дополнительные аргументы или нет? - в 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
Ответы
Ответ 1
Используйте IsMissing
:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
Однако, если я правильно помню, это не работает при предоставлении значения по умолчанию для аргумента, и в любом случае он делает использование аргумента по умолчанию довольно избыточным.
Ответ 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
Это позволяет использовать невариантные переменные.
Ответ 4
Если IsMissing (arg) Затем...
Ответ 5
Вы можете использовать что-то вроде:
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
В варианте я использовал бы функцию NZ:
Function func (Optional ByRef arg As Variant = Nothing)
If nz ( arg, 0 ) = 0 Then
MsgBox "NOT SENT"
End If
End Function
Он также может использоваться с другими типами данных, просто имейте в виду, что Zero считается ни Null, ни Zero-Length, поэтому nz(0,"")
все равно возвращает 0.
Ответ 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"; не работает без этого.
Ответ 8
Большинство из них относятся к типу варианта или проверяют, является ли значение пустым.
Однако иногда вы хотите проверить, не передан ли диапазон, рабочая книга, лист или объект другого типа, без проверки таких вещей, как имена листов.
В таком случае:
DesiredRange is Nothing
Возвращает логическое значение. Например:
If DestinationRange Is Nothing Then
MsgBox "Need a destination range when importing data"
Else
'We're happy
End If