OVH Cloud OVH Cloud

Remplacement de Macro dans un fichier

7 réponses
Avatar
Daniel Campion
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion

7 réponses

Avatar
michdenis
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau pour les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news: 4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion
Avatar
Daniel Campion
Bonjour michdenis.............

Merci de me répondre si rapidement.!

Actuellement les 2 classeurs ont le même nom, donc si je comprend bien je
dois modifier celui de la cible devant être mis à jour, ce qui parait
logique.

Puis (macro) : Fichier = "Nom modifié du classeur cible.xls"

Ce sont là les 2 seules modifications que je doit faire au niveau du fichier
cible et de ta Macro.

Par contre, ta macro dans quel fichier, cible ou source doit-je la mettre
pour l'éxécution......? ( tu affaire à un novice ) excuse moi.!.......

PS

J'ai Ouïe dire que ma façon de faire n'était pas la bonne méthode, il serait
plutot souhaitable d'avoir un classeur ou une feuille Macro séparé, ce qui
simplifirait les éventuelles modifications..........qu'en
penses-tu.?.......( quel Garçon compliqué puis-je faire n'est-ce pas ).

Salutations...........Merci d'avance...............Daniel Campion


"michdenis" a écrit dans le message de news:
%
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les
procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être
le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau pour
les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news:
4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer
les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion






Avatar
michdenis
Bonjour Daniel,

La macro, tu l'a places dans un module standard dans le classeur source qui doit copié ses procédures vers le classeur de
destination.

J'insiste, ce qui est important, ce sont les objets inscrits dans chaque projet visible dans VBE (visual basic editor) dans le
classeur source et de destination qui doivent avoir le même nom.

Exemple des noms des objets :

Feuil1(toto)

Feuil1 est le nom de l'objet dont je parle
(toto) représente le nom de l'onglet de la feuille, et cela n'a aucune incidence sur le fonctionnement de la macro.


Salutations!





"Daniel Campion" a écrit dans le message de news: 4302114c$0$22283$
Bonjour michdenis.............

Merci de me répondre si rapidement.!

Actuellement les 2 classeurs ont le même nom, donc si je comprend bien je
dois modifier celui de la cible devant être mis à jour, ce qui parait
logique.

Puis (macro) : Fichier = "Nom modifié du classeur cible.xls"

Ce sont là les 2 seules modifications que je doit faire au niveau du fichier
cible et de ta Macro.

Par contre, ta macro dans quel fichier, cible ou source doit-je la mettre
pour l'éxécution......? ( tu affaire à un novice ) excuse moi.!.......

PS

J'ai Ouïe dire que ma façon de faire n'était pas la bonne méthode, il serait
plutot souhaitable d'avoir un classeur ou une feuille Macro séparé, ce qui
simplifirait les éventuelles modifications..........qu'en
penses-tu.?.......( quel Garçon compliqué puis-je faire n'est-ce pas ).

Salutations...........Merci d'avance...............Daniel Campion


"michdenis" a écrit dans le message de news:
%
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les
procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être
le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau pour
les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news:
4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer
les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion






Avatar
Ange Ounis
Une solution possible consiste à établir une référence à ClasseurMacro dans
ClasseurDonnées (les 2 classeurs doivent avoir un nom différent).

Pour mettre en route l'utilisation des macros de ClasseurMacro dans
ClasseurDonnées :

1- Etablir dans ClasseurDonnées une référence à ClasseurMacros
Cela demande que le VBAProject de ClasseurMacros ait été nommé (clic droit sur
le projet puis Propriétés) puis de cocher dans l'éditeur VBE la case
correspondant à ce nom dans la liste affichée par le menu OutilsRéférences.

2- Effacer toutes les macros de ClasseurDonnées (à la main ou avec une procédure
comme celle proposée par Denis).

3- Créer dans ClasseurMacro des procédures dont les noms "doublent" celles des
procédure événementielles de ClasseurDonnées
Par exemple une procédure
OuvertureClasseur,
FeuilleChange (Feuille As Object, Cible As Range),
etc.
Ce sont ces procédures qui contiennent le code optimisé (ou un appel au code
optimisé déjà existant dans ClasseurMacros).

4- "Relier" les événements de ClasseurDonnées aux procédures de ClasseurMacros
qui les doublent. Par exemple :

Private Sub Workbook_Open()
OuvertureClasseur
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
FeuilleChange Sh, Target
End Sub

5- Au final, tout le code de ClasseurMacro est écrit dans un ou des modules
ordinaires (éventuellement userforms) mais il n'y en a aucun dans les modules
des feuilles ou ThisWorkbook (=aucune procédure événementielle utilisée).
Alors que ClasseurDonnées ne contient aucun code autre que les appels aux
procédures de ClasseurMacros dans les procédures événementielles de ses feuilles
et de son ThisWorkbook.

Pour les évolutions du code et les mises à jour, rien de plus simple ensuite :
il suffit de remplacer une version de ClasseurMacros par une autre.
C'est tout !

Note 1 : C'est plus long à expliquer qu'à faire :)
Note 2 : ClasseurMacros peut aussi être enregistré en macro complémentaire
(permet de l'utiliser ouvert mais masqué, permet aussi de cacher -un peu- ses
procédures et fonctions qui n'apparaissent plus dans la boite de dialogue
ouverte par Alt+F8).

----------
Ange Ounis
----------

Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion





Avatar
Daniel Campion
Bonjour à Tous..........Bonjour michdenis........

Merci pour ta réponse rapide.

J'ai donc fait l'essai de ta macro et à première vue il doit y avoir un
défaut d'éxécution de ma part.

Une fenètre s'ouvre " Erreur d'éxécution'9': L'indice n'appartient pas à la
sélection."

Et le débogage désigne cette ligne de la macro :

With .VBProject.VBComponents(vc.Name).codemodule

Est-ce que tu peux me donner une explication.!........Merci d'avance......!

PS........Bonjour Ange Ounis

Je te remercie pour ta solution possible, Mais je crois que je verrais ça
plus tard ( avec plus d'expérience )

Salutations..................un Grand Merci à Tous..............Daniel
Campion


"michdenis" a écrit dans le message de news:
%
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les
procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être
le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau pour
les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news:
4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer
les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion






Avatar
michdenis
Bonjour Daniel


| Une fenètre s'ouvre " Erreur d'éxécution'9': L'indice n'appartient pas à la sélection."

L'explication je te l'ai déjà donné.

Pour TOUS LES OBJETS ("module de feuille" , "module standard" , "Module de classe" si tu en as, "Formulaire", je disais donc que ces
objets doivent avoir leur pendant (vis-à-vis) dans le classeur de destination avec la même appellation "Propriété Name" que tu
retrouves dans la section des Propriétés de la fenêtre VBE (visual basic editor)

Si ce n'est pas le cas, la procédure bloquera où tu l'as indiqué.

With .VBProject.VBComponents(vc.Name).codemodule

vc.name représente le nom de l'objet du classeur source (module de feuille, module standard, userform ...) Lorsqu'il arrive dans le
classeur de destination, il cherche l'objet attaché à ce nom pour y faire la transformation du code. et s'il ne le trouve pas, la
procédure bloque.

Je n'ai pas fait appel à des truc comme "on error resume next" pour éviter de leurrer l'usager ... si le job est mal fait... vaut
mieux le savoir immédiatement que de se laisser bercer d'illusions.

j'espère que c'est plus clair..


Salutations!


"Daniel Campion" a écrit dans le message de news: 43036b64$0$22285$
Bonjour à Tous..........Bonjour michdenis........

Merci pour ta réponse rapide.

J'ai donc fait l'essai de ta macro et à première vue il doit y avoir un
défaut d'éxécution de ma part.

Une fenètre s'ouvre " Erreur d'éxécution'9': L'indice n'appartient pas à la
sélection."

Et le débogage désigne cette ligne de la macro :

With .VBProject.VBComponents(vc.Name).codemodule

Est-ce que tu peux me donner une explication.!........Merci d'avance......!

PS........Bonjour Ange Ounis

Je te remercie pour ta solution possible, Mais je crois que je verrais ça
plus tard ( avec plus d'expérience )

Salutations..................un Grand Merci à Tous..............Daniel
Campion


"michdenis" a écrit dans le message de news:
%
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les
procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être
le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau pour
les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news:
4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer
les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion






Avatar
Daniel Campion
Bonjour à Tous...........Bonjour michdenis

Je crois que j'ai enfin compris, mon problème était dans la définition du
terme objet dans Excel.

Merci de toutes les explications que tu m'as données, elles m'ont beaucoup
instruites en m'obligeant à m'investir.

Salutations........Encore Merci............DC


"michdenis" a écrit dans le message de news:
%23IxO%
Bonjour Daniel


| Une fenètre s'ouvre " Erreur d'éxécution'9': L'indice n'appartient pas à
la sélection."

L'explication je te l'ai déjà donné.

Pour TOUS LES OBJETS ("module de feuille" , "module standard" , "Module de
classe" si tu en as, "Formulaire", je disais donc que ces
objets doivent avoir leur pendant (vis-à-vis) dans le classeur de
destination avec la même appellation "Propriété Name" que tu
retrouves dans la section des Propriétés de la fenêtre VBE (visual basic
editor)

Si ce n'est pas le cas, la procédure bloquera où tu l'as indiqué.

With .VBProject.VBComponents(vc.Name).codemodule

vc.name représente le nom de l'objet du classeur source (module de
feuille, module standard, userform ...) Lorsqu'il arrive dans le
classeur de destination, il cherche l'objet attaché à ce nom pour y faire
la transformation du code. et s'il ne le trouve pas, la
procédure bloque.

Je n'ai pas fait appel à des truc comme "on error resume next" pour éviter
de leurrer l'usager ... si le job est mal fait... vaut
mieux le savoir immédiatement que de se laisser bercer d'illusions.

j'espère que c'est plus clair..


Salutations!


"Daniel Campion" a écrit dans le message de news:
43036b64$0$22285$
Bonjour à Tous..........Bonjour michdenis........

Merci pour ta réponse rapide.

J'ai donc fait l'essai de ta macro et à première vue il doit y avoir un
défaut d'éxécution de ma part.

Une fenètre s'ouvre " Erreur d'éxécution'9': L'indice n'appartient pas à
la
sélection."

Et le débogage désigne cette ligne de la macro :

With .VBProject.VBComponents(vc.Name).codemodule

Est-ce que tu peux me donner une explication.!........Merci
d'avance......!

PS........Bonjour Ange Ounis

Je te remercie pour ta solution possible, Mais je crois que je verrais ça
plus tard ( avec plus d'expérience )

Salutations..................un Grand Merci à Tous..............Daniel
Campion


"michdenis" a écrit dans le message de news:
%
Bonjour Daniel,

Cette macro détruit tout le code qui existe dans le fichier où les
procédures doivent être mises à jour et les remplace par celle du
fichier source. Pour exécuter cette macro :

A ) Les 2 Fichiers (source et destination) doivent être ouverts
B ) Le nom des objets dans la fenêtre VBE(visual basic editor) doit être
le même pour chaque classeur. Cette procédure n'ajoute pas
de nouveaux objets, elle ne remplace que l'ancien code par le nouveau
pour
les objets identiques existants dans chacun des
classeurs.

Dans la procédure, adapte le nom du classeur devant être mise à jour.

'--------------------------------------
Sub AjouterCodeAUneFeuille()

Dim VComp As Object, vc As Object
Dim Fichier As String, Code As String

'Nom du classeur ouvert où seront mises à jours les macros
Fichier = "Classeur3.xls"

With ThisWorkbook
Set VComp = .VBProject.VBComponents
End With

For Each vc In VComp
With vc.codemodule
A = vc.codemodule.Name
If .CountOfLines > 0 Then
Code = .Lines(1, .CountOfLines)
AjouterLeCode Workbooks(Fichier), vc, Code
Code = ""
End If
End With
Next

End Sub
'-------------------------------
Sub AjouterLeCode(Wk As Workbook, vc As Object, Code As String)

With Wk
With .VBProject.VBComponents(vc.Name).codemodule
.DeleteLines 1, .CountOfLines
.AddFromString Code
End With
End With

End Sub
'-------------------------------


Salutations!


"Daniel Campion" a écrit dans le message de news:
4301b00b$0$1213$
Bonjour à Tous.........

Sous Windows XP familiale et Excel 2000...............

Nous avons 2 fichiers identiques pour travailler chacun de notre côté.

Mais l'un optimise plutot les donnés et l'autre les Macros.

Le fichier Maître étant celui des donnés, comment faire pour y remplacer
les
Macros éxistantes par les Macros optimisées de l'autre fichier.

Peut-on le faire avec un copier coller une a une, ou exist-il une méthode
plus rationnelle et globable, donc plus simple.

Merci d'avance de vos réponses.........?

Cordialement............Daniel Campion