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
IsMissing
wird in Form eines Flags in derVARIANT
Struktur (IIRC,VT_EMPTY
) implementiert . Ich habe dies nicht erwähnt, da die Frage des OPVariant
ohnehin schon verwendet wurde.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
quelle
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.
quelle
func("", 0)
Markiert nicht gesetzte Parameter fälschlicherweise. Im Allgemeinen gibt es keine Möglichkeit , diese Unterscheidung ohne Verwendung vonVariant
s zu treffen.Wenn IsMissing (arg) Dann ...
quelle
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
quelle
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.quelle
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
quelle
is Nothing
während jedes Objekt in einemVariant
Typ gespeichert werden kann . So klar sein, dies ist eine Lösung für Objekte wieRange
s oderWorksheet
s , aber nicht für andere Arten wieString
"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.
quelle
IsMissing
hier nicht verwenden . Stattdessen ist dies eine Anwendung für aParamArray
.