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.
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!)