1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
Public Enum eTypesJourFerie
Seulement_les_WeekEnds
Fetes_et_WeekEnds
End Enum
Private Type tJoursFete
sLundiPaques As String
sAscension As String
sLundiPentecote As String
iAnnee As Integer
End Type
Dim tFetes As tJoursFete
' Compte le nombre de Samedi/Dimanche et éventuellement les jours fériés entre 2 dates incluses
' Ascension, lundi de Pâques, Lundi de Pentecôte, 1er janvier, 1er mai, 8 mai
' 14 juillet, 15 aout, 1er novembre, 11 novembre, 25 décembre
Public Function CompteHeuresTravaillees(dDateInitiale As Date, dDateFinale As Date, _
Optional eTypeJourFerie As eTypesJourFerie = eTypesJourFerie.Seulement_les_WeekEnds, _
Optional dNbHeuresJournalieres As Double = 7) As Single
Dim dTmp As Date
Dim iCompteJoursFeries As Integer
Dim bIsJourFerie As Boolean
If dDateInitiale > dDateFinale Then
dTmp = dDateInitiale
dDateInitiale = dDateFinale
dDateFinale = dDateInitiale
End If
For dTmp = dDateInitiale To dDateFinale
Select Case Weekday(dTmp)
Case vbSunday, vbSaturday
bIsJourFerie = True
Case Else
bIsJourFerie = False
End Select
If Not bIsJourFerie And _
eTypeJourFerie = eTypesJourFerie.Fetes_et_WeekEnds Then
If tFetes.iAnnee <> Year(dTmp) Then
SetJoursDeFete (Year(dTmp))
End If
Select Case Format(dTmp, "ddmm")
Case tFetes.sAscension, tFetes.sLundiPaques, tFetes.sLundiPentecote, "0101", _
"0105", "0805", "1407", "1508", "0111", "1111", "2512"
bIsJourFerie = True
End Select
End If
If bIsJourFerie Then iCompteJoursFeries = iCompteJoursFeries + 1
Next dTmp
CompteHeuresTravaillees = (DateDiff("d", dDateInitiale, dDateFinale + 1) - iCompteJoursFeries) * _
dNbHeuresJournalieres
End Function
Private Sub SetJoursDeFete(iAn As Integer)
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
Dim f As Integer, g As Integer, h As Integer, i As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer, p As Integer
Dim dPaques As Date
a = Int(iAn Mod 19)
b = Int(iAn \ 100)
c = Int(iAn Mod 100)
d = b \ 4
e = b Mod 4
f = (b + 8) \ 25
g = (b - f + 1) \ 3
h = (19 * a + b - d - g + 15) Mod 30
i = c \ 4
k = c Mod 4
l = (32 + 2 * e + 2 * i - h - k) Mod 7
m = (a + 11 * h + 22 * l) \ 451
n = (h + l - 7 * m + 114) \ 31
p = (h + l - 7 * m + 114) Mod 31
dPaques = DateSerial(iAn, n, p + 1)
tFetes.sLundiPaques = Format(DateAdd("d", 1, dPaques), "ddmm")
tFetes.sAscension = Format(DateAdd("d", 39, dPaques), "ddmm")
tFetes.sLundiPentecote = Format(DateAdd("d", 50, dPaques), "ddmm")
End Sub |
Partager