[VBA] copier les feuilles avec les macros
Dernière réponse : dans Programmation
Tout est dans le titre...
Durant ma macro, je copie vers un nouveau classeur certaines feuilles de mon tableur excel; ces même feuilles ont des macros associées dans mon classeur principal. Je les enregistrent etc...
et lorsque je veut traiter ce nouveau classeur, les liens vers les macros que j'ai instaurés sont encore présent, mais les macros elles ont disparues.
Le problème vient surement du code utilisé lorsque je copie mes feuilles alors voilà:
Je sais que google est mon ami, mais là je commence à connaitre toutes ses pages par coeur, et frise l'état de cognage de tête contre écran d'ordi
...
Si vous aviez un élément de réponse, je vous en serait trèèèèèèèès reconnaissant
Durant ma macro, je copie vers un nouveau classeur certaines feuilles de mon tableur excel; ces même feuilles ont des macros associées dans mon classeur principal. Je les enregistrent etc...
et lorsque je veut traiter ce nouveau classeur, les liens vers les macros que j'ai instaurés sont encore présent, mais les macros elles ont disparues.
Le problème vient surement du code utilisé lorsque je copie mes feuilles alors voilà:
Set W1 = ThisWorkbook
Set W2 = Workbooks.Add(xlWBATWorksheet)
For a = 1 To W1.Sheets.Count
W1.Sheets(a).Copy after:=W2.Sheets(W2.Sheets.Count)
Next a
Application.DisplayAlerts = False
W2.Sheets(1).Delete
W2.SaveAs ("c:\MesDocuments\toto") //mieux comme ca ?! ;)
Je sais que google est mon ami, mais là je commence à connaitre toutes ses pages par coeur, et frise l'état de cognage de tête contre écran d'ordi
...Si vous aviez un élément de réponse, je vous en serait trèèèèèèèès reconnaissant
Autres pages sur : vba copier feuilles macros
Lassé par la pub ? Créez un compte
Ce code est dans 2 modules différents
A force de trifouiller les codes pendant une journée de repos (
), j'ai réussi à trouver ça:
L'inconvénient c'est qu'il ne copie pas les codes des module 2 et 3 dans mon nouveau classeur, mais on dirait qu'il me créer des liens avec mon classeur d'origine.
Ce qu'il fait que lorsque j'exécute un des modules que j'ai copié, il ouvre mon classeur d'origine et exécute le programme à partir de celui-ci.
A force de trifouiller les codes pendant une journée de repos (
), j'ai réussi à trouver ça:
Set w1 = ThisWorkbook
Set w2 = Workbooks.Add(xlWBATWorksheet)
Dim S As String
With w1.VBProject.VBComponents("Module2").CodeModule
S = .Lines(1, .CountOfLines)
End With
With w2.VBProject.VBComponents("Feuil1").CodeModule
.AddFromString S
End With
With w1.VBProject.VBComponents("Module3").CodeModule
S = .Lines(1, .CountOfLines)
End With
With w2.VBProject.VBComponents("Feuil2").CodeModule
.AddFromString S
End With
L'inconvénient c'est qu'il ne copie pas les codes des module 2 et 3 dans mon nouveau classeur, mais on dirait qu'il me créer des liens avec mon classeur d'origine.
Ce qu'il fait que lorsque j'exécute un des modules que j'ai copié, il ouvre mon classeur d'origine et exécute le programme à partir de celui-ci.
Citation :
L'inconvénient c'est qu'il ne copie pas les codes des module 2 et 3Le code attaché aux feuilles est copié avec les feuilles.
Mais tu ne copies que les feuilles !
Pourquoi veux-tu que le code des modules suivent ?
Je ne sais pas copier des modules d'un classeur à l'autre. (L'import ok, mais pas l'export)
Je peux par contre te proposer une autre méthode :
1°) Copier le classeur actuel dans un autre. (Avec toutes les feuilles et tous les modules)
2°) En virer toutes les feuilles qui me t'intéressent pas
' // 1°
Set W1 = ThisWorkbook
W1.SaveCopyAs ( "<chemin>\TOTO" )
Set W2 = Workbooks.Open ( "<chemin>\TOTO" )
' // 2°
For i = 1 To W2.Sheets.Count
If Not OnGardeCetteFeuille ( W2.Sheets(1) ) Then W2.Sheets(1).Delete
Next
Citation :
ActiveWorkbook.SaveAs ("c:\MesDocuments\toto")
C'est quoi cette bouse dans ton premier code !?Lequel veux-tu sauvegarder ? W1 ou W2 ?
J'ai oublié d'éditer. c'est w2 que je veux sauvegarder ta technique marche nickel, plus aucun problème.
Juste une dernière question, à l'ouverture du classeur, une de mes feuille contient des liens vers un autre classeur. Du coup, a chaque fois que j'ouvre cette feuille il me demande si je veux mettre à jour ces liens...
Existerait-il une commande permettant d'éviter l'affichage de cette fenêtre, je suppose du type:
Application.DisplayAlerts = False
Mais celle-ci ne fonctionne pas.
Honte sur toi !!
Le message intempestif te propose de mettre à jour ou de ne pas mettre à jour tes liaisons. Mais il te propose aussi de l'aide que je t'invite à consulter.
Bonne lecture.
---------------------------------------------------------------
Ce que l'aide dit
Dans le menu Outils, cliquez sur Options, puis sur l'onglet Modification.
Désactivez la case à cocher Confirmation de la mise à jour automatique des liens. Si cette case à cocher est désactivée, les liaisons sont automatiquement mises à jour, et aucun message d'invite ne s'affiche.
Pour ne pas demander la mise à jour des liaisons pour ce classeur, et laisser l'utilisateur contrôler la mise à jour des liaisons
Avertissement Cette option affecte tous les utilisateurs du classeur. Si vous choisissez de ne pas mettre à jour les liaisons, et que vous demandez à l'application de ne pas afficher de message d'invite, les utilisateurs du classeur ne sauront pas que les données sont obsolètes.
Dans le menu Edition, cliquez sur Liaisons.
Cliquez sur Invite de démarrage.
Sélectionnez l'option souhaitée.
Remarque Vous serez encore averti si certaines liaisons sont rompues.
Le message intempestif te propose de mettre à jour ou de ne pas mettre à jour tes liaisons. Mais il te propose aussi de l'aide que je t'invite à consulter.
Bonne lecture.
---------------------------------------------------------------
Ce que l'aide dit
Citation :
Pour ne pas demander si les liaisons doivent être mises à jour à l'ouverture d'un classeur, et mettre à jour les liaisons automatiquementDans le menu Outils, cliquez sur Options, puis sur l'onglet Modification.
Désactivez la case à cocher Confirmation de la mise à jour automatique des liens. Si cette case à cocher est désactivée, les liaisons sont automatiquement mises à jour, et aucun message d'invite ne s'affiche.
Pour ne pas demander la mise à jour des liaisons pour ce classeur, et laisser l'utilisateur contrôler la mise à jour des liaisons
Avertissement Cette option affecte tous les utilisateurs du classeur. Si vous choisissez de ne pas mettre à jour les liaisons, et que vous demandez à l'application de ne pas afficher de message d'invite, les utilisateurs du classeur ne sauront pas que les données sont obsolètes.
Dans le menu Edition, cliquez sur Liaisons.
Cliquez sur Invite de démarrage.
Sélectionnez l'option souhaitée.
Remarque Vous serez encore averti si certaines liaisons sont rompues.
J'ai bien mis ton
Bah c'est celle-là qui s'affiche.
j'ai essayé de ruser en mettant
Mais...tu vois la fênetre qui s'affiche lorsque tu répond 'oui' à la demande de mise à jour des liens alors qu'il ne trouve pas ton fichier.
Application.AskToUpdateLinks = False
Bah c'est celle-là qui s'affiche.
j'ai essayé de ruser en mettant
Pour lui faire croire que je lui répondait non, mais il n'y a pas cru... il est futé quand même
AskToUpdateLinks = 7
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumVba 2007 copier feuilles dans classeur
- ForumExcel vba copier donnã es entre 2 feuilles
- ForumExcel copier plusieurs feuilles vers une feuille
- ForumCopier des feuilles dans un autre classeur
- ForumVba copier feuille
- ForumVba copier nouvelle feuille
- ForumVba copier contenu feuille
- ForumVba copier une feuille et la placer
- ForumVba copier feuille nom
- ForumMacro vba copier feuille
- Voir plus