web-dev-qa-db-fra.com

Comment puis-je tester si des arguments facultatifs sont fournis ou non?

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 
66
Robinicks

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.

81
Konrad Rudolph

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
19

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.

10
OSUZorba

Si IsMissing (arg) Alors ...

4
Pontus Gagge

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
3
user7238479

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.

1
ashleedawg

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
0
Selkie

"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.

0
RLE