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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| Option Compare Database
Option Explicit
'Permet de conserver sans recalcul les jours fériés mobiles de l'année en cours
Private Type tJoursFete
sLundiPaques As String
sAscension As String
sLundiPentecote As String
iAnnee As Integer
End Type
Private tFetes As tJoursFete
'Détermine les jours fériés liés à pâques
Private Sub SetJoursDeFete(ByVal iAn As Integer)
Dim L(1 To 5) As Long, Lj As Long, Lm As Long
Dim dPaques As Date
L(1) = iAn Mod 19
L(2) = iAn Mod 4
L(3) = iAn Mod 7
L(4) = (19 * L(1) + 24) Mod 30
L(5) = (2 * L(2) + 4 * L(3) + 6 * L(4) + 5) Mod 7
Lj = 22 + L(4) + L(5)
If Lj > 31 Then
Lj = Lj - 31
Lm = 4
Else
Lm = 3
End If
dPaques = DateSerial(iAn, Lm, Lj)
tFetes.sLundiPaques = Format(dPaques + 1, "ddmm")
tFetes.sAscension = Format(dPaques + 39, "ddmm")
tFetes.sLundiPentecote = Format(dPaques + 50, "ddmm")
tFetes.iAnnee = iAn 'v1.01 : Evite recalcul pour chaque année
End Sub
' Retourne vrai si la date est un jour férié ou éventuellement samedi ou dimanche
' 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 IsJourFerie(ByVal dDate As Date, Optional ByVal bWeekEnd As Boolean) As Boolean
If bWeekEnd Then
Select Case WeekDay(dDate)
Case vbSunday, vbSaturday
IsJourFerie = True
End Select
End If
If Not IsJourFerie Then
If tFetes.iAnnee <> Year(dDate) Then SetJoursDeFete (Year(dDate))
Select Case Format(dDate, "ddmm")
Case tFetes.sAscension, tFetes.sLundiPaques, tFetes.sLundiPentecote, "0101", "0105", "0805", "1407", "1508", "0111", "1111", "2512"
IsJourFerie = True
End Select
End If
End Function
Function DernierJourTravaillé(DteDate As Date) As Date
'
' Renvoie la date du dernier jour ouvré (Lun-Ven) d'un mois.
'
Dim D2 As Date
If VarType(DteDate) <> 7 Then
DernierJourTravaillé = Null
Else
D2 = DateSerial(Year(DteDate), Month(DteDate) + 1, 0)
Do While WeekDay(D2) = 1 Or WeekDay(D2) = 7
D2 = D2 - 1
Loop
DernierJourTravaillé = D2
End If
End Function
Public Function JoursOuvrables(Date_Début As Variant, Date_Fin As Variant) As Integer
'
' Cette fonction calcule le nombre de jours ouvrables entre deux dates
' Samedi n'est pas ouvrable, Dimanche est férié
'
If IsNull(Date_Début) Or IsNull(Date_Fin) Then
JoursOuvrables = 0
Exit Function
End If
Dim Ma_Date As Date
Ma_Date = Date_Début
Do Until Ma_Date > Date_Fin
Select Case WeekDay(Ma_Date)
Case 2, 3, 4, 5, 6
Select Case IsJourFerie(Ma_Date, False)
Case True
Case Else
JoursOuvrables = JoursOuvrables + 1
End Select
End Select
Ma_Date = Ma_Date + 1
Loop
End Function |
Partager