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 diese 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.

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 …

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.