[VBA] Was stimmt mit dem Vergleich nicht?

Spike S.

Commander
🎅Rätsel-Elite ’24
Registriert
Feb. 2012
Beiträge
2.252
Hallo,

ich bin dieser Tage über eine Kuriosität in Excel 2010 gestolpert. Und zwar vergleiche ich Daten, ob eines später ist als das andere. Und es ist unerheblich, ob man den Datentyp Date, Double oder Decimal vergleicht.
Dieser Vergleich liefert ein falsches Ergebnis (in den geschachtelten Funktionsaufrufen wird auf workDateFrom 1 Stunde addiert, danach die Minuten und Sekunden abgezogen um auf die nächste voll Stunde zu kommen):
Code:
Public Sub test()
workDateFrom = CDate("02.02.2016 13:14:15")
dateTo = CDate("02.02.2016 14:00:00")

Debug.Print CDbl(dateTo) & " > " & CDbl(DateAdd("n", Minute(workDateFrom) * -1, DateAdd("s", Second(workDateFrom) * -1, DateAdd("h", 1, workDateFrom)))) & " ="
Debug.Print CDbl(dateTo) > CDbl(DateAdd("n", Minute(workDateFrom) * -1, DateAdd("s", Second(workDateFrom) * -1, DateAdd("h", 1, workDateFrom))))
End Sub

'Ausgabe:
'42402,5833333333 > 42402,5833333333 =
'Wahr

Wenn man es direkt schreibt, ist das Ergebnis des Vergleichs korrekt:
Code:
Public Sub test2()
workDateFrom = CDate("02.02.2016 14:00:00")
dateTo = CDate("02.02.2016 14:00:00")

Debug.Print CDbl(dateTo) & " > " & CDbl(workDateFrom) & " ="
Debug.Print CDbl(dateTo) > CDbl(workDateFrom)
End Sub

'Ausgabe:
'42402,5833333333 > 42402,5833333333 =
'Falsch

Habe das Problem mit DateDiff gelöst, mich würde nur mal interessieren, was beim ersten Vergleich falsch ist (oder mir nicht bewusst ist). Kann jemand das Rätsel lösen? Eventuell auch mit einer anderen Excel Version als 2010 probieren?

Danke und Gruß
Spike S.
 
Ok sowas in der Richtung hatte ich mittlerweile befürchtet. Wenn ich beide Seiten des Vergleichs per CDec statt CDbl typecaste, dann kommt bei dem Vergleich das erwartete Ergebnis.
Was ich aber nicht verstehe ist, der Unterschied den der Vergleich da findet (bei der Variante mit CDbl). Beide Seiten des Vergleichs laufen durch die gleiche Typecasting Funktion, warum sind die Ergebnisse nicht gleichwertig? Ich gehe zumindest davon aus, das beim Typecasting hart auf die dem Datentyp entsprechende Speichergröße abgeschnitten wird. Dann dürfte das ja wohl nicht passieren...die ersten 10 Nachkommastellen sind ja schon mal identisch, was man bei der Ausgabe sieht.

Und noch eine Frage, ist Decimal in den Nachkommastellen nicht genauer als Double? Deshalb hatte ich das Typecasting in Double überhaupt machen wollen, damit nicht irgendwo ganz weit hinten eine minimalste Abweichung eine Rolle spielt.
 
Zurück
Oben