[VBA] copier les feuilles avec les macros

  • Auteur de la discussion Nova13
  • Date de début

Nova13

Habitué
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à:
Code:
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 :fou: ...

Si vous aviez un élément de réponse, je vous en serait trèèèèèèèès reconnaissant :ange:
 

zeb

Modérateur
Ce code qui disparaît dont tu parles, il est dans un module à part ou bien dans le code d'une feuille, dans le code de ThisWorkbook ?
 

Nova13

Habitué
Ce code est dans 2 modules différents

A force de trifouiller les codes pendant une journée de repos ( :pfff: ), j'ai réussi à trouver ça:
Code:
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.
 

zeb

Modérateur
L'inconvénient c'est qu'il ne copie pas les codes des module 2 et 3
D'où ma question.

Le 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


Code:
' // 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
 

zeb

Modérateur
Code:
ActiveWorkbook.SaveAs ("c:\MesDocuments\toto")
:ouch: C'est quoi cette bouse dans ton premier code !?
Lequel veux-tu sauvegarder ? W1 ou W2 ?
 

Nova13

Habitué
Code:
ActiveWorkbook.SaveAs ("c:\MesDocuments\toto")
:ouch: C'est quoi cette bouse dans ton premier code !?
Lequel veux-tu sauvegarder ? W1 ou W2 ?

:oops: 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:
Code:
Application.DisplayAlerts = False
Mais celle-ci ne fonctionne pas.
 

zeb

Modérateur
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
Pour ne pas demander si les liaisons doivent être mises à jour à l'ouverture d'un classeur, et mettre à jour les liaisons automatiquement

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.
 

Nova13

Habitué
bah oui!!
Mais ca veut dire qu'il faut que je fasse le tour des 150 pc qui vont utiliser mon programme pour leur paramétrer Excel comme il faut... :cry:
Prise de tête assurée, et je suis sur qu'il existe une solution beaucoup plus simple que cette méthode.
 

zeb

Modérateur
Ben, si tu enregistres dans une macro le premier truc, tu obtiens :
Code:
Application.AskToUpdateLinks = False
Ca ressemble à ton
Code:
Application.DisplayAlerts = False

Cela te convient ?
 

Nova13

Habitué
bah... La fenêtre intempestive n'apparait plus, mais le navigateur apparait disant 'fichier non trouvé'. Comme si je lui avait répondu 'oui' à la mise à jour des liens. :heink:
Tu vois ce que je veux dire?
 

Nova13

Habitué
J'ai bien mis ton
Code:
Application.AskToUpdateLinks = False
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.
Bah c'est celle-là qui s'affiche.

j'ai essayé de ruser en mettant
Code:
AskToUpdateLinks = 7
Pour lui faire croire que je lui répondait non, mais il n'y a pas cru... il est futé quand même
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 845
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut