Excel - Enregistrement de feuilles en nouveau classeur
Bonjour à toutes et à tous,
J'essaie actuellement d'automatiser le traitement d'un tableau par le biais de macros.
J'ai un fichier Excel à exploiter mais je ne peux pas le charger sous un logiciel tiers sans avoir fait des modifications.
Je vous explique rapidement :
J'ai créé un classeur comportant 4 feuilles :
- la première correspond au menu, c'est-à-dire que les instructions et la macro sont sur cette feuille,
- la deuxième est vierge, c'est là que je copie mes données brutes,
- La troisième est le résultat d'un filtre.,
- La quatrième est un autre résultat avec un filtre.
Le but de la macro est de (une fois mes données collées dans la deuxième feuille) :
- déplacer une colonne,
- ajouter une colonne,
- changer le format de la colonne ajoutée,
- ajouter une donnée dans cette colonne par le biais d'une InputBox,
- changer le format de 2 autres colonnes,
- appliquer un filtre spécifique sur la deuxième feuille et copier/coller le résultat dans la troisième,
- appliquer un filtre spécifique sur la deuxième feuille et copier/coller le résultat dans la quatrième,
- changer la largeur des colonnes,
- affiche un message de fin.
=> vous comprendrez qu'il est appréciable d'automatiser ces tâches récurrentes .
Après plusieurs tests, la macro se déroule et la troisième et quatrième feuille sont bien chargées avec les bonnes données.
Ce que j'aimerai ajouter c'est qu'avant le message de fin, la macro fasse :
une sauvegarde de la troisième feuille uniquement (à l'endroit où se trouve le classeur avec la macro donc dans le chemin courant) en tant que nouveau classeur et avec un intitulé précis (sinon, je peux juste renommer les feuilles selon l'intitulé que doit avoir le classeur) puis une MsgBox indiquant que la feuille 3 a bien été enregistrée en tant que XXX,
idem pour la quatrième feuille.
J'aimerai savoir également si c'est possible d'ajouter ma donnée via l'InputBox uniquement sur un nombre de cellules adéquats (sachant que le nombre de ligne du tableau est différent d'un mois à l'autre). Exemple : je récupère le fichier du mois d'Août, il y a 150 lignes (hors intitulé des colonnes), est-il possible de faire en sorte d'ajouter ma donnée "date requête" dans la nouvelle colonne mais de limiter l'ajouter au nombre de lignes existantes ? Actuellement j'ai paramétré la macro pour ajouter ma donnée dans 500 cellules -> normalement nous n'avons pas plus de 200 lignes dans ce tableau). Avec ma méthode cela fonctionne, c'est juste pour l'esthétique de la deuxième feuille (pas d'une importance capitale étant donné que les données sont par la suite filtrées puis enregistrées dans la troisième et quatrième feuille).
Je ne sais pas si c'est très clair, je vous joins le fichier avec des données bidon bien sûr.
La version d'Excel installée sur le poste est Excel 2002.
Soyez indulgents sur ma macro, la dernière fois que j'ai utilisé Excel autre que pour de la saisie ou formule, c'était en 2008.
Pour faire ma macro, je me suis aidé de l'enregistreur et des cours de ce site (clair et précis
Merci d'avoir pris du temps pour analyser mon classeur et d'avoir alléger et rectifier le code.
J'ai quelques interrogations :
La partie :
If IsDate(f.Range("B2")) Then
MsgBox "Ce fichier a déjà été traité.", 16
Exit Sub
End If
sert à alerter sur un deuxième déroulement de la macro ?
Concernant l'ajout de la deuxième colonne ayant pour intitulé "date requête", la colonne se crée correctement mais ne prend pas l'intitulé "date requête, elle prend la valeur de l'InputBox.
'InputBox pour ajouter la date requête dans la bonne colonne
f.Range("B2:B" & f.Range("B" & 65536).End(xlUp).Row) = InputBox("Date de la requête", "Date", Date)
Cela viendrait-il de cette partie f.Range("B2:B" & f.Range("B" & 65536) ? J'avoue que cette ligne ( f.Range("B2:B" & f.Range("B" & 65536).End(xlUp).Row) = InputBox("Date de la requête", "Date", Date)) est un peu complexe, je souhaite, si tu le veux bien, un peu d'explications.
Du coup, lorsque je déroule la macro, tout se passe bien sauf que la deuxième colonne n'a pas l'intitulé date requête et la valeur de l'InputBox n'est pas injectée dans les cellules qui devraient l'être :
Voir fichier joint
Pour ce qui est de l'enregistrement des feuilles 3 et 4 en tant que nouveau classeur, ça fonctionne du tonnerre et c'est exactement ce que je voulais. Un grand merci.
J'avais "contourné" le problème en faisant 2 nouvelles macro et donc 2 boutons différents avec ce code :
Sub enregistrementaccession() 'Enregistrement de la feuille location
chemin = ActiveWorkbook.Path
Sheets(4).Copy
With ActiveWorkbook
.Title = ActiveSheet.Name
.Subject = ActiveSheet.Name
.SaveAs Filename:=chemin + "\ACI 2 R1 1er paie Accédants OGRE " + ".xls"
End With
Call message
End Sub
Sub message() 'Affiche un message quand la macro est deroulée
MsgBox "Le fichier ACI 2 R1 1er paie Accédants OGRE a été généré !"
End Sub
Alors ça fonctionnait (sauf que ça gardait le fichier ouvert) mais ton code est plus efficace, plus propre et carrément plus allégé.
En tout cas, merci de ton aide.
Le premier terme de l’égalité définit une plage.Skaze a écrit :La partie :
f.Range("B2:B" & f.Range("B" & 65536).End(xlUp).Row) = InputBox("Date de la requête", "Date", Date))est un peu complexe
Et c’est là en effet qu’il y a un bug.
La partie :
f.Range("B" & 65536).End(xlUp).Rowdéfinit la dernière ligne de la plage désirée en partant de la dernière ligne d'une colonne de la feuille, ici la colonne B donc en partant de la cellule B655636 (feuille de Excel 2003) et en remontant jusqu’à la dernière ligne non vide. Comme si, partant de cette cellule on faisait Ctrl et flèche vers le haut.
Mais comme la colonne B est vide, cela donne comme résultat la ligne de la cellule B1. Ce qui n’est pas le résultat souhaité.
Il faut donc corriger en partant de la cellule A65536
Ce qui donnera :
f.Range("B2:B" & f.Range("A" & 65536).End(xlUp).Row) = …Et là, on aura défini la bonne plage.
OK ?
Bye !
Merci gmb pour tes explications
Tout fonctionne parfaitement comme je le souhaitais.