FORUM Tom's Hardware » Programmation » Autre » [VBA] copier les feuilles avec les macros
 

[VBA] copier les feuilles avec les macros

C16-TR, drouvre Le Bistrot : Kronos_Q Jeux et consoles : reynoldss, 2 utilisateurs anonymes et 228 utilisateurs inconnus
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [VBA] copier les feuilles avec les macros
 
le corps s'évade, les idées persistent.
Plus d'informations

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 :
  1. Set W1 = ThisWorkbook
  2. Set W2 = Workbooks.Add(xlWBATWorksheet)
  3. For a = 1 To W1.Sheets.Count
  4. W1.Sheets(a).Copy after:=W2.Sheets(W2.Sheets.Count)
  5. Next a
  6. Application.DisplayAlerts = False
  7. W2.Sheets(1).Delete
  8. 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:


Message édité par Nova13 le 26-05-2006 à 12:00:53

zeb
Profil : Modérateur libre
Plus d'informations

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 ?

le corps s'évade, les idées persistent.
Plus d'informations

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 :
  1. Set w1 = ThisWorkbook
  2. Set w2 = Workbooks.Add(xlWBATWorksheet)
  3. Dim S As String
  4.  
  5. With w1.VBProject.VBComponents("Module2" ).CodeModule
  6. S = .Lines(1, .CountOfLines)
  7. End With
  8. With w2.VBProject.VBComponents("Feuil1" ).CodeModule
  9. .AddFromString S
  10. End With
  11.  
  12. With w1.VBProject.VBComponents("Module3" ).CodeModule
  13. S = .Lines(1, .CountOfLines)
  14. End With
  15. With w2.VBProject.VBComponents("Feuil2" ).CodeModule
  16. .AddFromString S
  17. 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.


Message édité par Nova13 le 26-05-2006 à 09:36:49
zeb
Profil : Modérateur libre
Plus d'informations

Citation :

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. ' // 1°
  2. Set W1 = ThisWorkbook
  3. W1.SaveCopyAs ( "<chemin>\TOTO" )
  4. Set W2 = Workbooks.Open ( "<chemin>\TOTO" )
  5. ' // 2°
  6. For i = 1 To W2.Sheets.Count
  7.   If Not OnGardeCetteFeuille ( W2.Sheets(1) ) Then W2.Sheets(1).Delete
  8. Next

zeb
Profil : Modérateur libre
Plus d'informations

Code :
  1. ActiveWorkbook.SaveAs ("c:\MesDocuments\toto" )

:ouch: C'est quoi cette bouse dans ton premier code !?
Lequel veux-tu sauvegarder ? W1 ou W2 ?

le corps s'évade, les idées persistent.
Plus d'informations

a écrit :

Code :
  1. 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 :
  1. Application.DisplayAlerts = False


Mais celle-ci ne fonctionne pas.


Message édité par Nova13 le 26-05-2006 à 11:59:21
zeb
Profil : Modérateur libre
Plus d'informations

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

Citation :

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.


le corps s'évade, les idées persistent.
Plus d'informations

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
Profil : Modérateur libre
Plus d'informations

Ben, si tu enregistres dans une macro le premier truc, tu obtiens :

Code :
  1. Application.AskToUpdateLinks = False


Ca ressemble à ton

Code :
  1. Application.DisplayAlerts = False


 
Cela te convient ?

le corps s'évade, les idées persistent.
Plus d'informations

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?


Message édité par Nova13 le 29-05-2006 à 10:29:02
zeb
Profil : Modérateur libre
Plus d'informations

:heink: non

le corps s'évade, les idées persistent.
Plus d'informations

J'ai bien mis ton

Code :
  1. 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 :
  1. 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


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » Autre » [VBA] copier les feuilles avec les macros
 

Annonces Google
Publicité
Les ressources relatives
Les téléchargements