Discussion:
Array als Übergabeparameter einer Function
(zu alt für eine Antwort)
Ralf Schollmeyer
2004-11-07 13:06:06 UTC
Permalink
Hallo NG
jeder kennt die Funktionen UND, ODER etc aus der Kategorie Logik. Dort ist
es möglich bis zu 5 (oder waren es 6) Parameter zu übergeben. Automatisch
wird im Formelassistenten das nächste Eingabefeld aktiviert, wenn man mit
dem Cursor in das scheinbar letzte Eingabefeld steht.
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn zusammenzubasteln,
sollte es ja auf die gleiche Art und Weise funktionieren. Jedoch gibt es
dann eine Schwierigkeit:
das Parameterarray darf nur vom Typ Variant sein!?
So kann das wohl nicht umgesetzt werden!
Gibt es eine Möglichkeit, ein Array vom Typ Boolean zu übergeben?

MfG
Ralf
Melanie Breden
2004-11-07 20:30:01 UTC
Permalink
Hallo Ralf,
Post by Ralf Schollmeyer
jeder kennt die Funktionen UND, ODER etc aus der Kategorie Logik. Dort ist
es möglich bis zu 5 (oder waren es 6) Parameter zu übergeben. Automatisch
wird im Formelassistenten das nächste Eingabefeld aktiviert, wenn man mit
dem Cursor in das scheinbar letzte Eingabefeld steht.
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn zusammenzubasteln,
sollte es ja auf die gleiche Art und Weise funktionieren. Jedoch gibt es
das Parameterarray darf nur vom Typ Variant sein!?
So kann das wohl nicht umgesetzt werden!
Gibt es eine Möglichkeit, ein Array vom Typ Boolean zu übergeben?
was genau willst du erreichen?
Wozu brauchst du ein Array vom Typ Boolean?
Boolean kann nur einen Wert, entweder WAHR oder FALSCH liefern.
Ein Array (Datenfeld) hat ja mehrere Werte und muss als Variant deklariet werden.

Kannst du deine Frage an einem Beispiel verdeutlichen?
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Ralf Schollmeyer
2004-11-08 00:38:33 UTC
Permalink
das Beispiel wäre die in Excel vorhandene UND-Funktion, wo max 5 Parameter
übergeben werde können. Erstellt man nun eine benutzerdefiniert XOR-Funktion
müsste ja auch wieder minimal 2, maximal 5 Paramete möglich sein.
Wenn diese Sache mit der UND-Funktion klappt, dann gibt es irgendwas für
meine benutzerdef. Fktn womit es möglich ist von/bis Parameter vom Typ
Boolean, denn die UND-Parameter werden ja auch als WAHR/Falsch-Werte
übergeben.
MfG
Ralf
Post by Melanie Breden
Hallo Ralf,
Post by Ralf Schollmeyer
jeder kennt die Funktionen UND, ODER etc aus der Kategorie Logik. Dort ist
es möglich bis zu 5 (oder waren es 6) Parameter zu übergeben. Automatisch
wird im Formelassistenten das nächste Eingabefeld aktiviert, wenn man mit
dem Cursor in das scheinbar letzte Eingabefeld steht.
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn
zusammenzubasteln,
Post by Melanie Breden
Post by Ralf Schollmeyer
sollte es ja auf die gleiche Art und Weise funktionieren. Jedoch gibt es
das Parameterarray darf nur vom Typ Variant sein!?
So kann das wohl nicht umgesetzt werden!
Gibt es eine Möglichkeit, ein Array vom Typ Boolean zu übergeben?
was genau willst du erreichen?
Wozu brauchst du ein Array vom Typ Boolean?
Boolean kann nur einen Wert, entweder WAHR oder FALSCH liefern.
Ein Array (Datenfeld) hat ja mehrere Werte und muss als Variant deklariet werden.
Kannst du deine Frage an einem Beispiel verdeutlichen?
--
Mit freundlichen Grüssen
Melanie Breden
- Microsoft MVP für Excel -
http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Schwimmer
2004-11-08 06:20:50 UTC
Permalink
Hallo Ralf,
jeder kennt die Funktionen UND, ODER etc aus der Kategorie .
Logik. Dort ist es möglich bis zu 5 (oder waren es 6) Parameter
zu übergeben.
Das dürften 30 sein.
Automatisch wird im Formelassistenten das nächste Eingabefeld
aktiviert, wenn man mit dem Cursor in das scheinbar letzte
Eingabefeld steht.
im Objektkatalog sieht die Tabellenfunktion so aus:

Function And(Arg1, [Arg2], [Arg3], [Arg4], [Arg5], [Arg6],
[Arg7], [Arg8], [Arg9], [Arg10], [Arg11], [Arg12], [Arg13],
[Arg14], [Arg15], [Arg16], [Arg17], [Arg18], [Arg19],
[Arg20], [Arg21], [Arg22], [Arg23], [Arg24], [Arg25],
[Arg26], [Arg27], [Arg28], [Arg29], [Arg30]) As Boolean

Element von Excel.IWorksheetFunction
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn
zusammenzubasteln, sollte es ja auf die gleiche Art und Weise
das Parameterarray darf nur vom Typ Variant sein!?
So kann das wohl nicht umgesetzt werden!
Gibt es eine Möglichkeit, ein Array vom Typ Boolean zu übergeben?
du möchtest sicher kein Parameterarray übergeben, du willst
garantiert so übergeben, wie es bei der Tabellenfunktion
U N D der Fall ist.
Dazu musst du im Funktionskopf mit optionalen Parametern arbeiten.

Du kannst diese Parameter dann zwar als Boolean deklarieren,
hast aber anschließend keine Möglichkeit mehr, zu erkennen,
ob dieser optionale Parameter auch tatsächlich übergeben wurde.
IsMissing funzt in dem Fall nicht!

Also müssen Variants ran, was natürlich neue Probleme
aufwirft, da diese nicht nur Boolesche Werte aufnehmen
können.
Ob das folgende Beispiel besonders sinnvoll ist, sei dahingestellt,
so ähnlich müsstest du aber vorgehen.

Public Function MyXOR(Arg1 As Boolean, Arg2 As Boolean, _
Optional Arg3 As Variant, Optional Arg4 As Variant, _
Optional Arg5 As Variant, Optional Arg6 As Variant _
) As Boolean

Dim i As Long
Dim ablnParameter() As Boolean
Dim blnResult As Boolean

If IsMissing(Arg6) Then
ReDim ablnParameter(1 To 5)
Else
ablnParameter(6) = CBool(Arg6)
End If

If IsMissing(Arg5) Then
ReDim ablnParameter(1 To 4)
Else
ablnParameter(5) = CBool(Arg5)
End If

If IsMissing(Arg4) Then
ReDim ablnParameter(1 To 3)
Else
ablnParameter(4) = CBool(Arg4)
End If

If IsMissing(Arg3) Then
ReDim ablnParameter(1 To 2)
Else
ablnParameter(3) = CBool(Arg3)
End If

ablnParameter(2) = Arg2
ablnParameter(1) = Arg1

blnResult = ablnParameter(1)
For i = 2 To UBound(ablnParameter)
blnResult = blnResult Xor ablnParameter(i)
Next

MyXOR = blnResult

End Function


MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Melanie Breden
2004-11-08 08:15:05 UTC
Permalink
Hallo Michael,
Post by Michael Schwimmer
du möchtest sicher kein Parameterarray übergeben, du willst
garantiert so übergeben, wie es bei der Tabellenfunktion
U N D der Fall ist.
Dazu musst du im Funktionskopf mit optionalen Parametern arbeiten.
Du kannst diese Parameter dann zwar als Boolean deklarieren,
hast aber anschließend keine Möglichkeit mehr, zu erkennen,
ob dieser optionale Parameter auch tatsächlich übergeben wurde.
IsMissing funzt in dem Fall nicht!
Also müssen Variants ran, was natürlich neue Probleme
aufwirft, da diese nicht nur Boolesche Werte aufnehmen
können.
Ob das folgende Beispiel besonders sinnvoll ist, sei dahingestellt,
so ähnlich müsstest du aber vorgehen.
[Snipp Function]
Post by Michael Schwimmer
ablnParameter(2) = Arg2
ablnParameter(1) = Arg1
blnResult = ablnParameter(1)
For i = 2 To UBound(ablnParameter)
blnResult = blnResult Xor ablnParameter(i)
Next
wenn ich das richtig verstanden habe, soll die Function entsprechend der
UND-Funktion prüfen, ob alle Argumente WAHR sind?
Durch XOR werden aber zwei True-Werte als False ausgewertet.

Folgende Aufrufe müssten WAHR liefern, tun sie aber nicht:
?MyXOR(1 + 1 = 2, True, 3 + 3 = 6, 1 - 5 = -4) ' Falsch
?MyXOR(True, True, True, True) 'Falsch

Allerdings funktioniert es mit einer ungeraden Anzahl an Argumenten:
?MyXOR(True, True, True) ' Wahr

Warum die Function nicht mit optionalen Boolean Parametern mit dem Defaultwert 'True' deklarieren?

Public Function MyXOR_MB(Arg1 As Boolean, Optional Arg2 As Boolean = True, _
Optional Arg3 As Boolean = True, Optional Arg4 As Boolean = True, _
Optional Arg5 As Boolean = True, Optional Arg6 As Boolean = True _
) As Boolean

Dim i As Long
Dim ablnParameter() As Boolean
ReDim ablnParameter(1 To 6)

ablnParameter(1) = CBool(Arg1)
ablnParameter(2) = CBool(Arg2)
ablnParameter(3) = CBool(Arg3)
ablnParameter(4) = CBool(Arg4)
ablnParameter(5) = CBool(Arg5)
ablnParameter(6) = CBool(Arg6)

For i = 1 To UBound(ablnParameter)
MyXOR_MB = ablnParameter(i)
If Not MyXOR_MB Then Exit Function
Next i
End Function

?MyXOR_MB(1 + 1 = 2, True, 3 + 3 = 6, 1 - 5 = -4) ' Wahr
?MyXOR_MB(True, True, True) ' Wahr
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Schwimmer
2004-11-08 08:32:00 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
wenn ich das richtig verstanden habe, soll die Function entsprechend
der UND-Funktion prüfen, ob alle Argumente WAHR sind?
Durch XOR werden aber zwei True-Werte als False ausgewertet.
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn
zusammenzubasteln, sollte es ja auf die gleiche Art und Weise
Post by Michael Schwimmer
Ob das folgende Beispiel besonders sinnvoll ist, sei dahingestellt,
so ähnlich müsstest du aber vorgehen.
Ich persönlich kenne für XOR, wenn es nicht gerade um Bitoperationen
geht, auch keine vernünftige Anwendungsmöglichkeit!
Post by Melanie Breden
Warum die Function nicht mit optionalen Boolean Parametern mit dem
Defaultwert 'True' deklarieren?
Das Problem ist, dass du dann nicht erkennen kannst, ob etwas übergeben
wurde. Man kann ja Wahr oder Falsch übergeben.
IsMissing 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.

MfG
Michael
Melanie Breden
2004-11-08 08:46:43 UTC
Permalink
Hallo Michael,
Post by Michael Schwimmer
Post by Melanie Breden
wenn ich das richtig verstanden habe, soll die Function entsprechend
der UND-Funktion prüfen, ob alle Argumente WAHR sind?
Durch XOR werden aber zwei True-Werte als False ausgewertet.
Falls man nun auf die Idee kommt, sich zB eine XOR-Fktn
zusammenzubasteln, sollte es ja auf die gleiche Art und Weise
Post by Michael Schwimmer
Ob das folgende Beispiel besonders sinnvoll ist, sei dahingestellt,
so ähnlich müsstest du aber vorgehen.
das habe ich auch so verstanden :-)
Post by Michael Schwimmer
Ich persönlich kenne für XOR, wenn es nicht gerade um Bitoperationen
geht, auch keine vernünftige Anwendungsmöglichkeit!
Ich habe sie bisher auch noch nicht einsetzen können.
Post by Michael Schwimmer
Post by Melanie Breden
Warum die Function nicht mit optionalen Boolean Parametern mit dem
Defaultwert 'True' deklarieren?
Das Problem ist, dass du dann nicht erkennen kannst, ob etwas übergeben
wurde. Man kann ja Wahr oder Falsch übergeben.
IsMissing 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.
ja, das ist mir klar, deswegen ja die Überlegung den Defaultwert auf True zu setzen,
dann ist es egal, ob die Parameter übergeben wurden oder nicht.

Wenn er angegeben wurde, wird ja der Defaultwert mit dem übergegeben Wert überschrieben.
Somit entfällt die IsMissing-Prüfung.

Meine Frage an dich ging generell dahin, ob diese Art der Parameterübergabe und Prüfung sinnvoll ist.
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Schwimmer
2004-11-08 09:37:48 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
Post by Michael Schwimmer
Das Problem ist, dass du dann nicht erkennen kannst, ob etwas
übergeben wurde. Man kann ja Wahr oder Falsch übergeben.
IsMissing 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.
ja, das ist mir klar, deswegen ja die Überlegung den Defaultwert auf
True zu setzen, dann ist es egal, ob die Parameter übergeben wurden
oder nicht.
Das 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?
Wenn 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.
Post by Melanie Breden
Wenn er angegeben wurde, wird ja der Defaultwert mit dem übergegeben
Wert überschrieben. Somit entfällt die IsMissing-Prüfung.
Meine Frage an dich ging generell dahin, ob diese Art der
Parameterübergabe und Prüfung sinnvoll ist.
Wenn man einen Defaultwert benutzen kann, sollte man das unbedingt auch
machen, damit lassen sich dann auch typensichere Parameter deklarieren.
Und richtig, dann erübrigt sich auch IsMissing.

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Melanie Breden
2004-11-08 09:53:56 UTC
Permalink
Hallo Michael,
Post by Michael Schwimmer
Post by Melanie Breden
ja, das ist mir klar, deswegen ja die Überlegung den Defaultwert auf
True zu setzen, dann ist es egal, ob die Parameter übergeben wurden
oder nicht.
Das 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
Post by Michael Schwimmer
Wenn 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.
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Ralf Schollmeyer
2004-11-08 13:15:22 UTC
Permalink
Also Beispiele gibts schon: zB könnte man einen langen String etwas
komprimieren bzw verschlüsseln aber das gehört mehr ins VB als zur
Excelfunktion.
Vielleicht könnte man sich soetwas vorstellen, dass zwei Systeme vorhanden
sind die sich gegenseitig einschalten sollen. Ist das eine aktiv so soll
auch das zweite aktiv sein. Also benötige ich eine Aktivität, die auf 0 und
1 oder 1 und 0 reagiert.
Post by Melanie Breden
Hallo Michael,
Post by Michael Schwimmer
Post by Melanie Breden
ja, das ist mir klar, deswegen ja die Überlegung den Defaultwert auf
True zu setzen, dann ist es egal, ob die Parameter übergeben wurden
oder nicht.
Das 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,
Post by Melanie Breden
For i = 1 To UBound(ablnParameter)
My_OR_MB = ablnParameter(i)
If My_OR_MB Then Exit Function
Next i
Post by Michael Schwimmer
Wenn 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.
--
Mit freundlichen Grüssen
Melanie Breden
- Microsoft MVP für Excel -
http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Zimmermann
2004-11-08 13:22:03 UTC
Permalink
Hallo!
[Zweistelliges Xor n-stellig erweitern]
... jetzt fehlt mir nur noch ein sinnvolles Beispiel für
die Verwendung von XOR.
Wenn wir den binären Bereich mal ausklammern und nur die
rein logische Verwendung betrachten:

Der Sinn ist der gleiche, wie bei allen Logik-Operatoren:
die Programmsteuerung in Abhängigkeit von Bedingungen.

Genauso, wie Du ggf.
If a and b Then ...
oder
If a or b then ...
benutzt, kannst Du ja einen Fall haben, wo
If a Xor b Then ...
sachgerecht ist. (Z. B. um ein umgangssprachliches Entweder
... oder nachzustellen.)

Das Verhalten von a xor b ließe sich natürlich auch durch
(a or b) and not (a and b) oder
(a or b) and (not a or not b) umschreiben.

Wenn man deswegen den Sinn von Xor in Frage stellt,
wird natürlich auch z. B. And überflüssig, wegen
a And b = Not(Not a Or Not b) [DeMorgan und Doppelnegation]

Was die n-stellige Erweiterung betrifft:

Damit eine solche überhaupt sinnvoll möglich ist, muß
ein Operator assoziativ und kommutativ sein.

Das ist bei Xor durchaus der Fall. Das Ergebnis davon
entspricht aber keineswegs dem, was man von einem
umgangssprachlichen Entweder a oder b oder c erwarten
würde.

Ein "weiches" mehrwertiges Entweder ... oder, das nur
verbietet, daß gar nichts oder alles zutrifft, wäre wie
folgt zu konstruieren:

(a or b or c or d)
and not (a and b and c and d)

Ein "hartes" mehrwertiges Entweder ... oder, das
vorschreibt, daß höchstens einer zutrifft, sähe so
aus:

(a or b or c or d)
and not (a and b)
and not (a and c)

and not (a and d)

and not (b and c)

and not (b and d)

and not (c and d)

Das aus Xor erweiterte a Xor b Xor c entspricht im
Verhalten allerdings keiner dieser beiden Möglichkeiten.

Im zweiwertigen Fall fallen diese Varianten alle zusammen,
so daß man hier von der Problematik nichts bemerkt.

Gruß aus Mainz
Michael
Michael Schwimmer
2004-11-08 14:06:31 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
Post by Michael Schwimmer
Das 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 Breden
Post by Michael Schwimmer
Wenn 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 Breden
IsMissing 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
Loading...