Sub Ajout_mois()
Dim deb As Range, mois%, annee%, Paques As Date, LundiPaques$, Ascension$, LundiPentecote$, feries, i&, dat As Date, n&, fer As Range, sem%, lig&
Set deb = Cells(1, Columns.Count).End(xlToLeft) 'dernier tableau
mois = Month(CDate(deb) + 31): annee = Year(CDate(deb) + 31)
Paques = Evaluate("DOLLAR((""4/""&" & annee & ")/7+MOD(19*MOD(" & annee & ",19)-7,30)*14%,)*7-6")
LundiPaques = Format(Paques + 1, "d/m")
Ascension = Format(Paques + 39, "d/m")
LundiPentecote = Format(Paques + 50, "d/m")
feries = Array("1/1", "1/5", "8/5", "14/7", "15/8", "1/11", "11/11", "25/12", LundiPaques, Ascension, LundiPentecote)
Application.ScreenUpdating = False
deb.MergeArea.Copy deb(1, 5) '1ère ligne
deb(2).Resize(, 3).Copy deb(2, 5) '2ème ligne
Set deb = deb(3, 5) 'cellule de la 1ère date
deb(1, 0).ColumnWidth = 10: deb(1, 2).Resize(, 2).ColumnWidth = 28 'lageurs des colonnes
deb.EntireColumn.Resize(, 3).HorizontalAlignment = xlCenter 'centrage
deb.EntireColumn.NumberFormat = "dddd d mmmm yyyy" 'format Date
For i = 1 To 31
dat = DateSerial(annee, mois, i)
If Month(dat) = mois And Weekday(dat, 2) < 6 Then
n = n + 1
deb(n) = dat
deb(n).Resize(, 3).Borders.Weight = xlThin
If IsNumeric(Application.Match(Format(dat, "d/m"), feries, 0)) Then _
Set fer = Union(IIf(fer Is Nothing, deb(n, 2).Resize(, 2), fer), deb(n, 2).Resize(, 2))
If Weekday(dat, 2) = 5 Then
sem = sem + 1
With Range(deb(lig + 1), deb(n)).Resize(, 3)
.BorderAround Weight:=xlMedium
If sem Mod 2 Then .Interior.Color = RGB(242, 242, 242) 'gris clair
End With
lig = n
End If
End If
Next i
If lig < n Then
sem = sem + 1
With Range(deb(lig + 1), deb(n)).Resize(, 3)
.BorderAround Weight:=xlMedium
If sem Mod 2 Then .Interior.Color = RGB(242, 242, 242) 'gris clair
End With
End If
If Not fer Is Nothing Then fer.Interior.Color = vbBlack 'colore en noir les jours fériés
deb.EntireColumn.AutoFit 'ajustement largeur
End Sub