|
Die Kalenderwoche zu einem Datum liefert Ihnen die Visual
Basic-Funktion DatePart
mit der Intervall-Angabe "ww". In den
optionalen Parametern FirstDayOfWeek und FirstWeekOfYear können Sie
dazu entweder angeben, dass die aktuellen Ländereinstellungen des
Systems berücksichtigt werden sollen, oder aber die Einstellungen,
die Sie in diesen beiden Parametern ausdrücklich übergeben.
KalenderWoche = _
DatePart("ww", Datum, vbUseSystemDayOfWeek, vbUseSystem)
Wie aber sieht gewissermaßen die Umkehrung dieser Funktion aus,
wenn Sie etwa das Datum des Donnerstags in der 29.
Kalenderwoche ermitteln möchten? Leider bietet keine der
Datums-Funktionen in Visual Basic eine entsprechende Option
an. Die Aufgabe müssen wir selbst lösen.
Die Aufgabenstellung wird nicht nur durch die Berücksichtigung
der Ländereinstellungen des Systems etwas verkompliziert. Es sollte
nämlich auch wie bei der DatePart-Funktion möglich sein, die
Vorgabe des ersten Tags einer Woche und der Bestimmung der ersten
Kalenderwoche des betreffenden Jahres abweichend festzulegen. Dies
ist unbedingt notwendig, damit beispielsweise ein Treffen mit
Teilnehmern aus verschiedenen Ländern mit abweichenden Definitionen
des ersten Wochentages und/oder der ersten
Kalenderwoche im Jahr eindeutig terminiert werden kann.
Die Funktion WeekdayInWeek liefert das Datum zu einer beliebigen
Kalenderwoche in einem beliebigen Jahr. Sie müssen mindestens den
gewünschten Wochentag als einen der Konstantwerte der
VbDayOfWeek-Enumeration übergeben. Im optionalen Parameter Week
geben Sie die gewünschte Kalenderwoche an. Lassen Sie die Angabe
weg, wird die aktuelle Kalenderwoche verwendet. Ebenso übergeben
Sie in Year das gewünschte Jahr, oder es wird das aktuelle
Kalenderjahr verwendet. In den optionalen Parametern FirstDayOfWeek
und FirstWeekOfYear können Sie von den aktuellen
Ländereinstellungen des Systems abweichende Einstellungen
vornehmen. Voreingestellt sind jeweils die Systemwerte.
Public Function WeekdayInWeek(ByVal Weekday As VbDayOfWeek, _
Optional ByVal Week As Integer, Optional ByVal Year As Integer, _
Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek, _
Optional FirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem) _
As Date
Dim nWeek As Integer
Dim nYear As Integer
Dim nFirstJan As Date
Dim nTestDate As Date
Dim nFirstDayOfWeek As Integer
If Week = 0 Then
nWeek = DatePart("ww", Now, FirstDayOfWeek, FirstWeekOfYear)
Else
nWeek = Week
End If
If Year = 0 Then
nYear = VBA.Year(Now)
Else
nYear = Year
End If
nFirstJan = DateSerial(nYear, 1, 1)
nTestDate = nFirstJan - VBA.Weekday(nFirstJan, FirstDayOfWeek) + 1
If FirstDayOfWeek = vbUseSystemDayOfWeek Then
nFirstDayOfWeek = VBA.Weekday(nTestDate, vbSunday)
Else
nFirstDayOfWeek = FirstDayOfWeek
End If
nTestDate = nTestDate + ((Weekday - nFirstDayOfWeek) + 7) Mod 7
If DatePart("ww", nFirstJan, FirstDayOfWeek, FirstWeekOfYear) = 1 _
Then
WeekdayInWeek = DateAdd("ww", Week - 1, nTestDate)
Else
WeekdayInWeek = DateAdd("ww", Week, nTestDate)
End If
End Function
|