Anzahl Urlaubstage berechnen
Angenommen sie arbeiten in einer Personalabteilung. Bei Ihnen landen fast täglich Urlaubsanträge mit den Angaben Urlaubsbeginn, Urlaubsende, AnzahlTage. Soweit ja easy, aber leider sind über 10% der Anträge ohne die Angabe der Anzahl Urlaubstage. Sie holen den großen Kalender raus, zählen die Werktage, dann den zweiten Kalender mit den Feiertagen raus holen und prüfen ob ein Feiertag dazwischen liegt usw.
Die Lösung: Der Urlaubstage-Rechner.
Man sehe sich erst mal nachfolgenden VBA-Code an, der in einem Modul steht:
Public Function urlaubstage(Startdatum As Date, Enddatum As Date) As Long Dim i As Integer Dim tempDate As Date If Not IsDate(Startdatum) Or Not IsDate(Enddatum) Then MsgBox "Bitte gültiges Startdatum und Enddatum eingeben", vbExclamation + vbOKOnly Exit Function End If If DateDiff("d", Startdatum, Enddatum) < 0 Then MsgBox "Das Enddatum muss nach dem Startdatum liegen!", vbExclamation + vbOKOnly Exit Function End If For i = 0 To DateDiff("d", Startdatum, Enddatum) tempDate = DateAdd("d", i, Startdatum) If Weekday(tempDate) <> 1 And Weekday(tempDate) <> 7 Then 'tempDate ist kein Wochenende If Not istFeiertag(tempDate) Then 'tempDate ist kein Feiertag urlaubstage = urlaubstage + 1 End If End If Next i End Function
Zuerst wird Startdatum und Enddatum auf Plausibilität geprüft, dann wird in einer For Next Schleife vom Startdatum aus gehend pro Schleifendurchgang 1 Tag hinzugezählt (erster Schleifendurchgang = 0 Tage hinzuzählen) und geprüft ob dieser Tag weder Wochenende noch Feiertag ist. Wenn diese Bedingungen erfüllt sind wird die Variable urlaubstage um 1 hochgezählt.
Die Berechnung der Feiertage habe ich hier weggelassen, weil es auf www.dbwiki.de ein sehr gutes Beispiel dazu gibt.
Private Function istFeiertag(tDatum As Date) As Boolean 'Zur Berechnung der Feiertage empfehle ich das Beispiel auf www.dbwiki.de 'http://www.dbwiki.de/upload/AccSampleFeiertage.zip End Function
Zum ersten Testen verwende ich folgende Prozedur:
Sub urlaubstage_Test()
Dim Startdatum As Date, Enddatum As Date
Startdatum = CDate("15.6.2009")
Enddatum = CDate("2.7.2009")
MsgBox "zwischen dem " & Startdatum & " und dem " & Enddatum & " liegen " & urlaubstage(Startdatum, Enddatum) & " Urlaubstage"
End Sub
Ich überlasse es Ihnen das ganze schön in ein Formular einzukleiden wo man dann z.B. mittels DatePicker (siehe Artikel über Datepicker) das Startdatum und Enddatum auswählt.
AV 2009