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
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.
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