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
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 SubOr, 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 SubOption 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 SubRemarque : 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 SubUne 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 FunctionJe 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...
Coucou,
Après quelques recherches et quelques tests, j'ai réussi
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
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