Doch jetzt wird es kompliziert. Die Zeitreihe muss die Sommerzeit- und die Winterzeitumstellung mitberücksichtigen.
Sommerzeitumstellung ist immer der letzte Sonntag im März. Für die Ermittlung des letzten Sonntag im März habe ich folgende Formel definiert =DATUM(A1;4;0)-WOCHENTAG(DATUM(A1;4;0))+1
- hier wird die Stunde 02:00 übersprungen. Folglich würde es wie folgt aussehen:
Winterzeitumstellung ist immer der letzte Sonntag im Oktober. Für die Ermittlung des letzten Sonntag im Oktober habe ich folgende Formel definiert =DATUM(A1;11;0)-WOCHENTAG(DATUM(A1;11;0))+1
- hier wird die Stunde 02:00 doppelt gezählt. Folglich würde es wie folgt aussehen:
... hier wäre mal ein VBA-Code. Baut auch auf SEQUENZ und die Datumsberechnung auf. Match sollte dafür sorgen, dass die Zeit keine Rolle spielt.
Code:
Option Explicit Option Private Module
Sub Makro1() Dim iCol%, DayOfYear% 'Anzahl Tage ermitteln DayOfYear = DateValue([a1] + 1 & "/1/1") - DateValue([a1] & "/1/1") 'Eintrag ab aktiver Zelle - Bitte in dieser Version in Zeile 1 With ActiveCell 'Spalte in Variable uebernehmen iCol = .Column 'Sequenz-Formel eintragen .Formula2 = "=SEQUENCE(" & DayOfYear & "*24,,0,1/24)+DATE($A$1,1,1)" 'Formel durch Werte ersetzen .Resize(DayOfYear * 24).Value = .Resize(DayOfYear * 24).Value End With
'Sommerzeit feststellen und Daten eine Zeile nach oben kopieren und einfuegen With Cells(Application.Match(CLng(Sommerzeit([a1])), Columns(iCol), 1), iCol) Range(.Offset(4, 0), Cells(DayOfYear * 24, iCol)).Copy .Offset(3).PasteSpecial End With
'Winterzeit feststellen und Daten eine Zeile nach unten kopieren und einfuegen With Cells(Application.Match(CLng(Winterzeit([a1])), Columns(iCol), 1), iCol) Range(.Offset(3, 0), Cells(DayOfYear * 24, iCol)).Copy .Offset(4).PasteSpecial End With
Public Function Sommerzeit(Optional ByVal Jahr As Long = -1) Dim D As Date If Jahr < 0 Then Jahr = Year(Date) Sommerzeit = Null If Jahr >= 1980 Then D = DateSerial(Jahr, 4, 1) Sommerzeit = DateValue(DateAdd("d", -DatePart("w", D, vbMonday), D)) End If End Function
Public Function Winterzeit(Optional ByVal Jahr As Long = -1) Dim D As Date Winterzeit = Null If Jahr < 0 Then Jahr = Year(Date) If Jahr >= 1980 Then D = DateSerial(Jahr, 11, 1) If Jahr <= 1995 Then D = DateSerial(Jahr, 10, 1) Winterzeit = DateAdd("d", -DatePart("w", D, vbMonday), D) End If End Function
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:1 Nutzer sagt Danke an schauan für diesen Beitrag 28 • bigcuno
(05.09.2025, 22:44)slowboarder schrieb: wäre es nicht einfacher, ein RUNDEN um die Datums+Zeitberechnung zu stellen?
Hallo Daniel,
Klares ja. Allerdings ist die Frage ob das überhaupt relevant ist. Um den "Fehler" zu sehen muss man schon die tausendstel der Sekunde sichtbar machen.
Die viel relevantere Frage ist wozu das überhaupt gut sein soll, ich habe das in über 30 Jahren noch nie gebraucht... Aber man lernt ja bekanntermaßen nie aus.
Zitat:wäre es nicht einfacher, ein RUNDEN um die Datums+Zeitberechnung zu stellen?
in der beiliegenden Datei habe ich in den Zellen C2, F2 und G3 drei Formeln eingefügt, die die internen Verhältnisse verdeutlichen sollen.
Dabei ist in C2 die Formel, die ich schon hatte, ergänzt um die Zeitart in Spalte D und um eine bedingte Formatierung (roter Trennstrich zwischen den Zeitarten) für Spalte C+D. Die Werte in Spalte C und F sind identisch, nur eben anders formatiert, während in Spalte G die Differenzen zwischen den Zeilen von Spalte F (bzw. Spalte C) enthalten sind.
Wie man sieht, entstehen keine Rundungsdifferenzen, wenn man die Uhrzeiten vergleicht bei Verwendung von
Das bleibt das ganze Jahr über so erhalten und es kommt nicht zu unschönen Differenzen für zB. 0 Uhr mit ...,9999973.. oder so ähnlich gegen Ende des Jahres, wenn man mit SEQUENZ((Nxt-Anf)*24;1; 0; ZEIT(1;0;0)) arbeitet.
Gruß Anton.
Windows 10 64bit Office365 32bit
Folgende(r) 1 Nutzer sagt Danke an EA1950 für diesen Beitrag:1 Nutzer sagt Danke an EA1950 für diesen Beitrag 28 • bigcuno