2012-01-09 14 views
5

Sto cercando di trovare del codice VBA per determinare il numero di giorni della settimana e giorni del fine settimana in un determinato intervallo di date utilizzando Access VBA.Trova numero di giorni feriali/fine settimana in un determinato intervallo di date

Ad esempio:

Begin Date - 1/1/2012 
End Date - 1/31/2012 

risultato dovrebbe essere:

Week days - 22 
Weekend days - 9 

Qualcuno può aiutare con questo?

+0

È possibile utilizzare la funzione NETWORKDAYS? pseudo codice: TotalDays attraverso un DATEDIFF di due date funzione Run NETWORKDAYS in due date Minus giorni lavorativi dalla Totaldays per giorni del fine settimana. – jetgrrrl

+1

La funzione NETWORKDAYS è una preziosa funzione del foglio di lavoro Excel, ma non esiste in VBA. –

risposta

6

Queste due funzioni saranno calcolare il numero di giorni feriali e giorni di fine settimana:

Function NumWeekendDays(dBegin As Date, dEnd As Date) As Long 
    Dim iPartial As Integer 
    Dim lBeginDay As Long 
    Dim lNumWeekendDays As Long 

    iPartial = DateDiff("d", dBegin, dEnd + 1) Mod 7 
    lBeginDay = 6 - DatePart("w", dBegin, vbMonday) 

    lNumWeekendDays = (DateDiff("d", dBegin, dEnd + 1) \ 7) * 2 
    If iPartial > 0 And lBeginDay - iPartial < 0 Then 
     If lBeginDay = -1 Then 
      lNumWeekendDays = lNumWeekendDays + 1 
     ElseIf iPartial - lBeginDay = 1 Then 
      lNumWeekendDays = lNumWeekendDays + 1 
     Else 
      lNumWeekendDays = lNumWeekendDays + 2 
     End If 
    End If 

    NumWeekendDays = lNumWeekendDays 

End Function 

Function NumWeekDays(dBegin As Date, dEnd As Date) As Long 
    NumWeekDays = DateDiff("d", dBegin, dEnd + 1) - NumWeekendDays(dBegin, dEnd) 
End Function 

Nota: ho trovato più semplice per calcolare i parziali settimane giorni del fine settimana calcolando la variabile lBeginDay in modo che se la data di inizio è stata Lunedì lBeginDay == 5 ... se la data di inizio era venerdì, lBeginDay == 1, ecc. Anche altre varianti dovrebbero funzionare.

+0

C'è un bug in questo codice di esempio. Restituisce un 2 se la data di fine è venerdì. "Se iPartial> 0 And lBeginDay - iPartial <** = ** 0 Then" dovrebbe essere "If iPartial> 0 And lBeginDay - iPartial <0 Then" Quando "<=" viene modificato in "<" funziona perfettamente. – Brad

+0

@ Brad- Ho corretto il bug. Grazie! –

Problemi correlati