AW: einzelne Tage innerhalb einer Zeitspanne zählen
11.09.2006 10:02:35
ingUR
Hallo, Uwe,
leider hast Du nicht eine Beispielform hochgelaladen in die man hätte hineinschreiben können. So habe ich eine eigene Userform erstellt, die neben den beiden Textboxen tbx0, tbx1 die sieben Chackboxen chkxMo, chkxDi,chkxMi, ... (So=1, Mo=2, ...) enthält, ein Label-Objekt für das Ergebnis sowie einen Commandbutton cbtnCalc zum Auslösen der Berechnung:
Option Explicit
Private Sub cbtnCalc_Click()
Dim t0 As Date, t1 As Date, nt As Long
Dim wday0 As Integer, wday1 As Integer
Dim anz As Long
t0 = CDate(tbx0.Value)
t1 = CDate(tbx1.Value)
wday0 = Weekday(t0)
wday1 = Weekday(t1)
nt = t1 - t0 + 1
If chkxSo.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 1)
If chkxMo.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 2)
If chkxDi.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 3)
If chkxMi.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 4)
If chkxDo.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 5)
If chkxFr.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 6)
If chkxSa.Value = True Then anz = anz + calcNDays(nt, wday0, wday1, 7)
lbAnzahl.Caption = anz
End Sub
Private Function calcNDays(nt As Long, wday0 As Integer, wday1 As Integer, wday As Integer) As Integer
Dim anz As Integer, n7 As Integer
'Anzahl der vollen Wochen im Zeitraum (So, Mo, ...Sa)
n7 = (nt - (7 - wday0 + 1) - wday1) / 7
anz = n7
'Tag in der Startwoche?
anz = anz + IIf(nt - 7 * n7 - wday1 < 8 - wday, 0, 1)
'Tag in der EndWoche
anz = anz + IIf(nt - 7 * n7 - (7 - wday0 + 1) <= wday1, 1, 0)
calcNDays = anz
End Function
Das wesentliche dürfte in der Funktion stecken. Die Anzahl der vollen Wochen innerhalb der Zeitspanne ist gleich der Anzahl der bezeichneten Wochentage in dieser Spanne.
Für die Anzahl der Tage der Restwoche, nt - 7 * n7 - (7 - wday0 + 1), ist leicht zu ermitteln, ob ein bestimmter Wochentag noch einmal dort auftaucht.
Anders bei der Startwoche. Hier habe ich die Numerierung der Tage in der Startwoche umgekehrt wird (TagNr.So' = 8-Tag.So(:=1) = 7, TagNr.Mo' = 8-Tag.Mo(:=2)=6, ...) um feststellen zu können, ob die Startwoche noch einen gesuchten Wochentag enthält.
Umfangreiche Test habe ich nicht durchgeführt, ich hoffe jedoch, Du kannst diesen Gedanken in Deinem Brogramm umsetzen.
Gruß,
Uwe