Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
836to840
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
836to840
836to840
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Xor vs. If

Xor vs. If
12.01.2007 22:30:11
Ingo
Hallo allerseits,
ich versuche gerade ein paar Tips zur Vermeidung von Schleifen umzusetzen.
Am Nachfolgenden Beispiel habe ich einmal meine
bisherige Variante mit Schleifen
(Abfrage ob ein Datum ein Feiertag ist) verwendet. Dabei wurden bekannte Typ-Unverträglichkeiten ausgeklammert/vermieden.
In der zweiten Variante mit Xor bin ich etwas "brutaler" mit resume next
an die Sache herangegangen.
Verschachtelte If habe ich noch jede Menge. Wäre das Prinzip der 2. Variante
tatsächlich die bessere, schnellere Wahl ?
Über eine Meinung oder Anregung würde ich mich sehr freuen.
Gruß, Ingo
'Überprüfen ob Feiertag
For y = 1 To UBound(Arr_Feiertage, 1)
If Arr_Feiertage(y, 2) = "Ostersonntag" Then
If CDate(.Name) + i_tag - 1 = _
CDate(Ostersonntag(Year(.Name)) + Arr_Feiertage(y, 3)) Then
Feiertag = True
End If
End If
If Arr_Feiertage(y, 2) "Ostersonntag" Then
If CDate(.Name) + i_tag - 1 = _
CDate(Arr_Feiertage(y, 2) & Year(.Name)) Then
Feiertag = True
End If
End If
Next y
2. Variante
For y = 1 To UBound(Arr_Feiertage, 1)
On Error Resume Next
Feiertag = _
CDate(.Name) + i_tag - 1 = _
CDate(Ostersonntag(Year(.Name)) + Arr_Feiertage(y, 3)) Xor _
CDate(.Name) + i_tag - 1 = _
CDate(Arr_Feiertage(y, 2) & Year(.Name))
If Feiertag = True Then Exit For
Next y

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Xor vs. If
12.01.2007 22:44:10
Urs
Hi,
sehe ich auch so.
Urs
AW: Xor vs. If - oder doch Or ?
12.01.2007 22:57:10
Erich
Hallo Ingo,
warum eigentlich Xor und nicht Or?
Wenn es um Geschwindigkeit geht, sollte man nicht unnötig eine Berechnung mehrfach durchführen.
Hier ist das "Ostersonntag(Year(.Name))" und "CDate(.Name) + i_tag - 1".
Ich würde es so machen:
datName = CDate(.Name) + i_tag - 1
datOstern = Ostersonntag(Year(.Name))
For y = 1 To UBound(Arr_Feiertage, 1)
On Error Resume Next
If datName = CDate(datOstern + Arr_Feiertage(y, 3)) Or _
datName = CDate(Arr_Feiertage(y, 2) & Year(.Name)) Then _
Feiertag = True: Exit For
Next y
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Xor vs. If - oder doch Or ? - Ergänzung
12.01.2007 23:02:52
Erich
Hallo Ingo,
das "On Error Resume Next" gehört natürlich auch nicht in die Schleife.
Der Fall, dass CDate(.Name) nicht funzt, sollte vor der Schleife abgefangen werden,
so dass die Schleife gar nicht erst anläuft.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Xor vs. If - oder doch Or ? - Ergänzung
13.01.2007 00:15:40
Ingo
Hallo Erich,
danke für die hilfreiche Unterstützung.
"warum eigentlich Xor und nicht Or?"
Weil ich damit auch ohne if das Ergebnis true oder false abfragen kann.
Und ich gehe davon aus, dass jedes if die Ausführung verlangsamt ?
Die Mehrfachberechnung der Datumswerte war natürlich völliger Blödsinn.
Das habe ich ja noch etliche male gefunden -
ohne Nachdenken das Funktionierende kopiert ;-)
"Der Fall, dass CDate(.Name) nicht funzt, sollte vor der Schleife abgefangen werden,"
Dann komme ich aber langsam wieder in Richtung meiner ersten Variante ?
Ich muß mal sehen, ob ich nicht eher die Function zur Feiertagsberechnung
etwas umstricke.
Gleichwohl, für mich war das eine erfolgreiche Forumsanfrage ;-)
Danke, Gruß und gute Nacht
Ingo
Anzeige
AW: Xor vs. If - oder doch Or ? - Ergänzung
13.01.2007 07:34:34
Erich
Hallo Ingo,
""warum eigentlich Xor und nicht Or?"
Weil ich damit auch ohne if das Ergebnis true oder false abfragen kann."
Das habe ich nicht verstanden. Or und Xor tun doch prinzipiell das Gleiche, mit dem kleinen Unterschied,
dass Xor ein False liefert, wenn die beiden verknüpften Aussagen wahr sind. Or liefert dann True.
Wenn du in einer Tabelle die Spalten A bis D wie hier ausfüllst und dann die Prozedur laufen lässt,
siehst du das:
 ABCDEFGH
1ABCDA>BC>DA>B Or C>DA>B Xor C>D
2221221FALSCHFALSCHFALSCHFALSCH
3221122FALSCHWAHRWAHRWAHR
4122221WAHRFALSCHWAHRWAHR
5122122WAHRWAHRWAHRFALSCH

Hier die Prozedur:
Sub Or_Xor()
Dim zz As Long
For zz = 2 To 5
Cells(zz, 5) = Cells(zz, 1) < Cells(zz, 2)
Cells(zz, 6) = Cells(zz, 3) < Cells(zz, 4)
Cells(zz, 7) = Cells(zz, 1) < Cells(zz, 2) Or Cells(zz, 3) < Cells(zz, 4)
Cells(zz, 8) = Cells(zz, 1) < Cells(zz, 2) Xor Cells(zz, 3) < Cells(zz, 4)
Next zz
End Sub
Bezogen auf deinen Code stellt sich die Frage, ob ein Tag wirklich kein Feiertag sein soll, wenn
CDate(Ostersonntag(Year(.Name)) + Arr_Feiertage(y, 3))
und
CDate(.Name) + i_tag - 1 = CDate(Arr_Feiertage(y, 2) & Year(.Name))
beide wahr sind. (Bei Xor kommt dann False raus.)
Noch eine Bemerkung zu "If Feiertag = True Then Exit For":
Feiertag ist True oder False.
Damit steht da
"If True = True Then Exit For" oder "If False = True Then Exit For"
Das geht einfacher und kürzer mit "If Feiertag Then Exit For"
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Xor vs. If - oder doch Or ? - Ergänzung
13.01.2007 09:06:35
Ingo
Guten Morgen Erich,
nach einer Mütze voll Schlaf muß ich sagen, dass Du recht hast.
(Hattest Du natürlich auch gestern schon,
aber da war ich zu erledigt, um das zu sehen)
Offensichtlich habe ich bei Xor einige Beiträge aus der Recherche
nicht richtig umgesetzt.
Mein Berechnungsergebnis war zufällig bislang auch mit Xor richtig.
Entweder ist der Tag kein Feiertag oder er ist es eben doch -
allerdings wäre das am 1.5.08 (glaube ich..) in die Hose gegangen.
Dann fällt ein
beweglicher Feiertag (Himmelfahrt)
CDate(Ostersonntag(Year(.Name)) + Arr_Feiertage(y, 3))
auf einen festen Feiertag (1.Mai)
CDate(Arr_Feiertage(y, 2) & Year(.Name))
Wenn Xor falsch ausgibt, wenn beide Bedingungen wahr sind, wäre
das dann kein Feiertag. Böse Falle ;-)
"If Feiertag Then Exit For"
...auch richtig. Diese dusseligen If ...= true Überprüfungen sitzen mir
so im Blut, da muß ich noch an mir arbeiten, um mir das abzugewöhnen.
Noch einmal vielen Dank.
Hilft mir alles sehr.
Gruß, Ingo
Anzeige
Danke für Rückmeldung ...
13.01.2007 09:32:34
Erich
Hallo Ingo,
... und noch eine kleine Bemerkung:
If xyz = True ... passiert mir auch öfter...
Schönes Wochenende und Grüße von Erich aus Kamp-Lintfort

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige