S’agit-il d’un jour férié ?

Je vous présente une fonction écrite en VBA qui détermine si la date passée en argument correspond à un jour férié français ou non. La réponse est obtenue en moins d’un millionième de seconde !

Les jours fériés légaux en France
Ils sont au nombre de 11 dont 8 sont fixes (1er janvier, 1er mai, 8 mai, 14 juillet, 15 août, 1er novembre, 11 novembre et 25 décembre) et 3 mobiles (Lundi de Pâques, Jeudi de l’Ascension et Lundi de Pentecôte).
le Lundi de Pentecôte (journée de solidarité) est férié mais il peut être non chômé selon l’entreprise. Un jour férié fixe n’est pas non plus obligatoirement chômé puisqu’il peut tomber un jour de week-end par exemple.

La fonction en VBA
La fonction utilise la fonction Paques() qui détermine la date du Dimanche de Pâques. Il faut donc que cette fonction soit présente dans le même projet ou module de code standard.

Public Function EstJourFerie(ByVal laDate As Date, Optional ByVal EstPentecoteFerie As Boolean = True) As Boolean
'Détermine si la date passée en argument est un jour férié (en France) ou non :
'   101 = 1er Janvier - 501 = 1er Mai - 508 = 8 Mai - 714 = 14 Juillet
'   815 = 15 Août - 1101 = 1er Novembre - 1111 = 11 Novembre - 1225 = 25 Décembre
'   dPa = Lundi de Pâques - dAs = Jeudi de l'Ascension - dPe = Lundi de Pentecôte
'Remarque : Le lundi de Pentecôte est un jour férié mais parfois non chômé (EstPentecoteFerie = False dans ce cas)
'Philben - v1.0 - 2012 - Free to use
  Static Annee As Integer, dPa As Date, dAs As Date, dPe As Date, bPe As Boolean
   Dim a As Integer, m As Integer, j As Integer

   a = Year(laDate): m = Month(laDate): j = Day(laDate)
   Select Case m * 100 + j
   Case 101, 501, 508, 714, 815, 1101, 1111, 1225
      EstJourFerie = True
   Case 323 To 614   '323: Date mini Lundi de Pâques - 614 : Date maxi Lundi de Pentecôte
     If a <> Annee Or EstPentecoteFerie <> bPe Then
         Annee = a: dPa = Paques(a) + 1: dAs = dPa + 38
         bPe = EstPentecoteFerie: If bPe Then dPe = dPa + 49 Else dPe = #1/1/100#
      End If
      Select Case DateSerial(a, m, j): Case dPa, dAs, dPe: EstJourFerie = True: End Select
   End Select
End Function

 
Explications
La fonction retourne Vrai si la date passée en argument correspond à un jour férié. Le deuxième argument optionnel permet de définir si le lundi de Pentecôte est réellement férié (non travaillé) ou non.
On teste tout d’abord la date par rapport aux jours fériés fixes. Ensuite, si elle ne correspond pas à l’une de ces dates, on vérifie si elle est située dans la période théorique de l’année des jours fériés mobiles entre la date du Lundi de Pâques (23 mars au plus tôt) et le lundi de Pentecôte (14 juin au plus tard) en sachant que l’Ascension est comprise entre ces deux dates. Si c’est le cas, on compare la date à ces 3 jours.
La date de ces 3 jours mobiles est conservée dans une variable ‘Static’ pour éviter un recalcul inutile si l’année ne change pas entre deux appels et si le statut du lundi de Pentecôte n’est pas modifié.

Vérification des résultats
La fonction suivante contrôle notre fonction par rapport aux résultats de la fonction EstFerie() de la F.A.Q. qui est donc à télécharger.

Public Function TestResultatJourFerie()
   Dim a As Integer, m As Integer, j As Integer, d As Date, bErr As Boolean

   'Plage de EstFerie : 1982 à 2048
  For a = 1982 To 2048
      For m = 1 To 12
         For j = 1 To 31
            d = DateSerial(a, m, j)
            If EstJourFerie(d) <> EstFerie(d) Then
               bErr = True
               Debug.Print "Date : " & d; " - EstJourFerie() : " & EstJourFerie(d) & " - EstFerie() " & EstFerie(d)
            End If
         Next j
      Next m
   Next a
   Debug.Print "Fin TestResultatJourFerie() - " & IIf(bErr, "Erreur(s) détectée(s)", "Aucune erreur détectée")
End Function

 
Compléments à venir
Nous verrons dans des prochains billets comment utiliser cette fonction dans des cas plus spécifiques : S’agit-il d’un jour de week-end ou d’un jour férié, s’agit-il d’un jour ouvré non travaillé,…

@+

Philippe

Laisser un commentaire