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 102
|
Option Compare Database
Option Explicit
Dim TabFériés(15)
Sub init_tabferies()
TabFériés(0) = DateSerial(Year(Date), 1, 1) 'Jour de l'An
TabFériés(1) = DateSerial(Year(Date), 5, 1) 'Fete du Travail
TabFériés(2) = DateSerial(Year(Date), 5, 8) '8 Mai 45
TabFériés(3) = DateSerial(Year(Date), 7, 14) '14 Juillet 1789
TabFériés(4) = DateSerial(Year(Date), 8, 15) ' 15 Aout
TabFériés(5) = DateSerial(Year(Date), 11, 1) ' Toussaint
TabFériés(6) = DateSerial(Year(Date), 11, 11) ' 11 novembre
TabFériés(7) = DateSerial(Year(Date), 12, 25) ' Noël
TabFériés(8) = DateSerial(Year(Date) - 1, 11, 11) '11 novembre année -1
TabFériés(9) = DateSerial(Year(Date) - 1, 11, 11) '11 novembre année -1
TabFériés(10) = DateSerial(Year(Date) - 1, 12, 25) 'Noel année -1
TabFériés(11) = fPaques(Year(Date)) 'Dimanche de Päques
TabFériés(12) = TabFériés(11) + 1 'Lundi de Päques
TabFériés(13) = TabFériés(11) + 39 'Ascension
'TabFériés(14) = TabFériés(11) + 50 'Pentecote
End Sub
Function JourOuvrés(DateDebut As Date, DateFin As Date)
'origine http://support.microsoft.com/default.aspx?scid=kb;fr;466831
' et http://support.microsoft.com/kb/466909/fr
Dim i As Integer
Dim v As Double
Dim inverse As Boolean
Dim d As Date
'initialise la table tabFériés
If IsEmpty(TabFériés(1)) Then init_tabferies
'on inverse les dates si supérieur pour éviter les soucis
If DateDebut > DateFin Then
d = DateDebut
DateDebut = DateFin
DateFin = d
inverse = True
End If
JourOuvrés = Int(DateDiff("d", DateDebut, DateFin) / 7) * 5
JourOuvrés = JourOuvrés + Weekday(DateFin, 1) - 1
JourOuvrés = JourOuvrés - Weekday(DateDebut, 1)
JourOuvrés = JourOuvrés + IIf(Weekday(DateDebut, 1) > Weekday(DateFin, 1), 5, 0)
JourOuvrés = JourOuvrés - IIf(Weekday(DateFin, 1) = 7, 1, 0)
JourOuvrés = JourOuvrés + IIf(Weekday(DateDebut) <> 1, 1, 0)
'Gestion des Jours Fériés
For i = 0 To UBound(TabFériés, 1)
If TabFériés(i) >= DateDebut And TabFériés(i) <= DateFin Then
If (Weekday(TabFériés(i), 1) <> 1) And (Weekday(TabFériés(i), 1) <> 7) Then
' à décompter !
If JourOuvrés > 0 Then
JourOuvrés = JourOuvrés - 1
Else
JourOuvrés = JourOuvrés + 1
End If
End If
End If
Next i
'on met en négatif si invertion au début
If inverse Then JourOuvrés = -JourOuvrés
End Function
Public Function fPaques(wAn%) As Date
'Pâques est le dimanche qui suit le quatorzième jour de la Lune qui tombe le 21 mars ou immédiatement après
'Cette fonction calcule aussi les autres jours qui sont liés
Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%, wI%, wJ%, wK%, wL%, wM%, wN%, wP%
Dim dtPaques As Date, dtVenSaint As Date, dtLunPaq As Date, dtAscension As Date
Dim dtDimPent As Date, dtLunPent As Date
Dim strMsg As String, strTitre As String
Dim TableauJoursFeriés(10), i As Integer
'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
wA = wAn Mod 19
'Calcul du siècle
wB = wAn \ 100
'Calcul du rang de l'année dans le siècle
wC = wAn Mod 100
wD = wB \ 4
wE = wB Mod 4
'Synchronisation avec le cycle lunaire
wF = (wB + 8) \ 25
wG = (wB - wF + 1) \ 3
wH = (19 * wA + wB - wD - wG + 15) Mod 30
wI = wC \ 4
wK = wC Mod 4
wL = (32 + 2 * wE + 2 * wI - wH - wK) Mod 7
wM = (wA + 11 * wH + 22 * wL) \ 451
wN = (wH + wL - 7 * wM + 114) \ 31
wP = (wH + wL - 7 * wM + 114) Mod 31
fPaques = DateSerial(wAn, wN, wP + 1)
End Function |
Partager