Private Sub Worksheet_Change(ByVal Target As Range)
Dim deb As Range, a, P As Range, tablo, resu$(), i%
Set deb = [N1] '1ère date
If Not IsDate(deb) Then Exit Sub
a = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
Set P = deb.Resize(, Cells(deb.Row, Columns.Count).End(xlToLeft).Column - deb.Column)
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next 'sécurité
deb = DateSerial(Year(deb), Month(deb) + 1, 0) 'fin de mois
P(2).Resize(, P.Columns.Count - 1) = "=EOMONTH(RC[-1],1)" 'fonction FIN.MOIS
ThisWorkbook.Names.Add "MesDates", P.Value2 'nom défini sur une matrice
tablo = [MesDates] 'matrice, plus rapide
ReDim resu(1 To UBound(tablo))
For i = 1 To UBound(tablo)
resu(i) = "'" & a(Month(tablo(i)) - 1) & " " & Year(tablo(i)) 'textes
Next
P = resu 'restitution
Application.EnableEvents = True 'réactive les évènements
End Sub