Ja das Thema ist immer verwirrend.
Range("A1").NumberFormat = "m/d/yyyy" 'Format nach amerikanischen Standard
'(gilt als nicht-benutzerdef. Format
' und wird darum autom. anhand Länder-/Zeiteinstellung
' umgewandelt)
Range("A1").Value = CDate("27.01.1966") 'falsch
Range("A1").Value = DateSerial(1966, 1, 27) 'korrekt
Wie schon beschrieben ist CDate(<string-literal>) mit Vorsicht zu genießen. Bei deutscher BS-Konfig. geht das gut, bei US/UK dürfte diese Zeile sogar einen Laufzeitfehler produzieren, weil das Format - aus dessen Sicht - kein gültiges Datum darstellt (der Algorithmus dahinter erkennt beim parsen die Punkte nicht als gültige Trennzeichen an).
Es ist immer wichtig zu wissen, in welchem Format man ein Datum bekommt; aus Textdateien bekommt man diese ja als Text und muss es erst in den Date-Datentyp umwandeln.
Grüße
PS: Falls du eine Variable direkt in VBA mit einem Wert vorbelegen musst/willst, mach es wie oben gezeigt mit DateSerial, oder so:
dtm = #2021-02-24#
oder
dtm = #24-02-2021#
das Literal wird automatisch in VBA umgewandelt zu
dtm = #2/24/2021# 'm/d/yyyy - amerikanischer Standard
Wenn du jetzt per Einzelschritt oder per Haltepunkt nach dieser Zeile stehen bleibst, und mit dem Mauszeiger über den Variablen Namen gehst, wurst du das Datum als String formatiert im Tooltip sehen - und der richtet sich dann wieder nach der BS-Konfig.
Bedenke das der Computer absolut keine Ahnung hat was ein Datum ist; der Computer kennt nur zwei Zustände die gerne mit 0 und 1, False und True, oder sonstwie bezeichnet werden. Ein Datum existiert also nur in binärer Form und der Datentyp einer Variable beschreibt wie er zu interpretieren ist. Wenn du ein Datum irgendwo ausgibst, wird daraus immer ein String gebildet, und diese Umwandlung erfolgt anhand der BS-Konf.
|