Traitement Répertoire

fouggy

XLDnaute Junior
Bonjour à tout le forum,

Mon problème du jour est le suivant :

Je dispose d'un répertoire contenant 30 fichiers.
A l'intérieur de chacun des fichiers se trouve une macro dont le nom est le même.
A des fin de mise à jour, chaque jour, je dois ouvrir chaque fichier, lancer la macro puis refermer le fichier en enregistrant les modifications apportées.

Dès lors il me faudrait une macro qui dépasse le champs de mes compétences actuelles et ferait les choses dans l'ordre suivant, sachant qu'elle serait lancée dans le répertoire actif :

1/- Ouvre chacun des fichiers présents dans le répertoire actif et lance la macro qui se trouve dans chacun des fichiers et dont le nom est : "NOMDELAMACRO"
2/- Referme chaque fichier en enregistrant les modifications
3/- Arrête la procédure lorsque le dernier fichier est traité et signale-le moi par un message "msg box"

ATTENTION : A chaque fois que j'ouvre un fichier dont l'extension est naturellement ".xlsm", il m'est demandé d'activer la macro et la codification pour laquelle je vous sollicite devra l'activer de manière systématique.

Merci par avance.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Fouggy, bonjour le forum,

Copie le code ci-dessous dans un fichier Maître qui doit se trouver dans le même répertoires que les autres fichiers et lance-le...

VB:
Sub Macro1()
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim F As String 'déclare la variable F (Fichier)
Dim CO As Workbook 'déclare la variable CO (Classeur Ouvert)

CA = ThisWorkbook.Path & "\" 'définit le chemin d'accès CA
F = Dir(CA & "*.xlsm") 'définit le premier fichier avec une extension xlsm ayant CA comme chemin d'accès
Do While F <> "" 'exécute tant qu'il existe des fichiers
  If F <> ThisWorkbook.Name Then 'condition : si le nom du fichier n'est pas le nom de ce fichier maître
  Set CO = Workbooks.Open(CA & F) 'définit le classeur ouvert CO
  CO.Application.Run CO.Name & "!NOMDELAMACRO" 'lance la macro NOMDELAMACRO du classeur ouvert CO
  CO.Close True 'ferme le classeur CO en enregistrant les changements
  End If 'fin de la condition
  F = Dir 'définit le prochain fichier F avec une extension xlsm ayant CA comme chemin d'accès
Loop 'boucle
End Sub
 

fouggy

XLDnaute Junior
Merci Robert pour cette réponse que j'apprécie d'autant plus que tu donnes les explicatifs de chaque ligne.

Pour autant, elle bug sur la ligne suivante surlignée en jaune :

CO.Application.Run CO.Name & "!NOMDELAMACRO"

Ceci, alors que j'ai fait un copier/coller du nom de la macro.

J'ai pensé qu'il s'agissait d'une faute de frappe de ta part concernant le point d'exclamation qui précède le nom de la macro à l'intérieur des guillemets et ai testé sans celui-ci, mais il me renvoi le même message d'erreur :

Erreur d'exécution 1004 :
Impossible d'exécuter la macro... Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros sont désactivées.

Je suis donc allé sur les paramètres de mon pc pour activer en permanence les macros, ai fermé excel, l'ai ouvert à nouveau pour relancer ton code avec et sans "!", mais il me renvoie encore le même message ???

Tu as une idée ?
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Pour tester avant de t'envoyer j'ai crée un dossier avec deux fichiers, en dehors du fichier maître. Dans chacun d'entre eux, la macro NOMDELAMACRO qui avait pour unique ligne de code :

VB:
MsgBox ThisWorkbook.Name
Et, j'ai bien eu un message indiquant le nom de chaque fichier... Comme ça fonctionnait je t'ai envoyé la proposition... Donc aucune idée car pas d'erreur chez moi...
 

Roland_M

XLDnaute Barbatruc
Bonsoir à tous,

Salut Robert !

@fouggy je viens d'essayer et ça fonctionne impeccable !?

j'ai créé un classeur EssaiX avec cette macro "ESSAI" (enregistré dans le même dossier)

Sub ESSAI()
MsgBox "ok !"
End Sub

j'ai évidemment adapté le nom de la macro à la ligne:
CO.Application.Run CO.Name & "!ESSAI" 'lance la macro NOMDELAMACRO du classeur ouvert CO

j'ai fais F5 sur Macro1 et le message ok ! est apparue confirmant le fonctionnement de la dite macro !
es-tu certain que ce soit bien NOMDELAMACRO !?



Sub Macro1()
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim F As String 'déclare la variable F (Fichier)
Dim CO As Workbook 'déclare la variable CO (Classeur Ouvert)

CA = ThisWorkbook.Path & "\" 'définit le chemin d'accès CA
F = Dir(CA & "*.xlsm") 'définit le premier fichier avec une extension xlsm ayant CA comme chemin d'accès
Do While F <> "" 'exécute tant qu'il existe des fichiers
If F <> ThisWorkbook.Name Then 'condition : si le nom du fichier n'est pas le nom de ce fichier maître
Set CO = Workbooks.Open(CA & F) 'définit le classeur ouvert CO
CO.Application.Run CO.Name & "!ESSAI" 'lance la macro NOMDELAMACRO du classeur ouvert CO
CO.Close True 'ferme le classeur CO en enregistrant les changements
End If 'fin de la condition
F = Dir 'définit le prochain fichier F avec une extension xlsm ayant CA comme chemin d'accès
Loop 'boucle
End Sub
 
Dernière édition:

fouggy

XLDnaute Junior
J'ai essayé un tas de truc..., majuscules, minuscule, modification du nom de la macro et toujours le même message !

La nuit portant conseil, je ne vois plus qu'une seule chose, c'est que dans chaque fichier, en fait, il y a plusieurs macros (toutes les mêmes) dont une, "générale" qui exécute les autres du type :
Sub MACROGENERALE
Macrox
Macroy
Macroz
End Sub

Est-ce que la codification en question ne marcherait en fait que s'il y a une seule macro ?
 

Roland_M

XLDnaute Barbatruc
Bonjour tout le monde,

fouggy, je te conseille de faire un essai, mais au pas à pas avec F8 ! tu connais !?
qui fera l'exécution de ta macro principale, qui va charger le/les fichier(s) en question
et qui va exécuter ta macro appelée "NOMDELAMACRO"
et tu verras sur quelle ligne de code ça coince !
 
Dernière édition:

fouggy

XLDnaute Junior
Bon... Alors... On va pas se décourager comme cela...

Une après-midi de test et c'est à ni rien comprendre... Cela ne fonctionne toujours pas...

Changer le nom de la macro par le véritable nom de la macro, cela reste dans mes cordes...

Du coup, je mets en fichiers joints :

* Le fichier macro répertoire où le "NOMDELAMACRO" correspond
* Deux fichiers, parmi d'autres, à traiter

Ces 2 fichiers contiennent scrupuleusement les mêmes macros avec une macro "MacroGénérale" (NOMDELAMACRO) qui en exécute d'autres, seules les données à traiter changent.

En lançant directement la "MacroGénérale" dans chaque fichier, cela fonctionne et, a fortiori, toutes les autres. Il suffit de vérifier.

En lançant la codification, modifiée en conséquence, dans le répertoire, toujours le même bug surligné en jaune sur la même ligne :

CO.Application.Run CO.Name & "!MacroGénérale" 'lance la macro NOMDELAMACRO du classeur ouvert CO

C'est désespérant, ça doit être un détail gros comme une maison, mais j'arrive pas à trouver...
 

Pièces jointes

  • MacroTest.xlsm
    14.6 KB · Affichages: 19
  • Fichier 01.xlsm
    728.7 KB · Affichages: 18
  • Fichier02.xlsm
    860.6 KB · Affichages: 18

guiyom

XLDnaute Junior
Bon... Alors... On va pas se décourager comme cela...

Une après-midi de test et c'est à ni rien comprendre... Cela ne fonctionne toujours pas...

Changer le nom de la macro par le véritable nom de la macro, cela reste dans mes cordes...

Du coup, je mets en fichiers joints :

* Le fichier macro répertoire où le "NOMDELAMACRO" correspond
* Deux fichiers, parmi d'autres, à traiter

Ces 2 fichiers contiennent scrupuleusement les mêmes macros avec une macro "MacroGénérale" (NOMDELAMACRO) qui en exécute d'autres, seules les données à traiter changent.

En lançant directement la "MacroGénérale" dans chaque fichier, cela fonctionne et, a fortiori, toutes les autres. Il suffit de vérifier.

En lançant la codification, modifiée en conséquence, dans le répertoire, toujours le même bug surligné en jaune sur la même ligne :

CO.Application.Run CO.Name & "!MacroGénérale" 'lance la macro NOMDELAMACRO du classeur ouvert CO

C'est désespérant, ça doit être un détail gros comme une maison, mais j'arrive pas à trouver...
Bonsoir,
Votre "Fichier 01.xlsm" comporte une erreur de nom qui stop l’exécution de la macro pour les fichiers suivant.
Si vous enleviez l'espace entre "Fichier" et "01.xlsm" cela devrai fonctionner.
Cordialement
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Chez moi ça fonctionne. Enfin, pas à pas les macros sont lancées. Mais au bout d'un moment ça patine et ça à l'air sans fin... Ce n'est donc pas un problème lié à une seule ou plusieurs macros mais plutôt un problème de code non optimisé. Mais bon, avec 512 onglets on pourrais s'y attendre non ?!...
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Non, désolé ! La méthode d'ouverture des fichiers ne tient pas compte du nom de celui-ci. Regardez le code !... Pas à pas les macro s'exécutent toutes dans le premier fichier puis le ferme et ouvre le second fichier et commencent à exécuter jusqu'à la macro OccurenceRx, qui chez moi tourne depuis plus de 20 minutes et n'a ni fini ni planté...

[Édition]
Bon finalement en a peu près 25 minutes, toutes les macros ont été effectuées sur deux fichiers. Donc le code fonctionne (en tout cas chez moi et au boulot) mais c'est très très long car le code n'est pas optimisé...
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Bonjour,

Robert, je te crois, moi aussi j'ai du mal à croire que ce soit le nom du fichier
et si je ne l'avais pas essayé je n'aurai pas posté !

quand je nomme exp "fichier 01.xlsm" ça bug
je renomme "fichier01.xlsm" ça fonctionne !?
je suis bien obligé de l'admettre !

ça ne bug que sur la ligne qui lance .run la macro !
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Ha mais que oui ! Que je vous fait mes plus plates excuses que même passées dans un laminoir industriel y'a pas plus plat ! Honte à moi !... :confused:
En effet, le fait qu'il y ait un espace dans le nom du fichier fait planter la ligne de code :

VB:
CO.Application.Run CO.Name & "!MacroGénérale"
 

Discussions similaires

Statistiques des forums

Discussions
312 165
Messages
2 085 883
Membres
103 014
dernier inscrit
moimoi31