Kalenderwoche nach ISO bzw. DIN

In Excelversionen ab 2007 ist es ja recht einfach, die Kalenderwoche nach ISO 8601 bzw. DIN EN 28601 (1993) zu berechnen: =KALENDERWOCHE(Datum; 21) und das Ergebnis stimmt. In VBA lässt sich mittels WorksheetFunction.WeekNum(Datum, 21) ein korrektes Ergebnis berechnen.

Anders sieht das aber bei den Versionen bis 2003 aus. Da gibt es noch nicht die “21” als Übergabeparameter. Dadurch kann durchaus ein fehlerhaftes Ergebnis ausgegeben werden. Als Excel-Formel bietet sich solch eine Lösung an, wenn in A1 das Datum steht:
=KÜRZEN((A1-DATUM(JAHR(A1+3-REST(A1-2; 7)); 1; REST(A1-2; 7)-9))/7)
Quelle: Excelformeln).

Eine Lösung per VBA gibt es natürlich auch. Sogar diverse Möglichkeiten. Mir gefällt gefiel diese (bis heute) am besten:

Function KW_ISO(Datum)
   KW_ISO = DatePart("ww", Datum, vbMonday, vbFirstFourDays)
   'oder in (nicht besser lesbarer) Kurzform
   'KW_ISO = DatePart("ww", Datum, 2, 2)
End Function

Das Argument Datum muss ein kalendarisches Datum sein oder in irgend einer Form in ein solches umgewandelt werden können. Die Rückgabe ist der numerische Wert der Kalenderwoche.

Hinweis: Ein achtsamer Tüftler und Leser dieses Forums hat festgestellt, dass die vorgenannte UDF KW_ISO(Datum) in bestimmten Fällen und für mich bislang nicht nachvollziehbaren Gründen falsche Ergebnisse “produziert”.  Danke Jörg! (Der volle Name und die E-Mail liegen mir vor.) Ich habe die kalendarischen Daten vom 01.03.1900 (der Tag nach dem nur in Windows-Excel existierenden 29.02.1900) bis heute (14.01.2021) mit einer kleinen von Jörg erstellten VBA-Prozedur gecheckt und folgende kalendarische Daten sind sind in Sachen DIN-Kalenderwoche falsch berechnet worden:

Datum seriell Differenz
30.12.1907 2921  
29.12.1919 7303 4382
31.12.1923 8766 1463
30.12.1935 13148 4382
29.12.1947 17530 4382
31.12.1951 18993 1463
30.12.1963 23375 4382
29.12.1975 27757 4382
31.12.1979 29220 1463
30.12.1991 33602 4382
29.12.2003 37984 4382
31.12.2007 39447 1463
30.12.2019 43829 4382

Ich habe zusätzlich zu den kalendarischen Werten noch die dazu passende serielle Zahl in di zweite Spalte geschrieben und die Differenz in Tagen in der dritten Spalte berechnen lassen. So ist eine gewisse Rhythmik erkennbar, welche ich aber derzeit nicht analysieren kann.

Für mich ist diese UDF wegen der nicgt durchgängig korrekten Ergebnisse nicht einsetzbar, auch wenn es nur 3,178 Promille Falschergebnisse sind. Ich halte es da wie beim Autofahren: nur 0,00‰ sind okay und über 3,1 ‰ können tödlich sein. 💡  – Ich habe eben noch einmal in der Microsoft-Hilfe zur Funktion DatePart() nachgesehen und festgestellt, dass MS diesen Fehler auch schon erkannt hat und direkt zu Beginn eine entsprechende Warnung eingefügt hat  – Mein Tipp: Diese Funktion und entsprechend auch die von mir vorgestellte UDF nicht verwenden. Alternativ könnte über eine WENN()-Funktion der Ergebniswert bei den betroffenen kalendarischen Daten (siehe Tabelle oben) der Rückgabewert angepasst werden.

Alternativ mit Jahreszahl

Soll die Funktion optional eine Jahreszahl mit ausgeben, dann wird beispielsweise solch ein Code eher hilfreich sein:

 Function KW_ISO(Datum, Optional Jahr As Boolean = False)
   Dim Rc As Variant, J As Integer
   
   Rc = DatePart("ww", Datum, vbMonday, vbFirstFourDays)
   'Alternativ immer 2 - stellig:
   'Rc = Format(DatePart("ww", Datum, vbMonday, vbFirstFourDays), "00")
   J = Year(Datum)
   If Jahr Then
      If Month(Datum) = 1 And Rc > 10 Then J = J - 1
      Rc = Rc & "/" & J
   End If
   KW_ISO = Rc
End Function

Sie können als zweites Argument entweder 0 bzw. 1 eingeben, was einem FALSCH bzw. WAHR entspricht. 0, FALSCH oder keine Angabe sorgen dafür, dass keine Jahreszahl ausgegeben wird, bei 1 oder WAHR wird die Jahreszahl des zur KW passenden Jahres ausgegeben. Das würde beispielsweise am 1. Januar 2017 bedeuten: 52/2016, weil es die 52. KW des Jahres 2016 ist, in welcher der erste Tag des Datums liegt. Die Rückgabe ist naturgemäß ein String / Text.

Falls Sie Hilfe bein Einbinden der Benutzerdefinierten Funktion brauchen, schauen Sie einfach hier im Blog nach.

▲ nach oben …

Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?

Dann würde ich mich über einen Beitrag Ihrerseits z.B. 2,00  freuen … (← Klick mich!)

Dieser Beitrag wurde unter Code-Schnipsel, Datum und Zeit, Mit VBA/Makro, Ohne Makro/VBA, Tipps und Tricks veröffentlicht. Setze ein Lesezeichen auf den Permalink.