Bonjour,
Une autre approche à partir de l'observation qu'en ce qui concerne les fériés fixes, pour 7 d'entre eux, les jours de la semaine occupés sont en rapport fixe. Si le 1er mai (le premier d'entre eux) est un dimanche, le 8 mai et le 25 décembre seront aussi un dimanche, le 15 août sera un lundi, le 1er novembre un mardi, le 14 juillet un jeudi et le 11 novembre un vendredi.
Lorsque le 1er mais passe au lundi, tous ces autres jours se décalent de la même façon. On a donc 7 répartitions possibles de ces jours que l'on peut établir en correspondance avec le jour du 1er mai...
Pour le 8e férié fixe, le 1er janvier, il tombera le même jour que le 25 décembre de l'année précédente (donc que le 1er mai de ladite année). En année normale, ce sera le jour de la semaine précédant le jour du 1er mai de l'année en cours, soit le 1er mai étant un dimanche, le 1er janvier est un samedi. Mais il se décale d'un jour en année bissextile, dans ce cas si le 1er mai est un dimanche, le 1er janvier sera un vendredi (comme c'est le cas en 2016). On conserve donc une correspondance avec la répartition précédente en introduisant une variante selon que l'année est bissextile ou pas.
Quand aux fériés mobiles (dépendant de la date de Pâques), ils tombent toujours le même jour de la semaine. En laissant de côté Pâques et Pentecôte (dimanche) leurs lendemains sont des lundis et l'ascension est toujours un jeudi.
Sur l'année 3 fériés mobiles s'ajoutent aux fériés fixes à prendre en compte.
Leur répartition sur les mois est à appécier selon les variations de la date de Pâques. Celle-ci peut aller du 22 mars au 25 avril.
Au 22 mars, les 3 fériés mobiles se répartissent également en mars (23), avril (30) et mai (11).
Mais dès le 23 mars, l'Ascension passant au 1er mai, on en aura 1 jour en mars et 2 en mai.
(Noter que si Pâques est le 23 ou le 30 mars, l'Ascension est sur un férié fixe, ce qui fait donc un férié de moins...)
A partir du 31 mars, le lundi de Pâques passe au 1er avril : 1 jour en avril, 2 en mai.
A partir du 12 avril, c'est le lundi de Pentecôte qui passe au 1er juin : répartition avril, mai, juin.
Et à partir du 23 avril, l'Ascension arrive au 1er juin : 1 en avril, 2 en juin.
A partir de ces éléments, on peut bâtir des fonctions personnalisées. Une fonction donnant la date de Pâques (à voir dans le classeur), une autre renvoyant True ou False selon que l'année est bissextile ou non. Ces fonctions étant utilisées par celles dénombrant les fériés...
Function BISSEXT(an As Integer) As Boolean
Dim a%
Application.Volatile
a = IIf(an Mod 100, an Mod 100, an \ 100)
BISSEXT = (a Mod 4 = 0)
End Function
On peut construire ainsi deux fonctions : NBFESDI qui compte les jours fériés en excluant les dimanches (voir dans le classeur) et NBFESSADI qui les compte en excluant les samedis et dimanches.
Function NBFESSADI(a As Integer, Optional m As Integer = 0) As Integer
Dim d As Date, jref%, n%
Application.Volatile
jref = Weekday(DateSerial(a, 5, 1))
Select Case m
Case 0
n = IIf(jref Mod 7 < 2, 7, 9)
If jref = 4 Or jref = 5 Then n = n + 1
Case 1
If jref > 2 Then n = 1
Case 2, 9, 10
n = 0
Case 5, 12
If jref Mod 7 > 1 Then n = IIf(m = 5, 2, 1)
Case 7
If jref < 3 Or jref > 4 Then n = 1
Case 8
If jref < 6 Then n = 1
Case 11
n = IIf(jref Mod 3 = 1, 2, 1)
End Select
If m > 2 And m < 7 Then
d = JPAQUES(a)
Select Case m
Case 3
If d < DateSerial(a, 3, 31) Then n = 1
Case 4
If d = DateSerial(a, 3, 22) Or d >= DateSerial(a, 3, 31) Then n = 1
Case 5
If d < DateSerial(a, 4, 23) Then n = n + 1
If d > DateSerial(a, 3, 22) And d < DateSerial(a, 4, 12) Then n = n + 1
If d = DateSerial(a, 3, 23) Or d = DateSerial(a, 3, 30) Then n = n - 1
Case 6
If d >= DateSerial(a, 4, 12) Then n = 1
If d >= DateSerial(a, 4, 23) Then n = n + 1
End Select
End If
If m = 0 Or m = 1 Then
If BISSEXT(a) Then
If jref = 1 Then n = n + 1
If jref = 3 Then n = n - 1
End If
End If
NBFESSADI = n
End Function
Les arguments à fournir à la fonction sont l'année et le mois, ce dernier étant optionnel (si omis, la fonction renvoie le nombre pour l'année).
Cordialement.