Bonjour Flam, bonjour le forum,
En pièce jointe une proposition.
Le bouton Nouvelle Journée de l'onglet Menu permet de copier un onglet Modèle (masqué) et de le renommer par la date renseignée dans la boîte d'entrée.
Je n'ai pas codé pour éviter les bugs de dates erronées il suffira de supprimer ou de renommer l'onglet créé...
Si le mois ou l'année change par rapport a la date indiquée en B2 de l'onglet Menu, un nouveau classeur est créé dans le même dossier que celui où se trouve le fichier source.
Je n'ai pas géré non plus la possibilité d'un fichier déjà existant...
Le code :
Private Sub CommandButton1_Click() 'bouton "Nouvelle Journée"
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim D As Variant 'déclare la variable D (Date)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook 'définit le classeur source CS
CA = CS.Path & "\" 'définit le chemin d'accès CA
D = Application.InputBox("Quelle date ? (jj mm aaaa)", "DATE", Format(Date, "dd mm yyyy")) 'définit la date D (boîte d'entrée)
If D = False Or D = "" Then Exit Sub 'si bouton [Anuler] ou non renseignée, sort de la procédure
'condition : si le mois de la date D ou l'année de la date D est différent du mois de la cellule B2 ou de l'année de la cellule B2
If Month(D) <> Month(Me.Range("B2").Value) Or Year(D) <> Year(Me.Range("B2").Value) Then
MsgBox "Un nouveau fichier portant le nom : accueil-vcs-" & CStr(Month(D)) & "-" & Year(D) & ".xlsm va être créé." 'message
Me.Range("B2").Value = Format(D, "mmmm yyyy") 'renvoie la date D en B2
Application.DisplayAlerts = False 'masque les message d'Excel
For I = CS.Sheets.Count To 4 Step -1 'boucle sur tous les onglets (du dernier au 4ème)
CS.Worksheets(I).Visible = True 'affiche l'onglet (au cas ou)
CS.Worksheets(I).Delete 'supprime l'onglet
Next I 'prochain onglet de la boucle
Application.DisplayAlerts = True 'affiche les message d'Excel
ThisWorkbook.SaveAs CA & "accueil-vcs- " & CStr(Month(D)) & " - " & Year(D), 52 'enregistre le classeur sous
End If 'fin de la condition
For I = 4 To Sheets.Count 'boucle sur tous les onglets (du 4ème au dernier)
If Worksheets(I).Name = D Then 'condition : si le nom de l'onglet est égal a la date D
MsgBox "Un onglet à cette date existe déjà !" 'message
Worksheets(D).Visible = True 'affiche l'onglet (au cas ou)
Worksheets(D).Activate 'active l'onglet
Exit Sub 'sort de la procédure
End If 'fin de la condition
Next I 'prochaine onglet de la boucle
With Worksheets("Modèle") 'prend en compte l'onglet "Modèle"
.Visible = True 'affiche l'onglet "Modèle"
.Copy After:=Sheets(Sheets.Count) 'copy l'onglet "Modèle en dernière position
ActiveSheet.Name = D 'nomme l'onglet actif
.Visible = False 'masque l'onglet "Modèle"
End With 'fi de la prose en compte de de l'onglet "Modèle"
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Le fichier :