Bonjour à tous,
J'ai un petit problème avec des macros complémentaires et j'espère que vous aurez la sympathie de m'aider. 
Sans plus attendre, le voici:
J'avais initialement 3 templates Excel (xls, pas xlt) de fichier contenant chacun toutes leurs macros. Ces macros ont été codées par un bleu (moi...) et étaient quasiment identiques aux adaptations près.
Cela demandant trop de maintenance, j'ai amélioré ça en créant des fonctions et procédures strictement identiques à ces 3 templates qui sont adaptées par configuration (utilisation de constantes).
Dans la continuité de cette brillante inspiration, j'ai également décidé de sortir les modules standard et userform des templates Excel pour les mettre dans des fichiers xla:
- "MM_TMX_Generic_Macro.xla" pour les fonctions, procédures et userforms génériques;
- 3 fichiers "MM_XXX_TMX_Specific_Macro.xla" (XXX = nom spécifique à chacun des templates; ex: "SW") pour la configuration de la macro générique et les procédures/userforms spécifiques à chaque template.
Je charge "MM_TMX_Generic_Macro.xla" et le "MM_XXX_TMX_Specific_Macro.xla" qui va bien dans le Workbook_Open de chaque template xls via:
1 2
| ThisWorkbook.VBProject.References.AddFromFile Filename:=ThisWorkbook.Path & "\" & "MM_TMX_Generic_Macro.xla"
ThisWorkbook.VBProject.References.AddFromFile Filename:=ThisWorkbook.Path & "\" & "MM_SW_TMX_Specific_Macro.xla" |
Et je les décharge dans le Workbook_BeforeClose; j'ai bien mis des noms de projet différents sous VBE, et les références se chargent/déchargent correctement.
Non sans avoir galéré (oui bon je les trouvais pas à cause de satanés "Option Private Module...), j'arrive désormais:
- à utiliser les procédures de ces références dans le code du fichier Excel (avec <NomDuProjet>.<NomDeLaProcédure>):
TmxGenericProject.UpdateStatistics ThisWorkbook
- et aussi à appeler une procédure de l'une des deux références par l'autre via la commande Run (Run("<NomDelaProcedure>", <liste des éventuels arguments>).
Run "TemplateSpecific_updateStatistics", wb
Là où j'ai un problème, c'est pour mes données de configuration: Etant spécifiques à un template, j'ai stocké mes constantes dans chaque MM_XXX_TMX_Specific_Macro.xla mais elles doivent servir aux procédures de MM_TMX_Generic_Macro.xla.
J'arrive à accéder aux constantes d'une référence depuis le code du fichier xls (avec <NomDuProjet>.<NomDeLaConstante>), mais je n'y arrive pas d'une référence à l'autre.
J'ai pas mal cherché sans trouver de réponse: Est-ce possible?
=> J'ai pensé à définir la config par des fonctions plutôt que des constantes dans chaque MM_XXX_TMX_Specific_Macro.xla puis utiliser la commande "RUN" dans MM_TMX_Generic_Macro.xla pour l'appeler mais je ne sais pas si c'est une bonne solution: je n'aime pas trop multiplier les "RUN" qui sauf erreur peuvent masquer des erreurs que l'on verrait facilement sans.
=> Il semble aussi possible d'importer des éléments avec VBComponents et Import mais ça me semble moins propre que les références: Si j'ai bien compris, je devrais éclater au moins le MM_TMX_Generic_Macro.xla en .bas et .frm pour l'importer dans chaque MM_XXX_TMX_Specific_Macro.xla.
Si non, peut-être que la structure que j'ai adoptée n'est pas la bonne.
Comment me conseillez-vous de faire?
De la même façon, est-il possible pour une référence d'accéder à des constantes du fichier xls (pas réussi là non plus
)?
NB: Je veux pouvoir ouvrir des fichiers issus de templates différents en même temps et que les macros appliquent toujours la bonne config au bon fichier; ça doit être transparent pour l'utilisateur.
Merci d'avance à tous ceux qui m'aideront.
PS: Désolé pour le pavé...
Partager