|
Die Visual Basic-Funktion DateDiff liefert Ihnen unter anderem auch die Differenz in Tagen zwischen zwei gegebenen Datumswerten. Wenn Sie allerdings nur die Zahl der Werktage in dem Zeitraum zwischen den Datumswerten ermitteln wollen, lässt sie diese an sich recht flexible Funktion im Stich.
Im Prinzip könnten Sie zwar die Anzahl der dazwischen liegenden Tage zunächst von DateDiff errechnen lassen und anschließend ebenso die Anzahl der Wochen. Für jede Woche könnten sie einen oder zwei Tage abziehen (je nach dem, ob Samstage als Werktage gelten sollen oder nicht). Allerdings ist es nicht ganz so einfach - vor allem die Ermittlung, ob in den verbleibenden Resttage, die keine ganze Woche ergeben, noch Nicht-Werktage enthalten sind und deswegen ebenfalls abgezogen werden müssen.
Der Ansatz ist allerdings im Prinzip richtig. Um das Ganze jedoch nicht unnötig zu verkomplizieren, treffen wir zunächst einige Annahmen und legen diese als Definitionen fest, die wir den zu ermittelnden Ergebnissen zugrunde legen.
Zunächst legen wir fest, dass wir auf die Zeitanteile der beiden Eck-Datumswerte verzichten wollen. Das erspart uns die Frage, ab welchem Stundenanteil ein Werktag noch oder schon als Werktag gewertet werden soll. Weiterhin beschränken wir uns darauf, nur eine positiv Differenz liefern zu wollen: Unabhängig davon, welcher von beiden gegebenen Datumswerten der kleinere ("ältere") und der größere ("jüngere") ist, wird immer der kleinere Wert als Anfangsdatum und der größere als Enddatum gesetzt. Diese Setzung erleichtert uns die schließlich letzte Definition, dass das Anfangsdatum gezählt wird, wenn es ein Werktag ist, das Enddatum jedoch nie gezählt wird. So beträgt etwa die Differenz zwischen einem Freitag und einem Samstag (wenn dieser kein Werktag sein soll) einen Werktag, und zwischen einem Freitag und einem Montag ebenso. Die Differenz zwischen einem Sonntag und einem Montag ergibt hingegen keinen Werktag.
Sie übergeben der Funktion DateDiffWorkdays die beiden Eckdatumswerte und legen im gegebenenfalls optionalen Parameter SaturdayIsWorkday mit der Übergabe von True fest, ob Samstage als Werktage gezählt werden sollen. Als Rückgabewert erhalten Sie gemäß den oben angeführten Festlegungen die Anzahl der Werktage. Die bei der VB-Funktion DateDiff optionale Angabe des ersten Wochentages und der Definition für die erste Woche eines Jahres erübrigt sich hier, da die Anzahl von Tagen zwischen zwei Datumswerten davon unberührt ist.
Public Function DateDiffWorkdays(Date1 As Date, Date2 As Date, _
Optional ByVal SaturdayIsWorkday As Boolean) As Integer
Dim nDay1 As Date
Dim nDay2 As Date
Dim nDays As Integer
Dim nWeeks As Integer
Dim nWeekday1 As Integer
Dim nWeekday2 As Integer
If Date1 < Date2 Then
nDay1 = CDate(CLng(CDbl(Date1)))
nDay2 = CDate(CLng(CDbl(Date2)))
Else
nDay1 = CDate(CLng(CDbl(Date2)))
nDay2 = CDate(CLng(CDbl(Date1)))
End If
nDays = nDay2 - nDay1
nWeeks = nDays \ 7
nWeekday1 = Weekday(nDay1, vbMonday)
nWeekday2 = Weekday(nDay2, vbMonday)
If SaturdayIsWorkday Then
nDays = nDays - nWeeks
Select Case nWeekday1
Case 7
Select Case nWeekday2
Case 7
Case Else
nDays = nDays - 1
End Select
Case Else
Select Case nWeekday2
Case 7
Case Else
If nWeekday1 > nWeekday2 Then
nDays = nDays - 1
End If
End Select
End Select
Else
nDays = nDays - 2 * nWeeks
Select Case nWeekday1
Case 6
Select Case nWeekday2
Case 7
nDays = nDays - 1
Case Else
nDays = nDays - 2
End Select
Case 7
Select Case nWeekday2
Case Is < 7
nDays = nDays - 1
End Select
Case Else
Select Case nWeekday2
Case 6
Case 7
nDays = nDays - 1
Case Else
If nWeekday1 > nWeekday2 Then
nDays = nDays - 2
End If
End Select
End Select
End If
DateDiffWorkdays = nDays
End Function
|