|
Sie möchten gerne das Datum beispielsweise vom vergangenen Dienstag ermitteln? Oder das Datum vom vergangenen Dienstag vor einer Woche, vor zwei Wochen oder noch weitere Wochen zurück liegend? Oder den letzten Dienstag vor einem beliebigen gegebenen Datum?
Ermitteln sie dazu einfach die Differenz der Wochentags-Nummern (Konstanten-Enumeration vbDayOfWeek) und ziehen sie sie von dem gegebenen Datum ab. Damit die Differenz nicht kleiner als Null wird, addieren sie vorher 7 (eine volle Woche) und reduzieren Sie den Bereich anschließend mit einer Modulo-Division durch 7 wieder auf eine Woche. Sollte die Differenz Null betragen, könnten Sie entscheiden, ob damit der gleiche Tag wie das gegebene Datum gemeint sein soll, oder ob tatsächlich der vorhergehende gleiche Wochentag gemeint ist. Entsprechend der Aufgabenstellung sollte sich aber eine solche Entscheidung erübrigen - setzen Sie also in diesem Fall die Differenz wieder auf eine volle Woche, also 7, herauf. Um die im Wochenabstand weiter zurück liegenden entsprechenden Wochentage zu erhalten, addieren Sie die entsprechende Wochenzahl mit 7 multipliziert. Den so ermittelten Differenzwert subtrahieren Sie nun einfach vom gegebenen Datumswert und erhalten so das gesuchte Datum.
Die Funktion RecentWeekday fasst diese Berechnungen zusammen. Die Anzahl der zurück liegenden Wochen können Sie optional im Parameter WeeksBack übergeben. Im optionalen Parameter NoTime geben Sie an, ob ein eventuell vorhandener Zeit-Anteil des übergebenen Ausgangsdatums erhalten bleiben soll oder nicht (Voreinstellung ist True - der Zeit-Anteil wird abgeschnitten).
Public Function RecentWeekday(ByVal GivenDate As Date, _
ByVal WkDay As VbDayOfWeek, _
Optional ByVal WeeksBack As Integer, _
Optional ByVal NoTime As Boolean = True) As Date
Dim nDiff As Integer
If NoTime Then
GivenDate = CDate(CLng(CDbl(GivenDate)))
End If
nDiff = (Weekday(GivenDate) - WkDay + 7) Mod 7
If nDiff = 0 Then
nDiff = 7
End If
RecentWeekday = GivenDate - (nDiff - (WeeksBack * 7))
End Function
|