gewerkte dagen (2)

Status
Niet open voor verdere reacties.

Hvdl70

Gebruiker
Lid geworden
4 jan 2009
Berichten
36
Ik vond hier op het forum een functie dat enkele dagen geleden gepost werd, welke de gewerkte dagen moet berekenen tussen een willekeurige datum, ik veronderstel [datum] en vandaag. Kan de functie zodanig aangepast worden dat ze kan gebruikt worden in een rapport voor het berekenen van de gewerkte dagen tussen 2 opgegeven data (vastgelegd in de QRY voor opmaak van het rapport).
Mijn rapport berekent bv het aantal ziektedagen over de periode van 1/3/09 en 31/3/09 (zelf in te geven) en moet nu eveneens het aantal gewerkte dagen geven tussen die periode.
(In QRY : between [geef begindatum] and [geef einddatum])

Code:
Public Function WerkDagen(Datum As Date)

WerkDagen = Int((DateDiff("d", [Datum], Date)) / 7) * 5 + _
    IIf(Weekday([Datum], vbMonday) > 5, _
    Weekday(Date, vbMonday), _
    IIf(Weekday([Datum], vbMonday) > Weekday(Date, vbMonday), _
        5 - (Weekday([Datum], vbMonday) - Weekday(Date, vbMonday)), _
        (Weekday(Date, vbMonday) - Weekday([Datum], vbMonday)))) + 1

End Function

Wie helpt mij verder?

Thx - Hans :o
 
Laatst bewerkt door een moderator:
Herschrijf de tragere IIF naar de snellere en leesbaarder IF THEN ELSE ENDIF statement. Ik help je daarna wel verder. Maar waarschijnlijk kom je er zelf verder wel uit.

HTH:D
 
De oorspronkelijke functie was geschreven voor een query, en dan heb je IIF nu eenmaal nodig. Guus heeft uiteraard gelijk als hij stelt dat in een functie je beter met IF .. END IF kunt werken, al was het maar voor de leesbaarheid.
Derhalve hier de functie zoals ik hem nu gebruik:

Code:
Public Function WerkDagen(Datum1 As Date, Datum2 As Date)
Dim iDatum1 As Integer, iDatum2 As Integer, iDatumVerschil As Integer, iPlus As Integer

iDatum1 = Weekday(Datum1, vbMonday)
iDatum2 = Weekday(Datum2, vbMonday)

iDatumVerschil = Int((DateDiff("d", Datum1, Datum2)) / 7) * 5

If iDatum1 > 5 Then
    iPlus = iDatum2
Else
    If iDatum1 > iDatum2 Then
        iPlus = 5 - (iDatum1 - iDatum2)
    Else
        iPlus = iDatum2 - iDatum1
    End If
End If
iPlus = iPlus + 1
WerkDagen = iDatumVerschil + iPlus

End Function

De functie vraagt nu om twee datums; de tweede kan uiteraard de functie Date() zijn als je met de huidige dag wilt rekenen. In dat geval zou ik de regel iPlus=iPlus+1 deactiveren, om de telling zuiver te houden.

Michel
 
Laatst bewerkt:
Onderstaande functies gebruik ik om te berekenen hoeveel werkdagen er zijn verstreken tussen twee data. Er zit ook nog een stukje tussen dat rekening houdt met feestdagen. Die heb ik even afgevlagt. Als daar vraag naar is dan post ik die ook wel.
Code:
Public Function CalcWorkdays(StartDate As Date, EndDate As Date) As Double
'Datum doorgeven als "1-12-2008" en niet als #1-12-2008# de laatste wordt omgedraaid 12-1-2008

    Dim dblTotalDays As Double
    Dim intSaturdays As Integer
    Dim intSundays   As Integer
    Dim intHolidays  As Integer
    
    On Error GoTo Err_Execute
    
    CalcWorkdays = 0
        
    If IsDate(CDate(StartDate)) And IsDate(CDate(EndDate)) Then
        If EndDate <= StartDate Then
            CalcWorkdays = 0
        Else
            dblTotalDays = DateDiff("n", StartDate, EndDate) / 24 / 60
'            'Workdays is the elapsed days excluding Saturdays and Sundays
            CalcWorkdays = dblTotalDays - CalcNonWorkdays(StartDate, EndDate)
        End If
    End If
    Exit Function
Err_Execute:
    'If error occurs, return 0
    CalcWorkdays = 0
End Function

Public Function CalcNonWorkdays(StartDate As Date, EndDate As Date) As Double
'Datum doorgeven als "1-12-2008" en niet als #1-12-2008# de laatste wordt omgedraaid 12-1-2008

    Dim intSaturdays As Integer
    Dim intSundays   As Integer
    Dim intHolidays  As Integer
    
    On Error GoTo Err_Execute
    
    CalcNonWorkdays = 0
        
    If IsDate(CDate(StartDate)) And IsDate(CDate(EndDate)) Then
        If EndDate <= StartDate Then
            CalcNonWorkdays = 0
        Else
            intSaturdays = DateDiff("ww", StartDate - 1, EndDate, vbSaturday) 'hier wordt het aantal zaterdagen bepaald
            intSundays = DateDiff("ww", StartDate - 1, EndDate, vbSunday) 'en hier het aantal zondagen.
'            intHolidays = CalcHolidays(StartDate, EndDate)
            intHolidays = 0
            'NonWorkdays is the number of non workdays
            CalcNonWorkdays = intSaturdays + intSundays + intHolidays
        End If
    End If
    Exit Function
Err_Execute:
    'If error occurs, return 0
    CalcNonWorkdays = 0
End Function
Enjoy!
 
Hello Folks,

Dank voor de reacties.Ik heb de laatste functie geintegreerd en die werkt.:thumb:
Maar : het rapport wordt reeds gegenereerd op basis van een begin en einddatum (zodat ik bv maandelijks per werknemer een rapport met werkprestaties kan trekken). Door deze functie dien ik 2 maal die datums in te geven (1 x voor mijn QRY(die dient voor opmaak rapport), 1x voor de functie) terwijl deze 2 keer dezelfde datums zijn.

??
Thx - hans
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan