Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

[VBA] Copie de Macro Entre 2 Classeurs

  • Initiateur de la discussion Initiateur de la discussion Maivas
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Maivas

XLDnaute Junior
Bonjour,

Aujourd’hui je m’essaye à la copie d’une macro d’un classeur A vers un classeur B et je sèche !
Je voudrais lancer ma macro de copie depuis le classeur B alors que la macro de copie serait codée dans la classeur A.

Ouvertures des classeurs :
Classeur B = Aucune macro
Classeur A = Module4.TCD & Module5.CopieMacro

Etape 1 : Depuis Classeur B lancer la macro Classeur A. Module5.CopieMacro
Etape 2(Resultant de l'Etape 1) : Copie du Module4.TCD contenu dans Classeur A dans Classeur B (Afin de pouvoir lancer la macro TCD sans ouvrir le Classeur A)

Fermeture des classeurs :
Classeur B = Module1.TCD
Classeur A = Module4.TCD & Module5.CopieMacro

Merci

Maivas

Nota : Je suis – malheureusement – sous Excel 2000
 
Re : [VBA] Copie de Macro Entre 2 Classeurs

Bonsoir



Un exemple à tester

Code:
Sub CopyModule(SourceWB As Workbook, strModuleName As String, _
    TargetWB As Workbook)
' copies a module from one workbook to another
' example: 
' CopyModule Workbooks("Book1.xls"), "Module1", _
    Workbooks("Book2.xls")
Dim strFolder As String, strTempFile As String
    strFolder = SourceWB.Path
    If Len(strFolder) = 0 Then strFolder = CurDir
    strFolder = strFolder & "\"
    strTempFile = strFolder & "~tmpexport.bas"
    On Error Resume Next
    SourceWB.VBProject.VBComponents(strModuleName).Export strTempFile
    TargetWB.VBProject.VBComponents.Import strTempFile
    Kill strTempFile
    On Error GoTo 0
End Sub

A+
 
Re : [VBA] Copie de Macro Entre 2 Classeurs

Bonjour,

Voici une piste avec les codes qui suivent.

Je me suis basé entièrement sur les termes de l'exemple de votre demande.

Il faut donc 2 classeurs

CLASSEUR A
1) avec un Module4 dans lequel on copie la Sub TCD dont le code est ci-dessous
Code:
Sub TCD()
'°°° votre code de traitement °°°
MsgBox "coucou" 'Pour illustrer (à virer par la suite)
End Sub
2) avec un Module5 dans lequel on copie la Function CopieMacro dont le code est ci-dessous
Code:
Private Function CopieMacro(Classeur_Appelant As String, Module_Export As String) As Long
Dim ModVoyageur$
Dim VBP As Object   'As VBIDE.VBProject
On Error GoTo Erreur
ModVoyageur$ = ThisWorkbook.Path & "\" & Module_Export & ".bas"
ThisWorkbook.VBProject.VBComponents(Module_Export).Export (ModVoyageur$)
Set VBP = Workbooks(Classeur_Appelant).VBProject
VBP.VBComponents.Import (ModVoyageur$)
Kill ModVoyageur$
Erreur:
CopieMacro = Err.Number
End Function
3) Dans le Classeur A il est IMPERATIF de faire
menu Outils/Macro/Sécurité… dans l'onglet "Editeurs approuvés" cochez la case "Faire confiance au projet Visual Basic"

CLASSEUR B
1) avec un Module1 dans lequel on copie la Sub Appel_CopieMacro_ClasseurA dont le code est ci-dessous
Code:
'### Adapter les constantes ###
Const CLASSEUR As String = "Classeur A.xls"   'classeur contenant le module à importer
Const MODULE As String = "Module5"            'module contenant la macro d'exportation
Const MACRO As String = "CopieMacro"          'nom de la macro d'exportation
Const MODULE_A_IMPORTER As String = "Module4" 'le module à importer
'##############################

Sub Appel_CopieMacro_ClasseurA()
Dim Chaine$
Dim WB As Workbook
Dim dejaOuvert As Boolean
Dim retour&
On Error Resume Next
Set WB = Workbooks(CLASSEUR)
If Not WB Is Nothing Then
  dejaOuvert = True
Else
  Err.Clear
  Set WB = GetObject(ThisWorkbook.Path & "\" & CLASSEUR)
  If Err <> 0 Then
    MsgBox CLASSEUR & " introuvable dans " & ThisWorkbook.Path
    Exit Sub
  End If
End If
Chaine$ = Chr(39) & CLASSEUR & Chr(39) & "!" & MODULE & "." & MACRO
'### Prototype des arguments de la Sub CopieMacro ###
'    Classeur_Appelant As String    'le classeur où s'effectue cette macro
'    Module_Export As String        'le nom du module à exporter/importer
'####################################################
retour& = Application.Run(Chaine$, _
                ThisWorkbook.Name, MODULE_A_IMPORTER)
If Not dejaOuvert Then WB.Close
Set WB = Nothing
If retour& <> 0 Then
  MsgBox "Erreur : " & retour& & vbCrLf & Error(retour&) & vbCrLf & vbCrLf & _
    "dans la procédure : " & MACRO & vbCrLf & "du module : " & MODULE & vbCrLf & _
    "du classeur : " & CLASSEUR
End If
End Sub
2) on y adapte les diverses constantes (Const) en fonction de son propre usage.

Les 2 classeurs doivent être dans le même dossier (directory).
J'espère ne rien oublier. Il n'y a plus qu'à faire un test avec la même démarche que celle décrite dans votre demande.

Cordialement.

PMO
Patrick Morange
 
Re : [VBA] Copie de Macro Entre 2 Classeurs

Solution de PMO2 > Ne correspond pas à mes besoins car mon fichier B ne peut contenir aucune macro lors de sa création car il est le résultat d'une extraction SAP.

Solution vbacrumble > Je ne sais pas pourquoi mais Excel ne voit pas la Macro - Impossible de la chiosir quand je fais Alt+F8

J'ai aussi trouver ce code mais c'est pour importer ThisWorkbook (Je pense) et je n'arrive pas à l'adapter à mes besoins
Code:
Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les modules
' de feuille et le module ThisWorkbook, 3 pr les modules de UserForm)
If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…