Option Explicit
Sub CreerOnglets()
Dim NumMois As Long, LaDate As Date, lOnglet As Worksheet, NumAn As Long
'récupérer le numéro du mois dont il faut créer les onglets
NumMois = Application.InputBox("Numéro du mois (1 - 12) :", , , , , , , 1)
NumAn = Application.InputBox("Année :", , , , , , , 1)
If NumMois < 1 Or NumMois > 12 Then Exit Sub
LaDate = DateSerial(NumAn, NumMois, 1)
On Error Resume Next
With ThisWorkbook
'boucler sur tous les jours du mois
While Month(LaDate) = NumMois
'si c'est un jour ouvré
If Weekday(LaDate, vbMonday) <> 6 And Weekday(LaDate, vbMonday) <> 7 And Not Ferie(LaDate) Then
'créer l'onglet en dernière position et le renommer
Set lOnglet = .Sheets.Add(after:=.Sheets(.Sheets.Count))
lOnglet.Name = Format(LaDate, "ddmmyy")
End If
LaDate = LaDate + 1
Wend
End With
On Error GoTo 0
Feuil1.Activate
End Sub
Private Function Ferie(Jour As Date) As Boolean
' FERIE : Détermine si un jour est férié ou non
'
' Ce programme ne traite que des dates fériées ayant cours en FRANCE.
' On y trouve les fêtes légales françaises et les fêtes catholiques
'
' Extrait de Science et vie MICRO N°189 de Janvier 2001
' Algorithme fourni par Xavier MILAN
'
' Cet algorithme a été validé sur quelques dates calculées par une autre
' algorithme codé sous Excel dans le passé
Dim JJ As Long, MM As Long, AA As Long
Dim NbOr As Long, Epacte As Long
Dim Plune As Date, Paques As Date, Ascension As Date, Pentecote As Date
JJ = DatePart("d", Jour)
MM = DatePart("m", Jour)
AA = DatePart("yyyy", Jour)
If JJ = 1 And MM = 1 Then Ferie = True: Exit Function ' 1 Janvier
If JJ = 1 And MM = 5 Then Ferie = True: Exit Function ' 1 Mai
If JJ = 8 And MM = 5 Then Ferie = True: Exit Function ' 8 Mai
If JJ = 14 And MM = 7 Then Ferie = True: Exit Function ' 14 Juillet
If JJ = 15 And MM = 8 Then Ferie = True: Exit Function ' 15 Aout
If JJ = 1 And MM = 11 Then Ferie = True: Exit Function ' 1 Novembre
If JJ = 11 And MM = 11 Then Ferie = True: Exit Function ' 11 Novembre
If JJ = 25 And MM = 12 Then Ferie = True: Exit Function ' Noel
NbOr = (AA Mod 19) + 1
Epacte = (11 * NbOr - (3 + Int((2 + Int(AA / 100)) * 3 / 7))) Mod 30
Plune = DateSerial(AA, 4, 19)
Plune = DateAdd("y", -((Epacte + 6) Mod 30), Plune)
If Epacte = 24 Then Plune = DateAdd("y", -1, Plune)
If Epacte = 25 And (AA >= 1900 And AA < 2200) Then Plune = DateAdd("y", -1, Plune)
Paques = Plune - Weekday(Plune) + vbMonday + 7 ' Paques
If (JJ = DatePart("d", Paques) And MM = DatePart("m", Paques)) Then
Ferie = True: Exit Function
End If
Ascension = DateAdd("y", 38, Paques) ' Ascension
If (JJ = DatePart("d", Ascension) And MM = DatePart("m", Ascension)) Then
Ferie = True: Exit Function
End If
Pentecote = DateAdd("y", 11, Ascension) ' Pentecote
If (JJ = DatePart("d", Pentecote) And MM = DatePart("m", Pentecote)) Then
Ferie = True: Exit Function
End If
End Function