copie de macros

P

philippe

Guest
Bonjour,

Je reçois par mail des fichiers dans lesquels à l'origine j'avais des macros dans un module et des macros évènementielles dans chaque feuille. Malheureusement toutes les macros ont disparu du fichier car je suppose que la filiale doit être en sécurité haute ou bien certains antivirus détruisent les macros. Y-a-t'il possibilité de recupérer ces macros ? Ou bien peut-on exporter toutes les macros d'un fichier modèle vers ces fichiers tronqués ?

Je vous remercie d'avance

Phil
 
T

Ti

Guest
oui c'est possible à condition que la structure de tes fichiers ne change pas et via une programmation qui n'est pas celle d'un débutant tout de même. Il y a quelques exemples de macros qui ajoutent ou suppriment du code sur le forum ces derniers jours, tu peux t'en inspirer pour les adapter à ton cas.
 
T

Ti

Guest
manuellement, c'est enfantin : tu ouvres les deux fichiers en même temps, tu vas dans l'éditeur VBA, tu copies le code des différents modules et tu le colles dans les modules du fichier destination. Si les modules n'existent pas dans le fichier destination, c'est encore plus simple. Il suffit de gaire glisser à la souris le module d'un fichier source sur le fichier destination et hop, c'est fait.
Par contre, il ne faut pas oublier le code éventuellement présent dans les feuilles et dans Thisworkbook (un simple copier/coller suffit là aussi).
 
@

@+Thierry

Guest
Salut Philippe et Ti et le Forum (pour ceux qui ne m'ont aps encore lu)

Ben si tu ne veux pas ré-écrire les codes, et s'il il s'agit de modules standard tu peux stocker des modules.bas et les ré-importer facilement dans ton projet (Click droit depuis l'explorateur de projet, il y a l'option Import et Export).

Par contre si il s'agit de Private Module (ThisWorkbook ou Sheet) il faut les ré-écrire comme j'ai décrit à Christine récemment dans ce fil :Ecrire dans This Workbook

Bon Après midi
@+Thierry
 
P

philippe

Guest
Ti : je ne connaissais pas le système du glisser comme dans l'explorateur, pour ce qui est du code évènementiel ç'est plutôt fastidieux de le faire du copier coller car j'ai 20 feuilles. J'ai donc essayé le code de Thierry qui permet de créer du code et j'ai donc écrit :

Sub EcrireThisWorkBook()
Dim VBA As String

VBA = VBA & "Private Sub Worksheet_Activate()" & vbCrLf
VBA = VBA & "Application.GoTo Reference:="R1C1" , Scroll:=True" & vbCrLf
VBA = VBA & "Application.GoTo Reference:="R7C1" & vbCrLf
VBA = VBA & "End Sub" & vbCrLf

With ActiveWorkbook.VBProject.VBComponents("feuil1").CodeModule
.AddFromString VBA
End With

End Sub

Le problème est que çà n'accepte pas la syntaxe Reference:="R1C1". Il doit y avoir un truc à faire pour les guillemets.

Merci

Philippe
 
@

@+Thierry

Guest
Re Salut Philippe

Oui les Guillements dans les Strings, c'est classique !

Essaie comme ceci :

Sub EcrireThisWorkBook()
Dim VBA As String

VBA = VBA & "Private Sub Worksheet_Activate()" & vbCrLf
VBA = VBA & "Application.GoTo Reference:=""R1C1"" , Scroll:=True" & vbCrLf
VBA = VBA & "Application.GoTo Reference:=""R7C1" & vbCrLf
VBA = VBA & "End Sub" & vbCrLf

With ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule
.AddFromString VBA
End With
End Sub


Bon Wouik End
@+Thierry
 
@

@+Thierry

Guest
Salut Phil

Je ne pense pas si on parle toujours de Private Module de Feuille (ou du ThisWorkBook)... Un Module standard oui, comme ceci :

Option Explicit
Sub Import()
Dim Modulos As String
Modulos = "C:\Mes documents\Module1.bas"
Workbooks("Classeur.xls").VBProject.VBComponents.Import Modulos
End Sub


Je viens d'essayer ceci pour "ThisWorkbook"... mais aucun résultat
Option Explicit
Sub Import()
Dim Bookos As String
Bookos = "C:\Mes documents\ThisWorkBook.cls"
Workbooks("TheBook.xls").VBProject.VBComponents.Import Modulos
End Sub

Mais ceci créé un Module De Classe...... Donc je ne vois pas comment faire... Sans écrire dans le Private Module comme ci Dessus....

Mais bien combiné... Un code peut importer toutes les Macro contenus dans un module standard .Bas qui seront lancées par des macro évènementielles qui donc, elles, (courtes) seront écrites par macro.......

Exemple :

Sub CreationMacroAuto()
Dim VBA As String
Dim Modulos As String
Modulos = "C:\Mes documents\MonModule.bas"

VBA = VBA & "Private Sub Worksheet_Activate()" & vbCrLf
VBA = VBA & "MaSuperMacro" & vbCrLf
VBA = VBA & "End Sub" & vbCrLf

With Workbooks("TheClasseur.xls").VBProject
.VBComponents("Feuil1").CodeModule.AddFromString VBA
.VBComponents.Import Modulos
End With
End Sub

"MaSuperMacro" étant of course contenue dans le "MonModule.Bas" qui est aussi importé dans "TheClasseur.xls" together avec la macro évènementielle qui la lancera par l'Activate de la "Feuil1"...

C'est tout ce que j'ai trouvé et que j'ai a te proposer... A moins que quelqu'un sache manipuler les ".CLS" ... (pas trop d'aide la dessus)

Bon Travail
@+Thierry
 
@

@+Thierry

Guest
Ceci dit je relisais ta question initiale.......

Et ne serait il pas plus simple de "Zipper" tes fichiers XLS contenant des macros....... Les Antivirus et autres FireWalls laissent passer les Zip sans les "démonter"........ Vu que c'est de là d'où vient ton problème......

Enfin ce n'est qu'une suggestion!
@+Thierry
 
P

phil

Guest
Salut Thierry, merci d'avoir travaillé pour moi un samedi. Je vais essayer d'appliquer ce que tu as écrit dans mon cas. Je ne comprends pas forcément tout mais en me creusant un peu la tête je vais peut être comprendre. Pour ce qui est du zip, en effet j'y ai pensé mais zipper plus de 350 fichiers individuellement c'est assez fastidieux et en plus comme je les envoie dans tous les pays du monde je ne suis pas persuadé que toutes les filiales sachent dézipper un fichier. Voilà pourquoi, mes fichiers me reviennent sans macros.

Merci encore

A plus

Philippe
 
P

philippe

Guest
Bonjour Thierry

Dans l'écriture du module qui permet d'écrire une macro évènementielle qui contient cette instruction :
.VBComponents("Feuil1").CodeModule.AddFromString VBA

ne peut on pas remplacer "Feuil1" par le nom de la feuille. J'ai essayé mais çà n'a pas l'air de fonctionner

Merci pour ton aide précieuse

Philippe
 
@

@+Thierry

Guest
SAlut Phil

Nonon non non

lol

On ne parle plus de Sheets("Toto")...........

mais du projet !!!

VBComponents("Feuil1") même si cette "Feuil1" se nomme dans l'onglet "Toto"....... C'est ça le Visual Basic !!!.......... chaque objet a un nom et chaque nom correspond a un objet...... c'est vrai que là....... la nuance est vague pour le débutant.......

pour les projets et les VBComponents regarde UNIQUEMENT l'observateur d'objets......

Bon travail
@+Thierry
 

Discussions similaires

Réponses
16
Affichages
2 K

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 184
dernier inscrit
amiko