Comment puis-je tester si des arguments facultatifs sont fournis ou non? - en 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
Utilisez IsMissing
:
If IsMissing(arg) Then
MsgBox "Parameter arg not passed"
End If
Cependant, si je me souviens bien, cela ne fonctionne pas lorsque vous donnez une valeur par défaut à l'argument, et en tout cas cela rend l'utilisation de l'argument par défaut plutôt redondante.
Vous pouvez utiliser la fonction IsMissing (). Mais celui-ci ne fonctionne qu'avec le type de données Variant.
Sub func(Optional s As Variant)
If IsMissing(s) Then
' ...
End If
End Sub
Si vous utilisez une chaîne ou une variable numérique, vous pouvez vérifier la valeur de la variable. Par exemple:
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
Cela vous permet d'utiliser des variables non variantes.
Si IsMissing (arg) Alors ...
Vous pouvez utiliser quelque chose comme:
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
Avec une variante, j'utiliserais la fonction NZ :
Function func (Optional ByRef arg As Variant = Nothing)
If nz ( arg, 0 ) = 0 Then
MsgBox "NOT SENT"
End If
End Function
Il peut également être utilisé avec d'autres types de données, gardez à l'esprit que Zero ne compte ni comme Null ni comme Zero-Length, donc nz(0,"")
renvoie toujours 0.
La plupart d'entre eux font référence au type de variante ou testent si une valeur est vide.
Cependant, vous souhaitez parfois vérifier si une plage, un classeur, une feuille de calcul ou un autre type d'objet n'est pas transmis, sans vérifier des éléments tels que les noms de feuille.
Dans ce cas:
DesiredRange is Nothing
Renvoie un booléen. Par exemple:
If DestinationRange Is Nothing Then
MsgBox "Need a destination range when importing data"
Else
'We're happy
End If
"IsMissing" ... Je pensais qu'il devrait y avoir un moyen. Merci a tous!
SQL a une fonction, In (), où vous pouvez passer plusieurs arguments pour voir si la valeur cible est dans la liste. J'ai toujours aimé cela comme solution, alors voici mon point de vue, j'espère que cela aide:
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
Donc, c'est évidemment pourquoi j'avais besoin de "IsMissing"; ne fonctionne pas sans cela.