Jours chômés
Comment savoir, à partir d’une date connue, si celle-ci correspond à un jour chômé (Pâques, Fête nationale, Toussaint, etc.) ?
La solution
Voici une fonction postée par DenisS, également contributeur sur les forums self-access.com. Elle gère les jours fériés fixes comme le jour de l’An, la Fête du Travail, l’Armistice 1945, le 14 Juillet, etc., ainsi que les jours fériés mobiles (calculés à partir de la date de Pâques).
Le code
Commencez par recopier ces constantes dans un module standard de votre base de données. En général, les constantes se placent en début du module (et dans notre cas : hors de tout bloc Sub / End Sub
ou Function / End Function
).
1 2 3 4 5 6 7 8 9 |
Public Const jcLundi As Integer = &H1 Public Const jcMardi As Integer = &H2 Public Const jcMercredi As Integer = &H4 Public Const jcJeudi As Integer = &H8 Public Const jcVendredi As Integer = &H10 Public Const jcSamedi As Integer = &H20 Public Const jcDimanche As Integer = &H40 Public Const jcLPentec As Integer = &H80 ' Lundi de Pentecôte Public Const jcAlsMos As Integer = &H100 ' Alsace/Moselle |
Recopiez également ce qui suit dans votre module standard :
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 |
' --- ' JOURS CHOMES ' --- ' Retourne Vrai si la date passée en paramètre est un jour non ouvré, ' Faux sinon. ' iJrSpeciaux permet de définir les jours chômés. ' Un bit à 1 indique que le jour concerné est chômé : ' bits:8 7 6 5 4 3 2 1 0 ' | | D S V J M M L ' | _ Lundi de pentecôte ' ___ Alsace/Moselle (Vendredi Saint et St Etienne fériés) ' ' Par défaut, le samedi et le dimanche sont considérés comme chômés. ' Function JourChome( _ dDate As Date, _ Optional iJrSpeciaux As Integer = (jcSamedi + jcDimanche) _ ) As Boolean Dim iJr As Integer, dPaques As Date ' Traiter d'abord les jours de la semaine ' Position binaire du jour de la semaine iJr = 2 ^ (WeekDay(dDate, vbMonday) - 1) JourChome = (iJrSpeciaux And iJr) If JourChome Then Exit Function ' Jours fériés fixes iJr = Month(dDate) * 100 + Day(dDate) Select Case iJr ' Jour de l'an, Fête du travail, Victoire 1945, Fête Nationale ' Assomption, Toussaint, Armistice 1918, Noël Case 101, 501, 508, 714, 815, 1101, 1111, 1225 JourChome = True Case 1226 ' Saint-Etienne en Alsace/Moselle JourChome = (iJrSpeciaux And jcAlsMos) End Select If JourChome Then Exit Function ' Jours liés à Pâques ' -> Calculer la date de Pâques Select Case dDate Case 1900 To 2099: ' Un peu plus rapide... dPaques = PaquesCarter(Year(dDate)) Case Else: dPaques = PaquesOT(Year(dDate)) End Select Select Case dDate ' Vendredi Saint en Alsace/Moselle Case dPaques - 2 JourChome = (iJrSpeciaux And jcAlsMos) ' Pâques, Lundi de Pâques, Ascension Case dPaques, dPaques + 1, dPaques + 39 JourChome = True ' Lundi de Pentecôte Case dPaques + 50 JourChome = (iJrSpeciaux And jcLPentec) End Select End Function |
Exemples
Quelques exemples tapés dans la fenêtre Exécution (CTRL
+ G
) :
Quelques explications :
- Les 2 premières instructions affichent la date du jour (j’ai rédigé cet article le 25/03/2009, qui tombe un mercredi).
JourChome(Now)
donneFaux
: effectivement, par défaut, un mercredi n’est pas chômé, et le 25/03/2009 n’est pas une date particulière.JourChome(Now + 3)
donneVrai
: dans 3 jours, on sera bien un samedi (considéré comme chômé par défaut).JourChome(Now, jcMercredi + jcSamedi + jcDimanche)
donne cette fois Vrai. On cherche les jours chômés en incluant le mercredi et le week-end.- Les 3 derniers exemples portent sur des dates fixes. Pour info, le 16/08/2009 tombe un dimanche.
Bien sûr, les dates peuvent être remplacées par des variables VB, ou des champs de table (selon le contexte).
Pour pouvez aussi consultez cet article, au cas où…