Créer une feuille à l'ouverture du fichier

Bonjour,

Je suis toujours débutante en VBA mais cherche quand meme a améliorer mes fichier.

Tous les jours j'ouvre mon fichier et mon premier travail est de prendre la dernière feuille créer la veille. En faire une copie en premier onglet et le renommer avec la date du jour. Je souhaiterai exécuter une macro à l'ouverture du fichier qui fasse ce travail à ma place. J'ai fais une trame mais cela ne fonctionne pas.

Qu'est-ce qui cloche?

Private Sub Workbook_Open()

'Ajoute une feuille en première position

End Sub

Sub Macro2()

' Copie feuille

Sheets("Feuil1").Copy After:=Sheets(1)

Sheets("Feuil1 (2)").Select

Sheets("Feuil1 (2)").Move Before:=Sheets(1)

Sheets("Feuil1 (2)").Select

End Sub

Sub dateNomFeuille()

Dim dte As Date

Dim dte1 As String

dte = Now()

MsgBox dte

dte1 = Format(dte, "dd-MM-yy")

MsgBox dte1

Sheets("Feuil1").Name = dte1

End Sub

Merci pour votre aide

7test-macro.xlsm (14.41 Ko)

Bonjour,

La macro suivante est exécutée automatiquement à l'ouverture du fichier :

Private Sub Workbook_Open()
'Ajoute une feuille en première position
End Sub

Or, il n'y a aucune instruction dans cette macro. Donc c'est tout à fait normal qu'il ne se passe rien. Les 2 autres codes placés en dessous n'ont rien à faire dans le module ThisWorkbook. Ils ne sont pas exécutés automatiquement.

Soit vous intégrez leur contenu à la macro Workbook_Open (option 1), soit vous les placez dans une module standard, et ajoutez des instructions dans la macro Workbook_Open pour lancer leur exécution (option 2).

Option 1 :

Private Sub Workbook_Open()
    Sheets("Feuil1").Copy Before:=Sheets(1) 'La nouvelle feuille devient la feuille active
    ActiveSheet.Name = Format(Date, "dd-mm-yy") 'Date correspond à la date du jour 
End Sub

Option 2 :

'Module ThisWorkbook
Private Sub Workbook_Open()
    Call AjoutFeuille
    Call NommageFeuille
End Sub

'Module standard
Sub AjoutFeuille()
    Sheets("Feuil1").Copy Before:=Sheets(1)
End Sub
Sub NommageFeuille()
    ActiveSheet.Name = Format(Date, "dd-mm-yy")
End Sub

Remarque : je ne connais pas la finalité de votre travail, mais je déconseille très vivement la duplication de feuilles à tout va (par date, par personne ou autre). Excel est bien mieux équipé pour gérer une unique base de données. Il y a de nombreux outils pour éventuellement afficher, extraire et analyser les données d'une date spécifique.

Merci beaucoup pour votre aide et votre rapidité!

Merci beaucoup pour votre aide et votre rapidité!

Merci du retour, pensez à valider le sujet !

PS : par rapport au sujet initial, vous aurez une erreur si le fichier est ouvert plusieurs fois le même jour. Car au moment du renommage, vous aurez déjà un onglet portant la date du jour.

Si la macro est utilisée, il serait judicieux d'ajouter une gestion d'erreur, ou un code permettant de vérifier le nom des onglets existants.

Merci pour ce conseil.

Mais du coup, j'essaie d'intégrer une fonction si pour gérer ce problème mais je dois mal m'y prendre... soit mal placé, soit mal expliqué...

Private Sub Workbook_Open()

'Ajoute une copie de la première feuille en première position

Sheets(1).Copy Before:=Sheets(1)

Sheets(1).Select

'Renomme l'onglet avec la date du jour

Dim dte As Date

Dim dte1 As String

dte = Now()

dte1 = Format(dte, "dd-MM-yy")

If Sheets(1).Name <> dte1 = Now() Then

Sheets(1).Select

Sheets(1).Name = dte1

End If

End Sub

Pourquoi ne pas commencer par prendre le code proposé plus haut...

Là on va pas se mentir, mais cette syntaxe c'est de la science fiction !

Je vais commenter un peu ton code pour que tu vois :

Private Sub Workbook_Open()
Sheets(1).Copy Before:=Sheets(1) 'Copie de la première feuille, placée en 1ère position
Sheets(1).Select 'Selection de la 1ère feuille (inutile, c'est déjà la feuille active)
Dim dte As Date 'Déclaration d'une variable de type Date (à éviter en cours de macro et grouper au début)
Dim dte1 As String 'Déclaration d'une variable de type Texte (idem)
dte = Now() 'Affectation de la date + heure dans la variable dte
dte1 = Format(dte, "dd-MM-yy") 'Affectation de la date tirée de la 1ère variable dans la 2nde, selon format désiré
If Sheets(1).Name <> dte1 = Now() Then 'Si le nom de la 1ère feuille est différent de la date au format texte égale à la date + heure alors (on est d'accord ça n'a aucun sens, et à ce stade on a pas changé le nom de cette feuille. Si on change le nom, c'est pour lui affecter la date du jour, donc c'est normal qu'elle soit égale à cette date !!)
Sheets(1).Select 'Sélection de la 1ère feuille (déjà fait plus haut, et à nouveau inutile)
Sheets(1).Name = dte1 'Modification du nom
End If
End Sub

Une possibilité :

Private Sub Workbook_Open()
If Not NomFeuilleExistant(Format(Date, "dd-mm-yy")) Then 'Si le nom de feuille n'existe pas déjà
    Sheets("Feuil1").Copy Before:=Sheets(1) 'Insertion feuille - la nvelle feuille devient la feuille active
    ActiveSheet.Name = Format(Date, "dd-mm-yy") 'Date correspond à la date du jour 
End If
End Sub

'Dans un module standard :
Function NomFeuilleExistant(ByVal NomFeuille As String) As Boolean
'F correspond à une variable de type "Feuille", Res au résultat de la fonction (FAUX par défaut)
Dim F As Worksheet, Res As Boolean
'Boucle sur les feuilles
For Each F In ThisWorkbook.Worksheets
    If F.Name = NomFeuille Then 'Si le nom de la feuille existe déjà
        Res = True 'Res devient VRAI
        Exit For 'On quitte la boucle (inutile de continuer)
    End If
Next F
NomFeuilleExistant = Res 'Résultat de la fonction
End Function

Je réitère mon avertissement concernant la structure retenue (démultiplication d'onglets)...

Merci pour ce retour mais cela ne fonctionne pas.

"L’objet ne prend pas en charge cette propriété ou cette méthode (Erreur 438)"

J'ai bien noté la démultiplication de feuille, c'est pourquoi je vais intégrer l'ordre de supprimer 1 onglet (le dernier) en plus de la boucle actuelle.

Désolée pour mon incompétence mais merci pour votre aide

Quelle est la ligne surlignée lorsque le message d'erreur apparaît ?

De mon côté je n'ai eu aucun problème avec le code précédent...

Il n'y a aucune ligne surlignée...

Il n'y a aucune ligne surlignée...

A quelle moment se présente cette erreur ?

L'éditeur VBA n'est il pas ouvert avec une ligne de code surlignée en jaune ?

Une capture d'écran ou un fichier à fournir sur lequel l'erreur se présente ?

Je ne peux pas t'aider avec si peu d'éléments.

Coucou,

Après quelques recherches et quelques tests, j'ai réussi à trouver le soucis que j'avais. J'ai également améliorer un peu mes demandes.

Maintenant, à l'ouverture de mon fichier:

  • Création automatique d'un onglet avec la date du jour (s'il n'existe pas déjà)
  • Suppression d'un onglet (le dernier de droite) pour ne pas avoir trop de duplication (suivi de données sur une période données tout en souhaitant conserver l'historique)
  • Visualisation de l'onglet créer
  • Groupage des données pour plus de visibilité.

Je suis contente car ça correspond à ce que je voulais exactement. J'ai fais les tests et ça semble parfaitement fonctionner.

Merci beaucoup pour votre aide et votre rapidité.

Private Sub Workbook_Open()

If Not Sheets(1).Name = Format(Date, "ddmmyy") Then 'Vérifie si l'onglet date du jour existe déjà

Sheets(1).Copy Before:=Sheets(1) 'La nouvelle feuille devient la feuille active

ActiveSheet.Name = Format(Date, "ddmmyy") 'Date correspond à la date du jour

Application.DisplayAlerts = False

Worksheets(Worksheets.Count).Delete

ActiveSheet.Outline.ShowLevels RowLevels:=1

End If

End Sub

Content de voir que vous avez bien prit le sujet en main.

Il faudrait juste penser à réactiver les messages d'alerte à la fin de macro :

Application.DisplayAlerts = True
Rechercher des sujets similaires à "creer feuille ouverture fichier"