Copier module dans plusieurs fichiers Excel

Bonjour,

J ai un répertoire "Factures" ou se trouvent une centaine de fichiers Excel. Je dois affecter une macro pour chaque fichier. Toujours la même macro, le même code VBA

Actuellement j ouvre mon fichier Excel, je crée un module et je copie le code Vba dedans. Et cela pour chaque fichier. Je perd un temps fou. N y a t il pas un moyen de copier la macro/le module dans tous les fichiers Excel de mon répertoire en un clic?

En espérant avoir votre aide.

Bonne fin d aprem à tous

Eno

Bonjour,

Le mieux c'est de mettre ton code dans un classeur tiers... et ensuite tu lui donne le classeur à traiter en paramètre...

Cdt.

Bonjour,

Même avis que pierre-jy !

Si tu as besoin d'une macro pourquoi en faire 100 !?

Cordialement.

Désolé mais mon niveau est débutant. il faudrait que mon module VBA soit copié dans tous les fichiers Excel de mon répertoire. De sorte qu' à l ouverture d un fichier Excel du répertoire et en faisant AltF11 je trouve mon module.

Pour la méthode d un fichier tiers je souhaiterais plus d explication

Indique ce que fait ta macro et on va t'indiquer comment elle peut le faire où qu'elle se trouve placée !

Bonjour,

tiens un début de code permettant d'ouvrir un fichier excel puis de lancer un traitement dessus :

Sub LanceMaMAcroDeTraitement()
    Dim oWk As Workbook
    Dim stFichierAouvrir As String

    On Error Resume Next
    stFichierAouvrir = "c:\MesDatas\MonFichierExcel.xls"
    Set oWk = Workbooks.Open(stFichierAouvrir)
    If Not oWk Is Nothing Then
        TraiteFichierExcel oWk
    Else
      MsgBox "Impossible d'ouvrir " & vbCrLf & stFichierAouvrir, vbCritical
    End If
End Sub

Sub TraiteFichierExcel(wk As Workbook)
    'juste pour exemple écriture du nom du classer dans cellule A1 de la 1° feuille du fichier wk

    wk.Sheets(1).Range("A1") = wk.Name

End Sub

adapte le nom de fichier à ouvrir dans la procédure "LanceMa...." et exécute le code..

Bonjour,

Du même avis que les autres (voir éventuellement le classeur PERSO.xls) mais dans le cas où tu veux malgré tout importer ton module, voici une piste.

Tout d'abords, tous les classeurs sont dans le même dossier, y compris le classeur contenant le module à exporter pour ensuite être importé dans les autres qui va aussi contenir le code ci-dessous (dans un autre module bien sûr et pas dans celui à exporter !).

Il te faut adapter le nom de ton module dans le code, ici, pour le test le nom est "MonModule". Donne un nom bien significatif à ton module et pas le nom générique du genre "Module1" puis exécute la sub "ImportModuleDansClasseurs" ci-dessous :

Sub ImportModuleDansClasseurs()

    Dim Cls As Workbook
    Dim TestMod As Object
    Dim Tbl
    Dim Chemin As String
    Dim NomModule As String
    Dim I As Integer

    NomModule = "MonModule" 'adapter le nom du module à exporter dans le dossier du classeur contenant cette macro

    'le module est exporté dans le dossier contenant tous les classeurs (y compris celui contenant cette macro)
    Chemin = ThisWorkbook.Path & "\" & NomModule & ".bas"

    'exporte le module
    ThisWorkbook.VBProject.VBComponents(NomModule).Export Chemin

    'récupère le chemin et nom des différents classeurs .xls et .xlsm
    'les classeurs sont dans le même dossier que le classeur contenant cette macro
    Tbl = RecupFichiers(ThisWorkbook.Path & "\", ThisWorkbook.Name)

    'évite les éventuelles boites de message
    Application.DisplayAlerts = False

    'ouvre les classeur
    For I = 1 To UBound(Tbl)

        Set Cls = Workbooks.Open(Tbl(I))

        'teste si le module est déjà présent dans le classeur ou si un module porte déjà ce nom
        On Error Resume Next

        Set TestMod = Cls.VBProject.VBComponents(NomModule)

        'si pas d'erreur, le module existe demande alors si on veux le remplacer
        'dans la négative, il sera renommé en "MonModule1" ou "MonModule2" etc...
        'sinon, le module existant sera supprimé et remplacé par le nouveau
        If Err.Number = 0 Then

            If MsgBox("Le module '" & NomModule & "' existe déjà dans le classeur '" & Cls.Name & "' !" _
                      & vbCrLf _
                      & vbCrLf _
                      & "Voulez-vous le remplacer ?", _
                      vbQuestion + vbYesNo) = vbYes Then

                Cls.VBProject.VBComponents.Remove TestMod

            End If

            Err.Clear

        End If

        Cls.VBProject.VBComponents.Import Chemin 'importe
        Cls.Close True 'enregistre et ferme

    Next I

    'rétabli
    Application.DisplayAlerts = True

End Sub

Function RecupFichiers(Chemin As String, NomClasseur As String) As String()

    Dim TableauFichiers() As String
    Dim Fichier As String
    Dim I As Integer

    Fichier = Dir(Chemin & "*.xls*")

    Do While (Len(Fichier) > 0)

        If Right(Fichier, 5) <> ".xlsx" And Fichier <> NomClasseur Then 'évite les ".xlsx et ce classeur"

            I = I + 1

            ReDim Preserve TableauFichiers(1 To I)

            TableauFichiers(I) = Chemin & Fichier

        End If

        Fichier = Dir()

    Loop

    RecupFichiers = TableauFichiers()

End Function

Merci pour vos solution et pour le temps passer à m'aider!

Theze j'ai tenté ta méthode mais j'ai une erreur

j'ai crée 3 fichiers (où doit se copier le module) + un fichier où se trouve ton code + le module à exporter. J'ai mis ces 4 fichiers dans le même répertoire.

Mais quand je lance la macro j'ai une erreur 1004

je joint les 4 fichiers à mettre dans un même répertoire et si vous pouviez me dire que j'ai fais une erreur ça serait vraiment génial.

par avance merci

26fichier1.xlsm (7.62 Ko)
16fichier2.xlsm (7.62 Ko)
18fichier3.xlsm (7.62 Ko)

Je fais remonter.

Si quelqu'un pouvait me venir en aide.

Bonne journée

Mferrand, pour répondre à ta question la macro à importer est :

sub Ouvrir_pdf()

Dim wb

'Je prend le nom du classeur et je retire l'extension

wb = Split(ActiveWorkbook.Name, ".")(0)

'J'ouvre le fichier pdf du même nom dans le même dossier

ThisWorkbook.FollowHyperlink wb & ".pdf"

End Sub

Ça permet d ouvrir un PDF du même nom que mon fichier excel

Bonjour,

Je viens de tester avec tes fichiers et tout c'est passé sans aucun problème le module a été exporté puis importé dans les trois fichiers !

Cette erreur 1004 se produit sur quelle ligne de code ?

Des que je clique sur le bouton "exportation du module" dans mon fichier source le message apparaît directement: c'est une fenêtre Microsoft visual basic ou est écrit erreur d exécution '1004': L accès par programme au projet Visual Basic n est pas fiable.

Quand je clique sur déboguage il met en surbrillance la ligne thisWorkbook.VBProject.VBComponents (nomModule).export Chemin

Si ça marche chez toi c'est que je dois peut-être activer quelque chose?

Oui, tu vas dans l'onglet "Developpeur" menu "Sécurité des macros" bouton "Paramètres des macros" tu coches "Accès approuvé au modèle d'objet du projet VBA" Puis tu teste. Il est probable qu'il faille fermer est ré-ouvrir Excel je ne me souviens plus !

ça fonctionne!!!

ralala merci beaucoup!!! tu me fais gagner un max de temps

merci pour le temps passé à m'aider!

bonne soirée

Bonjour,

Si je comprends bien, tu veux lorsque tu ouvres un classeur obtenir l'ouverture d'un fichier pdf portant le même nom.

Il me semble que cette problématique serait gérée au mieux en utilisant l'évènement WorkbookOpen de l'Application.

Excel ne contient pas de module dédié à l'application à l'instar du module classeur (ThisWorkbook) et des modules de feuilles. Il te faut donc créer ce module au moyen d'un module de classe.

Vois les éléments de base pour ce faire dans le classeur joint :

  • Module de classe nommé AppEvents, comprenant déclaration de variable donnant accès aux évènements de l'application, intitalisation de la variable, procédure évènementielle WorkbookOpen qui se déclenchera à l'ouverture d'un classeur.
  • Module standard : déclaration de variable pour initialiser une instance de la classe, procédure d'activation qui initialise la variable, procédure de désactivation (car tous les classeurs ne sont sans doute pas à ouvrir dans les mêmes conditions...)

Tu as la structure de base à étoffer selon tes besoins. Les procédures d'activation et désactivation peuvent être attachées à un bouton, assorti éventuellement d'une signalisation te permettant de savoir si les évènements Application sont actifs ou non.

Si tu dois indiquer le chemin de ton pdf, remplacer Name par FullName... et compléter la procédure s'il y a lieu pour obtenir exactement le résultat souhaité.

Cordialement.

29appliev.xlsm (16.10 Ko)

Bonjour Mferrand,

Un grand merci pour ce temps passé, j en suis vraiment reconnaissant.

Merci pour toutes ces explications précieuses

Je vais appliquer tout ça

Bonne fin de journée

Rechercher des sujets similaires à "copier module fichiers"