Se connecter avec
S'enregistrer | Connectez-vous

Macro : création d'un nouveau fichier

Dernière réponse : dans Programmation

Bonjour,

Je cherche à réaliser une macro qui me permette de copier une feuille d'un classeur excel dans un nouveau fichier. Je souhaiterai que la macro se charge de la création d'un fichier sans nécessaire ouvrir le nouveau fichier.

J'aurais d'abord souhaité savoir si cela est possible avant de vous proposer un code ?

Merci d'avance pour votre aide.

Autres pages sur : macro creation nouveau fichier

Lassé par la pub ? Créez un compte
Expert Programmation

re salut GTmacrodeb !!

ALors, oui c'est possible a condition que tu ne souhaite pas changer de dossier de sauvegarde a chaque fois (tous au même endroit) et tu devra qd même ouvrir le fichier le tps de la macro (tu l'ouvre et le ferme sous vba le tps de la copie)
si je me souviens bien !! :D 

pdt que tu commence a proposer un code je vais aller réviser !! mdr

Comme on se retrouve... même si secrètement j'espérais ces retrouvailles ;) 

Au cas où tu en douterais, tu ne pars pas dans l'inconnu puisque c'est pour le même fichier. Je vais repréciser ma demande et te présenter mon code par la suite.

Alors je souhaite créer un bouton que l'on va appeler "Extraction", le but est que lorsque l'on clique sur ce bouton (donc par conséquent le fichier de Suivi Matériel est ouvert), je souhaite que la feuille "Archivage Matériel" (qui elle est masquée par défaut) vienne se copier dans un nouveau fichier que l'on crée.

Je n'ai pas besoin que ce fichier s'ouvre, juste qu'un fichier soit créé dans un dossier précis et qui ne changera pas.

Voici un début de code que j'ai essayé d'adapter à mes besoins.

  1. Sub Extraction_Archivage()
  2.  
  3. Dim ws_archivage_m As Worksheet
  4. Dim Filename As String
  5.  
  6. Set ws_archivage_m = Worksheets("Archivage Matériel")
  7.  
  8. jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now)
  9. monfichier = "H:\Documents and Settings\GTmacrodeb\Mes documents\" & Suivi_Location & " " & jour '// le fichier se nomme Suivi Location avec la date ensuite
  10.  
  11. If Dir(monfichier & ".xls") <> "" Then
  12. MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
  13. Else
  14. monfichier = monfichier & ".xls"
  15.  
  16. ws_archivage_m.SaveAs Filename:= _
  17. ("monfichier"), _
  18. FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
  19. ReadOnlyRecommended:=False, CreateBackup:=False
  20.  
  21. MsgBox ("Fichier créé dans Mes Documents")
  22.  
  23. End If
  24.  
  25. End Sub



Pour la partie "Affecter à un bouton", je devrais m'en sortir.

Merci d'avance pour tes précieux conseils. Cependant si d'autres personnes sont intéressées ou expertes sur ce sujet, elles sont les bienvenues évidemment.
Expert Programmation

sans tester pour l'instant ca me parait bien mais tu ne fais pa la copie dans le code que tu me présente, oubli ou tu es en train de le faire...
j'ai un doute sur les guillements ligne 9 mais je vais verifier avant...

Oups, désolé mais finalement changement de programme...

Au final, je souhaiterais que cette macro copie l'ensemble du classeur.
Par contre, je souhaiterais que le nouveau document créé, affiche et "déprotège" l'ensemble des feuilles. Est-ce possible sans que le nouveau document s'ouvre juste à partir de la macro ?

Pour le retrait de la protection, je suppose qu'il faut utiliser la fonction .Unprotect ?
Par contre, pour afficher les feuilles masquer dans le document d'origine, est-ce une fonction type .Unmask ?

Je reviens plus tard avec un code.

Merci d'avance.

PS : est-il possible de renommer le sujet du forum pour qu'il corresponde à l'objectif ?

Voici le code que je peux vous proposer :

  1. Sub Extraction()
  2.  
  3. jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
  4. monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour
  5.  
  6.  
  7. If Dir(monfichier & ".xls") <> "" Then
  8. MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
  9. Else
  10. monfichier = monfichier & ".xls"
  11.  
  12. ActiveWorkbook.SaveAs Filename:= _
  13. monfichier, _
  14. FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
  15. ReadOnlyRecommended:=False, CreateBackup:=False
  16.  
  17. MsgBox ("Fichier créé dans Mes Documents")
  18.  
  19. End If
  20.  
  21. End Sub



Donc, la macro fonctionne par contre, 2 points que je souhaiterais améliorer :
1- lorsque la sauvegarde est faite, il me ferme automatiquement le fichier d'origine pour le remplacer par la copie. Je préférerais qu'il me laisse ouvert le fichier d'origine tout en créant le nouveau fichier.
2- comme prévu :D  , les feuilles du nouveau fichier sont masquées et protégées, ce que je souhaiterai annuler sans nécessairement ouvrir le fichier...

Merci de m'indiquer ce qu'il est possible de faire ou non.
Expert Programmation


1. pour la fermeture du classeur :
quand tu utilise la fonction .Saveas, c'est comme dans l'environnement graphique, il ferme l'ancien fichier et tu te retrouve sur la copie que tu viens de faire. (Je n'ai pas de solution pour l'instant...)

2. Pour tes feuilles masquées, utilise .Unhide et pour les dé-protégées utilise la fonction .Unprotect
met ces fonctions dans ton code Extraction juste avant la sauvegarde. Ou mieux, applique les juste apres la création du nouveau fichier. (ca t'évitera de devoir re-protéger et re-masquer l'original..)

Je te conseille aussi de sauvegarder ton fichier juste avant ton extraction parce que la save as sauvegarde tout ce que tu as fait depuis la dernière sauvegarde jusqu’à maintenant dans le nouveaux fichier, pas dans l'original (utilise .Save juste avant)

Pour ce qui est du sujet de ton post, tu devrais être a même de le changer toi même, sinon, il faudra demander a un modérateur du site...

Citation :
2. Pour tes feuilles masquées, utilise .Unhide et pour les dé-protégées utilise la fonction .Unprotect met ces fonctions dans ton code Extraction juste avant la sauvegarde. Ou mieux, applique les juste apres la création du nouveau fichier. (ca t'évitera de devoir re-protéger et re-masquer l'original..)


C'est justement ce que je souhaitais : démasquer et retirer la protection pour les feuilles dans le nouveau classeur sans toucher à celui d'origine. Par contre, cela restera-t-il possible avec une macro qui évite l'ouverture du nouveau fichier ?

Voici le nouveau code qui intègre la fonction .Unhide, malheureusement, j'ai un message d'erreur qui m'indique : "Erreur d'exécution '424' Objet requis" pour la ligne 21.

  1. Sub Extraction()
  2.  
  3. ActiveWorkbook.Save
  4.  
  5. jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
  6. monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour
  7.  
  8.  
  9. If Dir(monfichier & ".xls") <> "" Then
  10. MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
  11. Else
  12. monfichier = monfichier & ".xls"
  13.  
  14. ActiveWorkbook.SaveAs Filename:= _
  15. monfichier, _
  16. FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
  17. ReadOnlyRecommended:=False, CreateBackup:=False
  18.  
  19. MsgBox ("Fichier créé dans Mes Documents")
  20.  
  21. monfichier.Worksheets("Archivage Matériel").unhide
  22.  
  23. End If
  24.  
  25. End Sub



Merci encore pour les conseils.
Expert Programmation

salut Gtmacrodeb !!!

pas de chance pour le petit papa Noël !!! tu n'a pas été assez sage ;) 

bon pour ton code... et ben... bonne question... je me demande si... essaye comme suit :
a la place de la ligne 21,
1. ouvre ton nouveau classeur : monfichier
2. rend la feuille en question apparente (ligne21 actuelle)
3. sauvegarde ton classeur
4. ferme ton classeur

et dis moi ce que ca fait !!!

(si tu as des message lors de la fermeture, je t'indiquerai comment s'en débarrasser après...)


Bonjour Oozenot et meilleurs voeux !!!

Alors lorsque j'exécute la macro avec le code que j'ai copié précédemment, mon nouveau fichier créé s'ouvre automatiquement à la place de l'original (qui lui se sauvegarde et se ferme).

J'imagine qu'avec la solution que tu me proposes il va me mettre un message d'erreur m'indiquant que le fichier est déjà ouvert.

Ne serait-ce pas dû à un problème de déclaration des variables ?

Merci d'avance et bonne année à toute la communauté de PPC.
Expert Programmation

SAlut GTmacrodeb,

meilleur voeux a toi aussi,

Pour ton code :
Cela ne viens pas de la déclaration des variables, sinon, la macro ne s'executerai meme pas !!

J'ai une autre solution :
TU utiise la fonction save AS en ce moment. Or cette fonction ne modifie en rien l fichier original mais enregistre les modifications de ce dernier dansun nouveaux fichier...
Donc si tu modifie les protections avant de sauvegarder les feuilles en un nouveauxfichier, alors lamodification ne se fera que sur le nouveaux et l'ancien restera tel quel....

Essaie comme ci-dessus !!!

(si ce n'est pas la reponse exacte a ta question, re-pose la parce que j'ai un peu décroché du sujet pdt les fetes ... dsl :D  )

Alors d'abord je vais réitérer mon besoin pour être sûr que l'on ne fasse pas fausse route.

En fait, je souhaite pouvoir générer une copie d'un fichier à l'identique.

Au niveau de l'exécution de la macro, je partais du principe que le fichier original serait ouvert et qu'il y aurait un bouton qui permettrait la copie ou l'extraction de l'ensemble du classeur. Je ne sais pas si une macro permettrait la copie sans ouvrir le fichier en sachant qu'il y a d'autres actions à réaliser (voir dans la suite).

Dans ce classeur original, j'ai des feuilles masquées et protégées. Je souhaite que le nouveau fichier créé affiche l'ensemble des feuilles et que toutes les protections soient retirées.

Voici le nouveau code :

  1. Sub Extraction()
  2.  
  3. ActiveWorkbook.Save
  4.  
  5. ActiveWorkbook.Worksheets("Archivage Matériel").Unhide
  6. ActiveWorkbook.Worksheets("Archivage Matériel").Unprotect "mdp"
  7.  
  8. jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
  9. monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour
  10.  
  11. If Dir(monfichier & ".xls") <> "" Then
  12. MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
  13. Else
  14. monfichier = monfichier & ".xls"
  15.  
  16. ActiveWorkbook.SaveAs Filename:= _
  17. monfichier, _
  18. FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
  19. ReadOnlyRecommended:=False, CreateBackup:=False
  20.  
  21. MsgBox ("Fichier créé dans Mes Documents")
  22.  
  23. monfichier.Close
  24.  
  25. End If
  26.  
  27. End Sub



Avec ce code, j'ai une erreur d'exécution '438' à la ligne 5 : "Propriété ou méthode non gérée par cet objet.

Dans l'attente de tes précieux conseils.
Expert Programmation

Je vais sans doute dire une bêtise, mais ne pourrais-tu pas passer par la modification de "Visible" plutôt qu'utiliser "Unhide"?

  1. ActiveWorkbook.Worksheets("Archivage Matériel" ).Visible=True

Merci Storos pour cette proposition car elle me permet effectivement d'afficher la feuille, la protection est ensuite bien désactivée.

Donc, il me reste une question :
Est-il possible de créer ce document avec toutes les feuilles visibles et les protections retirées sans nécessairement l'ouvrir à la place du document original ? Solution que je préférerai.

- si cette 1ère éventualité n'est pas possible, il faut donc que le nouveau fichier créé et ouvert se ferme automatiquement. Je viens de faire le test et ça fonctionne pour la fermeture.

Je mettrai mon code après avoir eu votre réponse.

Merci encore à vous 2.
Lassé par la pub ? Créez un compte