|
Wie viele Wochen hat ein Jahr? Rein rechnerisch ist das natürlich ganz einfach zu ermitteln - ein Jahr mit 365 Tagen hat 52,1428571... Wochen, ein Schaltjahr hat 52,2857142... Wochen. Interessanter ist jedoch die Antwort auf die Frage nach der Anzahl der Kalenderwochen, die sich aus der üblichen Nummerierung der Wochen eines Jahres ergibt. Und diese Zahl wechselt zwischen 52 und 53, je nach dem, auf welchen Wochentag der 1. Januar oder der 31. Dezember eines gegebenen Jahres fallen - zumindest gilt dies für Deutschland und die meisten Ländern Europas. Die Regel lautet nach ISO 8601, dass die erste Kalenderwoche diejenige ist, die mindestens 4 Tage des neuen Jahres enthält - der 1. Januar muss also auf einen Montag, Dienstag, Mittwoch oder Donnerstag fallen.
Bevor Sie jetzt jedoch anfangen, mit den Tagen um eine Jahreswende herum zu rechnen, können Sie die Funktion DatePart verwenden, die zu einem gegebenen Datum bei Angabe von "ww" als Intervall die korrekte Kalenderwoche zurückgibt. Lediglich den 31. Dezember eines gegebenen Jahres zu verwenden, würde jedoch nicht funktionieren, da die letzten Tage eines Jahres ja schon zur ersten Kalenderwoche des Folgejahres gehören können. Sie müssen also gegebenenfalls noch so lange rückwärts im Jahr zu gehen, bis sich eine Wochenzahl größer als 1 ergibt.
Doch auch dieses Verfahren hat noch eine Tücke. Ein Bug in der DatePart-Funktion (die Format-Funktion ist übrigens auch betroffen) lässt diese die Wochenzahl 53 für den 29.12. ausgeben, wenn dieser auf einen Montag fällt - eigentlich müsste es die 1. Kalenderwoche des Folgejahres sein.
Die folgende Funktion WeeksOfYear berücksichtigt diesen Bug und ermittelt die Anzahl der Kalenderwochen eines Jahres entweder zu einem optional zu übergebenden Datum oder einer Jahreszahl. Dazu können Sie die Festlegung des ersten Wochentages als auch der ersten Kalenderwoche als optionale Parameter übergeben - voreingestellt sind die Systemeinstellungen.
Public Function WeeksInYear(Optional ByVal TestDate As Variant, _
Optional ByVal TestYear As Variant, _
Optional ByVal FirstDayOfWeek As VbDayOfWeek _
= vbUseSystemDayOfWeek, _
Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear _
= vbUseSystem) As Integer
Dim nYear As Integer
Dim nDate As Date
Dim nWeek As Integer
Dim nWeekday As Integer
If IsMissing(TestDate) Then
If IsMissing(TestYear) Then
'Error
Else
nYear = TestYear
End If
Else
nYear = Year(TestDate)
End If
nDate = DateSerial(nYear, 12, 31)
Do
nWeek = DatePart("ww", nDate, FirstDayOfWeek, FirstWeekOfYear)
Select Case nWeek
Case 1
nDate = nDate - 1
Case 53
If DatePart("ww", nDate + 7, _
FirstDayOfWeek, FirstWeekOfYear) = 2 Then
WeeksInYear = 52
Else
WeeksInYear = 53
End If
Exit Function
Case 52
WeeksInYear = 52
Exit Function
End Select
Loop
End Function
|