Function create_calendrier(année, Mois)
Dim i As Long, L As Long, col As Long, lig As Long, nbjour As Long, difeuro As Long, j, k, Jférié, Jfériéstring, coulférié, paques, pentecote, lunpentecote, ascension, Jfête, Jfêtestring
Dim a, M
Dim vdate As Date
Dim zoneA As Range, zoneB As Range, zoneC As Range
Dim cell As Range
Application.ScreenUpdating = False
' Calcul des fêtes mobiles
paques = Format(CDate(((Round(DateSerial(année, 4, (234 - 11 * (année Mod 19)) Mod 30) / 7, 0) * 7) - 6)), "dd/mm/") ' Calcul du lundi de Pâques
ascension = Format(CDate(paques & année) + 39, "dd/mm/") ' Calcul du jeudi de l'Ascension
pentecote = Format(CDate(paques & année) + 49, "dd/mm/") ' Calcul du dimanche de Pentecôte
lunpentecote = Format(CDate(paques & année) + 50, "dd/mm/") ' Calcul du lundi de Pentecôte
' Liste des jours fériés
Jférié = Array("25/12/", "01/01/", "14/02/", paques, ascension, pentecote, lunpentecote, IIf(année > 1973, "01/05/", ""), IIf(année > 1944, "08/05/", ""), "14/07/", "15/08/", "01/11/", "11/11/")
Jfériéstring = Array("NOËL", "Jour de l'an", "Saint-Valentin", "Pâques", "Ascension", "Pentecôte", "Lundi de Pentecôte", IIf(année > 1973, "Fête du travail", ""), IIf(année > 1944, "Victoire 1945", ""), "Fête nationale", "Assomption", "Toussaint", "Armistice 1918")
' Nombre de jours dans le mois
nbjour = Day(DateSerial(année, Mois + 1, 0))
col = Weekday(DateSerial(année, Mois, 1), vbMonday) + 1 ' Index du jour de la semaine
If Weekday(DateSerial(année, 1, 1), vbMonday) > 4 Then difeuro = 1
lig = Range("Calendrier").row + 1 ' Ligne de départ pour le calendrier
' Définir les plages de la Feuille B pour les zones A, B et C
With Worksheets("Vacances")
Set zoneA = .Range("A2:A" & .cells(.rows.Count, "A").End(xlUp).row)
Set zoneB = .Range("B2:B" & .cells(.rows.Count, "B").End(xlUp).row)
Set zoneC = .Range("C2:C" & .cells(.rows.Count, "C").End(xlUp).row)
End With
' Génération du calendrier
With Worksheets("Calendrier")
.Range("Calendrier").ClearContents
.Range("Calendrier").Offset(1, 1).Interior.Color = xlNone
.Range("Calendrier").Offset(1, 1).ClearComments
.Range("B17:B18").ClearContents
.Range("B20").ClearContents
.Range("D17:E17").ClearContents
.Range("G17").ClearContents
For i = 1 To nbjour
If col = 9 Then lig = lig + 5: col = 2
.cells(lig, col).Interior.Color = 15395562
.cells(lig, col) = i
' Calcul de la date actuelle
a = Year(Range("B1")): M = Month(Range("B1")): j = i
vdate = DateSerial(a, M, j)
' Vérification des zones (A, B, C) et application de couleurs
For Each cell In zoneA
If cell.Value = vdate Then
.cells(lig + 2, col).Interior.Color = RGB(255, 200, 200) ' Rouge clair pour zone A
Exit For
End If
Next cell
For Each cell In zoneB
If cell.Value = vdate Then
.cells(lig + 3, col).Interior.Color = RGB(200, 255, 200) ' Vert clair pour zone B
Exit For
End If
Next cell
For Each cell In zoneC
If cell.Value = vdate Then
.cells(lig + 4, col).Interior.Color = RGB(200, 200, 255) ' Bleu clair pour zone C
Exit For
End If
Next cell
' Vérification des jours fériés
For j = 0 To UBound(Jférié)
If CDate(Jférié(j) & année) = DateSerial(année, Mois, i) Then
.cells(lig + 1, col).Interior.Color = 10092441 ' Couleur pour jour férié
.cells(lig + 1, col) = Jfériéstring(j)
End If
Next j
' Coloration du jour actuel
If Date = DateSerial(année, Mois, i) Then
.cells(lig, col).Interior.Color = 65280
End If
col = col + 1
Next i
' Ajout du titre et des jours de la semaine
.Range("B1") = UCase(Format(DateSerial(année, Mois, 1), "mmmm yyyy"))
.Range("A2").Resize(1, 8) = Array("Semaine", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche")
End With
Algorithme année, Mois, 12
Call recup_phase
End Function