Function create_calendrier(année As Long, Mois As Long)
Dim i As Long, col As Long, lig As Long, nbjour As Long
Dim j As Long, Jférié() As Variant, Jfériéstring() As Variant
Dim vdate As Date
Dim zoneA As Range, zoneB As Range, zoneC As Range
Dim cell As Range
Dim paques As Date, ascension As Date, pentecote As Date, lunpentecote As Date
Application.ScreenUpdating = False
' Calcul des fêtes mobiles
paques = CDate(((Round(DateSerial(année, 4, (234 - 11 * (année Mod 19)) Mod 30) / 7, 0) * 7) - 6))
ascension = paques + 39
pentecote = paques + 49
lunpentecote = paques + 50
' Liste des jours fériés
Jférié = Array( _
DateSerial(année, 1, 1), _
DateSerial(année, 5, 1), _
DateSerial(année, 5, 8), _
ascension, _
pentecote, _
lunpentecote, _
DateSerial(année, 7, 14), _
DateSerial(année, 8, 15), _
DateSerial(année, 11, 1), _
DateSerial(année, 11, 11), _
DateSerial(année, 12, 25) _
)
Jfériéstring = Array( _
"Jour de l'an", "Fête du Travail", "Victoire 1945", _
"Ascension", "Pentecôte", "Lundi de Pentecôte", _
"Fête Nationale", "Assomption", "Toussaint", "Armistice", "Noël" _
)
' Nombre de jours dans le mois
nbjour = Day(DateSerial(année, Mois + 1, 0))
col = Weekday(DateSerial(année, Mois, 1), vbMonday) + 1 ' Lundi = 2 dans le tableau
' Ligne de départ pour le calendrier
lig = Range("Calendrier").row + 1
' Définir les plages 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")
' Effacer le contenu précédent
.Range("Calendrier").ClearContents
.Range("Calendrier").Offset(1, 1).Interior.Color = xlNone
.Range("Calendrier").Offset(1, 1).ClearComments
' Effacer les cellules hors du tableau principal
.Range("B17:B18").ClearContents
.Range("B20").ClearContents
.Range("D17:E17").ClearContents
.Range("G17").ClearContents
' Boucle pour générer les jours du mois
For i = 1 To nbjour
If col = 9 Then lig = lig + 5: col = 2
.cells(lig, col).Interior.Color = 15395562 ' Couleur par défaut pour les jours
.cells(lig, col).Value = i
' Calcul de la date actuelle
vdate = DateSerial(année, Mois, i)
' Vérification des zones (A, B, C) et application de couleurs
For Each cell In zoneA
If cell.Value = vdate Then
.cells(lig + 1, col).Interior.Color = RGB(255, 0, 0) ' Rouge clair pour zone A
Exit For
End If
Next cell
For Each cell In zoneB
If cell.Value = vdate Then
.cells(lig + 2, col).Interior.Color = RGB(146, 208, 80) ' Vert clair pour zone B
Exit For
End If
Next cell
For Each cell In zoneC
If cell.Value = vdate Then
.cells(lig + 3, col).Interior.Color = RGB(0, 176, 240) ' Bleu clair pour zone C
Exit For
End If
Next cell
' Vérification des jours fériés
For j = LBound(Jférié) To UBound(Jférié)
If vdate = Jférié(j) Then
.cells(lig + 4, col).Interior.Color = 10092441 ' Couleur pour jour férié
.cells(lig + 4, col).Value = Jfériéstring(j)
End If
Next j
' Coloration du jour actuel
If Date = vdate Then
.cells(lig, col).Interior.Color = RGB(0, 255, 0) ' Vert pour le jour actuel
End If
col = col + 1
Next i
' Ajout du titre et des jours de la semaine
.Range("B1").Value = UCase(Format(DateSerial(année, Mois, 1), "mmmm yyyy"))
.Range("A2").Resize(1, 8).Value = Array("Semaine", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche")
End With
Algorithme année, Mois, 12
Call recup_phase
Application.ScreenUpdating = True
End Function