Macro : création d'un nouveau fichier

GTmacrodeb

Expert
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.
 

oozenot

Expert
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
 

GTmacrodeb

Expert
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.

[cpp]
Sub Extraction_Archivage()

Dim ws_archivage_m As Worksheet
Dim Filename As String

Set ws_archivage_m = Worksheets("Archivage Matériel")

jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now)
monfichier = "H:\Documents and Settings\GTmacrodeb\Mes documents\" & Suivi_Location & " " & jour '// le fichier se nomme Suivi Location avec la date ensuite

If Dir(monfichier & ".xls") <> "" Then
MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
Else
monfichier = monfichier & ".xls"

ws_archivage_m.SaveAs Filename:= _
("monfichier"), _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

MsgBox ("Fichier créé dans Mes Documents")

End If

End Sub
[/cpp]


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.
 

oozenot

Expert
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...
 

GTmacrodeb

Expert
Par copie, tu veux dire qu'il faut que j'utilise la fonction .Copy avant d'utiliser la fonction .SaveAs ?

J'attends tes précisions sur l'emplacement de l'enregistrement.

Merci.
 

oozenot

Expert
oups, autant pour moi, je n'avais pas vu que tu sauvegardais directement la feuille en nouveau fichier excel..

Ca me parait bien...
 

GTmacrodeb

Expert
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 ?
 

GTmacrodeb

Expert
Voici le code que je peux vous proposer :

[cpp]
Sub Extraction()

jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour


If Dir(monfichier & ".xls") <> "" Then
MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
Else
monfichier = monfichier & ".xls"

ActiveWorkbook.SaveAs Filename:= _
monfichier, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

MsgBox ("Fichier créé dans Mes Documents")

End If

End Sub
[/cpp]


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.
 

oozenot

Expert
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...
 

GTmacrodeb

Expert
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.

[cpp]Sub Extraction()

ActiveWorkbook.Save

jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour


If Dir(monfichier & ".xls") <> "" Then
MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
Else
monfichier = monfichier & ".xls"

ActiveWorkbook.SaveAs Filename:= _
monfichier, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

MsgBox ("Fichier créé dans Mes Documents")

monfichier.Worksheets("Archivage Matériel").unhide

End If

End Sub[/cpp]


Merci encore pour les conseils.
 

GTmacrodeb

Expert
Malheureusement pour moi, le Père Noël ne m'a pas offert un manuel sur le VBA et je coince toujours avec ce code. [:_tom_:13]
 

oozenot

Expert
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...)


 

GTmacrodeb

Expert
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.
 

oozenot

Expert
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 )
 

GTmacrodeb

Expert
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 :

[cpp]Sub Extraction()

ActiveWorkbook.Save

ActiveWorkbook.Worksheets("Archivage Matériel").Unhide
ActiveWorkbook.Worksheets("Archivage Matériel").Unprotect "mdp"

jour = Day(Now) & "_" & Month(Now) & "_" & Year(Now) '// pour que le nom de la copie, intègre la date (jour - mois - année)
monfichier = "C:\Documents and Settings\GTmacrodeb\Mes documents\Suivi Location" & " " & jour

If Dir(monfichier & ".xls") <> "" Then
MsgBox ("Un fichier de ce nom existe déjà, veuillez le supprimer/déplacer avant nouvelle copie")
Else
monfichier = monfichier & ".xls"

ActiveWorkbook.SaveAs Filename:= _
monfichier, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

MsgBox ("Fichier créé dans Mes Documents")

monfichier.Close

End If

End Sub[/cpp]


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.
 

oozenot

Expert
essaie en inversant la ligne 5 et la 6, c'est plus logique de déprotéger d'abord puis de rendre visible la feuille apres...

 

Storos

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

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

GTmacrodeb

Expert
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.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 156
Messages
6 718 488
Membres
1 586 439
Dernier membre
Thailounette
Partager cette page
Haut