Wie teste ich, ob optionale Argumente angegeben werden oder nicht?

76

Wie teste ich, ob optionale Argumente angegeben werden oder nicht? - 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 
Robin Rodricks
quelle

Antworten:

96

Verwendung IsMissing:

If IsMissing(arg) Then
    MsgBox "Parameter arg not passed"
End If

Wenn ich mich richtig erinnere, funktioniert dies jedoch nicht, wenn ein Standardwert für das Argument angegeben wird, und macht die Verwendung des Standardarguments auf jeden Fall ziemlich überflüssig.

Konrad Rudolph
quelle
29
Ich denke auch, dass IsMissing nur funktioniert, wenn das Argument als Variante deklariert ist
Jon Fournier
5
@ Jon: true, da IsMissingwird in Form eines Flags in der VARIANTStruktur (IIRC, VT_EMPTY) implementiert . Ich habe dies nicht erwähnt, da die Frage des OP Variantohnehin schon verwendet wurde.
Konrad Rudolph
21

Sie können die IsMissing () -Funktion verwenden. Dieser funktioniert jedoch nur mit dem Datentyp Variant.

Sub func(Optional s As Variant)
   If IsMissing(s) Then
      ' ...
   End If
End Sub
Florian Fankhauser
quelle
10

Wenn Sie eine Zeichenfolge- oder Zahlenvariable verwenden, können Sie den Wert der Variablen überprüfen. Zum Beispiel:

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

Auf diese Weise können Sie nichtvariante Variablen verwenden.

OSUZorba
quelle
2
Es kann jedoch keine perfekt gültige Verwendung unterscheiden: func("", 0)Markiert nicht gesetzte Parameter fälschlicherweise. Im Allgemeinen gibt es keine Möglichkeit , diese Unterscheidung ohne Verwendung von Variants zu treffen.
Konrad Rudolph
@KonradRudolph Das ist ein sehr guter Punkt. Sie möchten sicherstellen, dass Sie es nie in einer Situation verwendet haben, in der Sie möglicherweise eine leere Zeichenfolge oder eine Zahl von Null senden.
OSUZorba
3

Wenn IsMissing (arg) Dann ...

Pontus Gagge
quelle
3

Sie können etwas verwenden wie:

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
user7238479
quelle
1

Bei einer Variante würde ich die NZ- Funktion verwenden:

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

Es kann auch mit anderen Datentypen verwendet werden. Beachten Sie jedoch, dass Null weder als Null noch als Nulllänge zählt und daher nz(0,"")immer noch 0 zurückgibt.

ashleedawg
quelle
1

Die meisten davon beziehen sich auf den Variantentyp oder testen, ob ein Wert leer ist.

Manchmal möchten Sie jedoch überprüfen, ob ein Bereich, eine Arbeitsmappe, ein Arbeitsblatt oder ein anderer Objekttyp nicht übergeben wird, ohne beispielsweise Blattnamen zu überprüfen.

In diesem Fall:

DesiredRange is Nothing

Gibt einen Booleschen Wert zurück. Zum Beispiel:

    If DestinationRange Is Nothing Then
        MsgBox "Need a destination range when importing data"
    Else
        'We're happy
    End If
Selkie
quelle
1
Der schwierige Teil ist, dass nicht jeder Objekttyp überprüft werden kann, is Nothingwährend jedes Objekt in einem VariantTyp gespeichert werden kann . So klar sein, dies ist eine Lösung für Objekte wie Ranges oder Worksheets , aber nicht für andere Arten wieString
Marcucciboy2
-1

"IsMissing" ... Ich dachte, es müsste einen Weg geben. Vielen Dank an alle!

SQL hat die Funktion In (), mit der Sie mehrere Argumente übergeben können, um festzustellen, ob der Zielwert in der Liste enthalten ist. Ich habe das als Lösung immer gemocht, also hier meine Meinung dazu, hoffe es hilft:

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

Deshalb brauchte ich natürlich "IsMissing". funktioniert nicht ohne.

RLE
quelle
4
Eigentlich brauchst und solltest du IsMissinghier nicht verwenden . Stattdessen ist dies eine Anwendung für a ParamArray.
Konrad Rudolph