Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

calcul des jours ouvrés en décomptant les week-end fériés

4 réponses
Avatar
rafael
J'ai un problème : j'ai récupéré un module modDay qui me calcule le
nombre de jours ouvrés dans une période. Voilà le HIC. Quand une personne est
en arrêt maladie et que durant cet arrêt, il y a un samedi ou un dimanche qui
est un jour férié, ce jour doit être compté comme jour travaillé.
Il faut créer un autre module qui ressemble à modDay. J'ai fait
quelques tests en vain.

Quelqu'un peux t-il m'aider ?

Merci d'avance.

4 réponses

Avatar
ze Titi
Bonjour rafael

Si tu nous donnes le module modDay et celui que tu as créé, on pourra
essayer de t'aider...

J'ai un problème : j'ai récupéré un module modDay qui me calcule le
nombre de jours ouvrés dans une période. Voilà le HIC. Quand une personne est
en arrêt maladie et que durant cet arrêt, il y a un samedi ou un dimanche qui
est un jour férié, ce jour doit être compté comme jour travaillé.
Il faut créer un autre module qui ressemble à modDay. J'ai fait
quelques tests en vain.

Quelqu'un peux t-il m'aider ?

Merci d'avance.


--
Voilou !
Bon code
Cordialement,

Ze Titi

Avatar
ze Titi
Bonjour rafael

Regarde la réponse donnée au message de lolo_bob2 ce jour, ça pourrait
peut-être t'apporter une réponse...

dans ton message
J'ai un problème : j'ai récupéré un module modDay qui me calcule le
nombre de jours ouvrés dans une période. Voilà le HIC. Quand une personne est
en arrêt maladie et que durant cet arrêt, il y a un samedi ou un dimanche qui
est un jour férié, ce jour doit être compté comme jour travaillé.
Il faut créer un autre module qui ressemble à modDay. J'ai fait
quelques tests en vain.

Quelqu'un peux t-il m'aider ?

Merci d'avance.


--
Voilou !
Bon code
Cordialement,

Ze Titi

Avatar
rafael
C'est vrai que sans le module, ca va être difficile de m'aider.
Voilà le Module modDay:

Option Compare Database

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


Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%
Dim wI%, wJ%, wK%, wL%, wM%, wN%, wP%


wA = wAn Mod 19 'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
wB = wAn 100 'Calcul du siècle
wC = wAn Mod 100 'Calcul du rang de l'année dans le siècle
wD = wB 4
wE = wB Mod 4
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 'détermine le mois
wP = (wH + wL - 7 * wM + 114) Mod 31 'détermine le jour


fPaques = DateSerial(wAn, wN, wP + 1)


'** A titre d'info :************'
'** dtVenSaint = fPaques - 2****'
'** dtLunPaq = fPaques + 1******'
'** dtAscension = fPaques + 39**'
'** dtDimPent = fPaques + 49****'
'** dtLunPent = fPaques + 50****'


End Function


Public Function JourFérié(dtDate As Date) As Boolean


Dim dtPaques As Date
dtPaques = fPaques(Year(dtDate))
Select Case dtDate
Case CDate("01/01/" & Year(dtDate)) 'Jour de l'an
JourFérié = True
Case CDate("01/05/" & Year(dtDate)) 'Fête du travail
JourFérié = True
Case CDate("08/05/" & Year(dtDate)) 'Victoire de 1945
JourFérié = True
Case CDate("14/07/" & Year(dtDate)) 'Fête nationale
JourFérié = True
Case CDate("15/08/" & Year(dtDate)) 'Assomption
JourFérié = True
Case CDate("01/11/" & Year(dtDate)) 'Toussaint
JourFérié = True
Case CDate("11/11/" & Year(dtDate)) 'Armistie 1918
JourFérié = True
Case CDate("25/12/" & Year(dtDate)) 'Noël
JourFérié = True
Case dtPaques + 1 'Lundi de Pâques
JourFérié = True
Case dtPaques + 39 'Ascension
JourFérié = True
Case dtPaques + 50 'Lundi de pentcôte
JourFérié = False
Case Else
JourFérié = False
End Select


End Function


Public Function NbDayOpen(DateDeb As Date, DateFin As Date) As Integer
' Calculer le nombre de jours ouvrables entre deux dates
' Utilise la fonction JourFérié(UneDate As Date)


Dim dblDateDeb As Double
Dim dblDateFin As Double
Dim DateCourante As Date
Dim Resultat As Integer


If IsNull(DateDeb) Or IsNull(DateFin) Then
NbDayOpen = 0
Exit Function
ElseIf Not IsDate(DateDeb) Or Not IsDate(DateFin) Then
NbDayOpen = 0
Exit Function
ElseIf DateDeb > DateFin Then
Dim dhTemp As Date
dhTemp = DateDeb
DateDeb = DateFin
DateFin = dhTemp
End If


dblDateDeb = CDbl(DateDeb)
dblDateFin = CDbl(DateFin)


Do Until dblDateDeb > dblDateFin
DateCourante = CDate(dblDateDeb)
If Weekday(DateCourante) <> 1 And _
Weekday(DateCourante) <> 7 And _
JourFérié(DateCourante) = False Then
Resultat = Resultat + 1
End If
dblDateDeb = dblDateDeb + 1
Loop
NbDayOpen = Resultat


End Function



Merci d'avance pour votre aide.
Avatar
Jean-Pierre
Salut Rafael,

Je te propose une autre solution, moins élégante, mais sans doute plus simple à mettre en oeuvre. J'ai une table avec 2
colonnes, "Date" et "Fete" qui contient tous les jours fériés de 2002 jusqu'en 2099 inclus. En 2100, nous serons tous morts,
rien à foutre, et de toute façon, y'aura longtemps qu'un p'tit jeune aura décrété que ton appli, c'est de la merde, et aura
tout réécrit.

Ton problème devrait être grandement simplifié car une simple jointure sur la date de permettra de savoir si le jour est férié
ou pas. Et si nécessaire, un champ supplémentaire dans ta requête convertira la date en un numéro de jour dans la semaine.

Ci-après une copie des premières lignes de la table pour l'année 2002. Si ça t'intéresse, envoie un mail...

J-Pierre

JoursFeries Date Fete
01/01/02 Jour de l'an
31/03/02 Pâques
01/04/02 Lundi de Pâques
01/05/02 Fête du Travail
08/05/02 Armistice de 1945
09/05/02 Ascencion
20/05/02 Pentecôte
14/07/02 Fête nationale
15/08/02 Assomption
01/11/02 Toussaint
11/11/02 Armistice de 1918
25/12/02 Noël


"rafael" a écrit dans le message de news:

C'est vrai que sans le module, ca va être difficile de m'aider.
Voilà le Module modDay:

Option Compare Database

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


Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%
Dim wI%, wJ%, wK%, wL%, wM%, wN%, wP%


wA = wAn Mod 19 'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
wB = wAn 100 'Calcul du siècle
wC = wAn Mod 100 'Calcul du rang de l'année dans le siècle
wD = wB 4
wE = wB Mod 4
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 'détermine le mois
wP = (wH + wL - 7 * wM + 114) Mod 31 'détermine le jour


fPaques = DateSerial(wAn, wN, wP + 1)


'** A titre d'info :************'
'** dtVenSaint = fPaques - 2****'
'** dtLunPaq = fPaques + 1******'
'** dtAscension = fPaques + 39**'
'** dtDimPent = fPaques + 49****'
'** dtLunPent = fPaques + 50****'


End Function


Public Function JourFérié(dtDate As Date) As Boolean


Dim dtPaques As Date
dtPaques = fPaques(Year(dtDate))
Select Case dtDate
Case CDate("01/01/" & Year(dtDate)) 'Jour de l'an
JourFérié = True
Case CDate("01/05/" & Year(dtDate)) 'Fête du travail
JourFérié = True
Case CDate("08/05/" & Year(dtDate)) 'Victoire de 1945
JourFérié = True
Case CDate("14/07/" & Year(dtDate)) 'Fête nationale
JourFérié = True
Case CDate("15/08/" & Year(dtDate)) 'Assomption
JourFérié = True
Case CDate("01/11/" & Year(dtDate)) 'Toussaint
JourFérié = True
Case CDate("11/11/" & Year(dtDate)) 'Armistie 1918
JourFérié = True
Case CDate("25/12/" & Year(dtDate)) 'Noël
JourFérié = True
Case dtPaques + 1 'Lundi de Pâques
JourFérié = True
Case dtPaques + 39 'Ascension
JourFérié = True
Case dtPaques + 50 'Lundi de pentcôte
JourFérié = False
Case Else
JourFérié = False
End Select


End Function


Public Function NbDayOpen(DateDeb As Date, DateFin As Date) As Integer
' Calculer le nombre de jours ouvrables entre deux dates
' Utilise la fonction JourFérié(UneDate As Date)


Dim dblDateDeb As Double
Dim dblDateFin As Double
Dim DateCourante As Date
Dim Resultat As Integer


If IsNull(DateDeb) Or IsNull(DateFin) Then
NbDayOpen = 0
Exit Function
ElseIf Not IsDate(DateDeb) Or Not IsDate(DateFin) Then
NbDayOpen = 0
Exit Function
ElseIf DateDeb > DateFin Then
Dim dhTemp As Date
dhTemp = DateDeb
DateDeb = DateFin
DateFin = dhTemp
End If


dblDateDeb = CDbl(DateDeb)
dblDateFin = CDbl(DateFin)


Do Until dblDateDeb > dblDateFin
DateCourante = CDate(dblDateDeb)
If Weekday(DateCourante) <> 1 And _
Weekday(DateCourante) <> 7 And _
JourFérié(DateCourante) = False Then
Resultat = Resultat + 1
End If
dblDateDeb = dblDateDeb + 1
Loop
NbDayOpen = Resultat


End Function



Merci d'avance pour votre aide.