Hallo Melanie,
Post by Melanie BredenPost by Michael SchwimmerDas geht aber nur bei AND oder OR. Bei AND kann der Defaultwert
WAHR sein und bei OR kann er FALSCH sein. Das ändert nichts an den
Ergebnissen. XOR liefer aber WAHR, wenn beide Werte ungleich sind,
was will man da als Defaultwert benutzen?
dann müsste man bei ODER prüfen, ob einer der Argumente WAHR ist und
dann die Funktion verlassen, die dann als Ergebnis ebenfalls WAHR
liefert, ansonsten bei FALSCH bleibt: For i = 1 To
UBound(ablnParameter) My_OR_MB = ablnParameter(i)
If My_OR_MB Then Exit Function
Next i
das kann man natürlich auch machen, bei ODER braucht man aber nur die
Defaultwerte auf FALSCH setzen, kann den Datentyp Boolean benutzen und
braucht IsMissing nicht. Leider müssen dann immer noch alle
Überprüfungen durchgeführt werden, wenn kein Parameter Wahr ist.
Wenn man eine Funktion mit vielen Parametern richtig schnell machen
will, macht man es sowieso, wie von dir vorgeschlagen. Beim ersten
Auftreten einer Abbruchbedingung wie WAHR bei ODER, oder FALSCH bei UND
schenkt man sich den Rest.
Wenn einige Parameter gar nicht übergeben wurden, kann man versuchen,
diese auch in der Funktion selbst zu ignorieren. Meistens ist aber der
Zeitbedarf größer, herauszufinden, ob der Parameter übergeben wurde, als
wie hier mit Or zu verknüpfen und Falsch als Defaultwert zu benutzen.
Das muss man dann im Einzelfall austesten. Außerdem spielt IMO der
Zeitbedarf erst dann wirklich eine Rolle, wenn die benutzerdefinierte
Funktion häufig im Tabellenblatt benutzt wird und zudem laufend
neuberechnet wird.
Post by Melanie BredenPost by Michael SchwimmerWenn es aber eine Rolle spielt, ob der Parameter ausgewertet wird,
wie bei einer Verknüpfung mit XOR, bleibt dir nichts anderes
übrig, als einen Variant zu benutzen. Nur dann kann man sicher
feststellen, ob etwas übergeben wurde.
Ja, dem stimme ich auch zu, jetzt fehlt mir nur noch ein sinnvolles
Beispiel für die Verwendung von XOR.
Statt auf ungleich (<>) zu prüfen, kann man XOR einsetzen.
Im Direktbereich
? False Xor True
Wahr
? False <> True
Wahr
Es bringt aber keinerlei Zeitvorteile und macht den Code nicht gerade
lesbarer.
Private Declare Function GetTickCount _
Lib "kernel32" () As Long
Sub test()
Dim lngAnfang As Long
Dim strAusgabe As String
Dim blnResult As Boolean
Dim i As Long
lngAnfang = GetTickCount()
For i = 1 To 100000000
blnResult = True Xor False
Next
strAusgabe = "Zeitbedarf Xor : " & GetTickCount() - lngAnfang
lngAnfang = GetTickCount()
For i = 1 To 100000000
blnResult = True <> False
Next
strAusgabe = strAusgabe & vbCrLf & _
"Zeitbedarf <> : " & GetTickCount() - lngAnfang
MsgBox strAusgabe
End Sub
Die IfMissing Funktion habe ich jetzt noch einmal getestet. Es ist nicht
ganz so, wie ich erwartet und auch gepostet habe.
Post by Melanie BredenIsMissing liefert nur vernünftige Werte bei Variants und liefert zudem
Wahr, wenn der übergebene Wert dem Defaultwert entspricht. Du kannst
also nie den Defaultwert übergeben, denn IsMisssing liefert dann Wahr,
genau so, als ob der Parameter überhaupt nicht übergeben wurde.
IsMissing funktioniert ähnlich wie IsEmpty.
Es wird also nicht auf den Defaultwert geprüft!
Bei einem optionalen Parameter, der mit einem anderen Datentyp als
Variant deklariert ist, wird also immer Falsch geliefert, ob dieser nun
übergeben wurde, oder nicht.
Sub test()
' Parameter wird als vorhanden gemeldet
ab1 False ' Parameter wird als FALSCH ausgewertet
' Parameter wird als nicht vorhanden gemeldet
ab1
' Beides mal wird Parameter als vorhanden gemeldet
ab2 False ' Parameter wird als FALSCH ausgewertet
ab2 ' Parameter wird als FALSCH ausgewertet
' Beides mal wird Parameter als vorhanden gemeldet
ab3 True ' Parameter wird als WAHR ausgewertet
ab3 ' Parameter wird als FALSCH ausgewertet
' Parameter wird als vorhanden gemeldet
ab4
End Sub
Function ab1(Optional a)
If IsMissing(a) Then
MsgBox "Missing Parameter", , "ab2"
Else
MsgBox "Parameter = " & a, , "ab2"
End If
End Function
Function ab2(Optional a = False)
If IsMissing(a) Then
MsgBox "Missing Parameter", , "ab2"
Else
MsgBox "Parameter = " & a, , "ab2"
End If
End Function
Function ab3(Optional a As Boolean)
If IsMissing(a) Then
MsgBox "Missing Parameter", , "ab3"
Else
MsgBox "Parameter = " & a, , "ab3"
End If
End Function
Function ab4(Optional a As String)
If IsMissing(a) Then
MsgBox "Missing Parameter", , "ab4"
Else
MsgBox "Parameter = " & a, , "ab4"
End If
End Function
MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de