IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[XL-2002] Fonction vba pour importer une macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut [XL-2002] Fonction vba pour importer une macro
    Bonjour à tous.

    Je bloque sur un problème. J'ai une macro dans un classeur1 qui importe des feuilles d'autres classeurs(x). Or dans les classeurs(x) il y a des macros.
    Je souhaiterais lors de l'import de mes feuilles importer les macros contenues dans ces classeurs(x).

    Quelqu'un connaitrait-il une fonction capable de faire cela ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    pour copier un feuille avec ses macros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Copy After:=Workbooks("classeur2").Worksheets("feuil1")
    Cela copie uniquement les macros des feuilles. Si elles font référence à un module elles ne fonctionneront pas

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    Merci pour ta réponse.
    Précisément elles sont dans des modules. Y'a-t-il une solution autre ?
    Lorsqu'on fait clic droit sur le module il y a possibilité d'exporter puis d'importer le module. Y'a-t-il une fonction vba qui permet cela ?

  4. #4
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Pour la manipulation des modules, il faut utiliser VBComponents

    Tu peux t'aider des FAQ

    http://excel.developpez.com/faq/inde...ents&x=52&y=16

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    En effet le F.A.Q donne la solution à la question comment importer un module en automatique, mais il s'agirait alors d'un module déjà exporté de son classeur source.
    Dans mon cas il s'agit en automatique d'exporter les modules et userform d'un classeur et de les importer dans le nouveau, ou bien de le transférer directement de l'un à l'autre mais je ne pense pas que ce soit possible.

  6. #6
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Citation Envoyé par kesimon63 Voir le message
    ou bien de le transférer directement de l'un à l'autre mais je ne pense pas que ce soit possible.
    Bonjour,

    voir cette discussion,

    cordialement,

    Didier

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    Bon je pensais pouvoir me débrouiller tout seul hélas je me heurte à quelques menus problèmes qui me font tourner chèvre
    Je pense que le plus simple est de mettre mon code. En étant conscient que je débute en vba la construction est donc surement un peu anarchique
    Mon but est d'importer les macros(modules+userform) de plusieurs classeurs, s'il y'en a, sachant que, je ne connais pas leur nom, ni leur nombre, ni rien quoi ! J'ai notamment un problème sur l'activation de la référence pourtant le chemin est bon et le fichier présent...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub Transfertmacro(Workbook)
     
        ThisWorkbook.VBProject.References.AddFromFile ("C:\Program Files\Fichiers communs\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB")
     
        Dim VbComp As VBComponent
     
        Dim nom_module_macro As String
        Dim nom_vb_component As String
        Dim Restant_a_tranférer As Long
     
        i = 0
        For Each VbComp In Workbook.VBProject.VBComponents
            '
            nom_module_macro = VbComp.Filename
            nom_vb_component = "nom_module_macro" & "i"
     
            If (VbComp.Type = UserForm) Then
            ThisWorkbook.VBProject.VBComponents.Export ("C:\temp\nom_vb_component.frm")
            If (VbComp.Type = Module) Then
            ThisWorkbook.VBProject.VBComponents.Export ("C:\temp\nom_vb_component.bas")
            Else
            ThisWorkbook.VBProject.VBComponents.Export ("C:\temp\nom_vb_component.cls")
            End If
            End If
            i = i + 1
            'On compte le nombre de module dans le classeur
            Restant_a_tranférer = ThisWorkbook.VBProject.VBComponents.Count - i
     
            If Restant_a_tranférer = 0 Then Exit For
        Next VbComp
    End Sub

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    J'ai avancé un petit peu. Mais à présent il refuse de faire l'export comme s'il y avait un pb de compatibilité de format. "Incompatibilité de type"
    Voici le nouveau code.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
           Dim VbComp As VBComponent
                    Dim nom_module_macro As String
                    Dim nom_vb_component As String
                    Dim Restant_a_tranférer As Long
     
     
                    For Each VbComp In ThisWorkbook.VBProject.VBComponents
                        'With VbComp.CodeModule
                        'ContientMacro = .CountOfDeclarationLines + 1 < .CountOfLines
                        'End With
     
                        'If ContientMacro Then
                        'Next VbComp
     
                        nom_module_macro = VbComp.Name
                        nom_vb_component = "nom_module_macro" & "i"
     
     
                        If (VbComp.Type = vbext_ct_MSForm) Then
                        ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.frm")
                        End If
                        If (VbComp.Type = vbext_ct_StdModule) Then
                        ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.bas")
                        End If
                        If (VbComp.Type = vbext_ct_ClassModule) Then
                        ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.cls")
                        End If
     
                        i = i + 1
                        'On compte le nombre de module dans le classeur
                        Restant_a_tranférer = ThisWorkbook.VBProject.VBComponents.Count - i
     
                        If Restant_a_tranférer = 0 Then Exit For
                    Next VbComp

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    Tout se déroule impeccable.
    Mais lors de l'export il sort une erreur 13 : "incompatibilité de type"
    Pourtant quand je fais la même chose manuellement il exporte bien.
    Mes if me paraissent corrects.
    Un petit coup de pouce svp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub transfertmacro()
     
        Dim VbComp As VBComponent
        Dim nom_module_macro As String
        Dim nom_vb_component As String
        Dim Restant_a_tranférer As Long
        Workbooks.Open ("D:\Documents and Settings\F286937\Desktop\Classeur1.xls")
     
        For Each VbComp In ThisWorkbook.VBProject.VBComponents
     
     
            nom_module_macro = VbComp.Name
            nom_vb_component = "nom_module_macro" & "_" & i
     
     
            If (VbComp.Type = vbext_ct_MSForm) Then
            ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.frm")
            i = i + 1
            End If
            If (VbComp.Type = vbext_ct_StdModule) Then
            ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.bas")
            i = i + 1
            End If
            'If (VbComp.Type = vbext_ct_ClassModule) Then
            'ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.cls")
            'i = i + 1
            'End If
            'If (VbComp.Type = vbext_ct_Document) Then
            'ThisWorkbook.VBProject.VBComponents(VbComp).Export ("C:\temp\nom_vb_component.cls")
            'i = i + 1
            'End If
     
        Next VbComp
    End Sub

  10. #10
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,

    Je voir quelques soucis dans ton code. D'abord, VbComp est un objet et pas une chaîne de caractères. Dans la boucle, il suffit donc d'écrire
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.VBProject.VBComponents(VbComp).Export
    Ensuite, une confusion entre les chaînes de caractères et les noms de variable : ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("C:\temp\nom_vb_component.frm")
    est une chaîne de caractères constante, pour utiliser la variable il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("C:\temp\" & nom_vb_component & ".frm")
    De la même manière,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_vb_component = "nom_module_macro" & "_" & i
    donnera les chaînes nom_module_macro_1, nom_module_macro_2, ...
    Alors que ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_vb_component = nom_module_macro & "_" & i
    donnera des chaînes de caractère avec le contenu de la variable nom_module_macro.

    Avec ces quelques modifications ça devrait aller mieux...

  11. #11
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    Merci beaucoup de m'avoir mis le nez dedans !!!
    Ca m'a permit de découvrir encore d'autres coquilles dans mon code !
    Ca marche !!!!
    Voilà le code si ca peut aider quelqu'un à l'avenir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
           Dim VbComp As VBComponent
                    Dim nom_vb_component As String
                    fic_k='fichiers d'ou on veut copier les macros
                    fic2='fichier ou on veut les copier
                    'Pour chaque Objet du projet VBA la procédure suivante est effectuée
                    For Each VbComp In Workbooks(fic_k).VBProject.VBComponents
                        'Test du type d'objet VBA (Userform, Module, Module de classe, ou ThisWorkbook)
                        If (VbComp.Type = vbext_ct_MSForm) Then
                        'En fonction du type en exporte avec l'extension de fichier correspondante
                        VbComp.Export ("C:\temp\" & VbComp.Name & ".frm")
                        'On importe l'objet VBA exporté dans le kit_rapport
                        Workbooks(fic2).VBProject.VBComponents.Import ("C:\temp\" & VbComp.Name & ".frm")
                        End If
                        If (VbComp.Type = vbext_ct_StdModule) Then
                        VbComp.Export ("C:\temp\" & VbComp.Name & ".bas")
                        Workbooks(fic2).VBProject.VBComponents.Import ("C:\temp\" & VbComp.Name & ".bas")
                        End If
                        If (VbComp.Type = vbext_ct_ClassModule) Then
                        VbComp.Export ("C:\temp\" & VbComp.Name & ".cls")
                        Workbooks(fic2).VBProject.VBComponents.Import ("C:\temp\" & VbComp.Name & ".cls")
                        End If
                        If (VbComp.Type = vbext_ct_Document) Then
                        VbComp.Export ("C:\temp\" & VbComp.Name & ".cls")
                        Workbooks(fic2).VBProject.VBComponents.Import ("C:\temp\" & VbComp.Name & ".cls")
                        End If
     
                    Next VbComp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Fonction VBA pour diagonaliser une matrice 3*3
    Par frisou65 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/08/2011, 08h53
  2. Probleme vba pour renvoyer une valeur en fonction de deux criteres
    Par tarif dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2008, 19h28
  3. Réponses: 8
    Dernier message: 29/06/2006, 15h37
  4. Prob pour exporter une macro en code VBA
    Par electrosat03 dans le forum Access
    Réponses: 6
    Dernier message: 04/02/2006, 19h15
  5. [VBA-E]Etablir une macro d'une fonction rechercheV
    Par dani317 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/10/2005, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo