Comment modifier un fichier excel à partir de code VBA situé sur un autre fichier excel?

Bonjour, ma question est résumé dans le titre, mais en vous donnant le contexte d’utilisation vous comprendrez mieux.

J’ai 10 clients avec pour chacun un fichier excel associé (client1.xlsm, client2.xlsm…).

La structure de ces fichiers clients est identique (même nombre d’onglets, même formatage…)

On m’a demandé d’ajouter un onglet dans un fichier client qui contiendrait un bouton qui quand on clique dessus effectue des vérifications dans des données situées dans les autres onglets du fichier.

Je l’ai fait et ça marche pas trop mal (à noter que je suis débutant en VBA mais pas en programmation, beaucoup d’années de java derrière moi).

Important à savoir, ensuite chaque fichier client est utilisé par un commercial différent qui met à jour le fichier. Même si chaque fichier est stocké sur un espace partagé, chaque fichier peut à tout moment être récupéré en local sur le poste d’un commercial pour y être modifié.

Maintenant que ça marche je voudrais « exporter » mon code (ma macro vba) dans les 9 autres fichiers clients, et là comment faire ?

  • soit faire un copier coller de mon code dans les 9 autres fichiers, mais c’est une très mauvaise solution que je ne veux surtout pas adopter, car si un bug est découvert dans mon code ou si je veux apporter des modifications à mon code je serai obligé à chaque fois de répercuter mes modifs dans 10 fichiers
  • soit , mais je ne suis pas certain que ce soit possible, mettre mon code dans un fichier excel externe vide qui ne contiendrait que le code de la macro (appelons-le macro.xlsm par exemple), et appeler en paramètre le nom du fichier client. Ca voudrait dire que pour effectuer des vérifications, le commercial lambda devrait à la fois avoir macro.xlsm et client5.xlsm sous la main.
  • ou alors une autre option que je connais pas.

Pour en revenir à la 2nde option, quelle serait la façon la plus simple ? Je pose la question car j’ai remarqué par hasard en faisant du copier coller de bouton dans un autre excel que quand j’appuyais sur le bouton situé dans l’autre excel le code appelé était celui du 1er exel (alors que je n’avais pas copié/collé le code vba, juste le bouton).
Sinon je me disais que je pourrais afficher à l’utilisateur une popup dans laquelle il sélectionne l’emplacement de son fichier client et ensuite j’ouvre le fichier client comme si c’était le fichier qui contient la macro et j’exécute mon code.

Voilà, j’espère avoir été clair.

Merci pour vos retours.

1 « J'aime »

Je suis en train de lire un livre sur VBA et je découvre qu’on peut exporter/importer des modules, je crois que ça pourrait bien résoudre mon problème… mais si vous pouvez me confirmer ça m’arrange.

Bonjour
Ton problème ne va pas se situer à ce niveau là
Il va plutôt être dans l’identification du chemin de chaque fichier qui risque d’être spécifique à chaque utilisateur
Quelque soit la solution que tu choisisses il sera obligatoire de cibler le fichier dans lequel il faut intervenir donc d’avoir son répertoire et le chemin de celui-ci (mise à jour de celui-ci intégration d’un module etc…)
En prenant la deuxième option (fichier utilisateur avec fichier macro)
2 solutions pour résoudre la difficulté du répertoire :

Mettre ces 2 fichiers imperativement dans un même répertoire
Executer la ou les macros de mise à jour avec le fichier à actualiser ouvert une analyse devra en préambule être effectuée pour en vérifier sa présence active et d’inviter l’utilisateur à l’ouvrir si ce n’était le cas

Voilà ce que moi j’envisagerai
Peut-être d’autre solution peuvent être proposées intégrant cette difficulté

Merci pour ta réponse FFO, mais je pense que l’option export/import de module me convient parfaitement : j’ai fait quelques tests et ça a l’air de se comporter comme je l’attends.

En gros : J’écris ma macro normalement dans un fichier client comme si j’ n’avais qu’un seul client, et une fois que je suis satisfait je fais clic droit sur le module qui contient le code VBA puis « export ».

Et de l’autre côté, quand un commercial voudra utiliser ma macro (enfin plutôt mon module) il n’aura qu’à aller dans l’éditeur VBA et faire un clic droit sur le nom du projet et faire « import » et rechercher le nom de mon module. Bon ok ça oblige le commercial à mettre les mains dans la cambouis mais je ferais une jolie doc et de toutes façons ça n’est pas une opération qu’il aura besoin de faire souvent.

Je trouve un peu compliqué cette solution necessitant d’une part l’export du module et ce à chaque utilisateur et pour ces dernier de réalisé son import
Dur dur dur
Reste à espérer une fréquence très réduite
De plus cela nécessite une bonne coordination au risque pour l’un ou plusieurs d’entre eux de ne pas avoir la dernière version en place
Une bonne information devra être orchestrée pour l’éviter
Maintenant c’est toi qui juge mais pour les utilisateurs un fichier macro à récupérer est nettement plus simple que celui d’un module surtout pour des néophytes

Petites précisions dans chaque module importé le nom de la macro devra toujours être identique pour être activé par un même bouton ce qui impliquera la suppression du module déjà en place ou de la même macro qu’elle détient sinon soucis soucis !!!

Tu as raison FFO, l’import de module n’est pas la solution idéale mais je ne pense pas qu’il en existe pour ce cas précis; et puis ça évite de devoir à chaque fois utiliser 2 fichiers excel dès que l’utilisateur a besoin de cliquer sur un bouton.
Pour ta mise en garde au suejt du nom de la macro, je ne pense qu’il y aura de pb car dans mon esprit chaque modif que j’apporterai à mon code sera répercutée par l’écrasement de l’ancien module par un nouveau module donc aucun soucis de conflit de nom.

Merci encore pour tes commentaires.
Lomic

Bonjour

« Pour ta mise en garde au suejt du nom de la macro, je ne pense qu’il y aura de pb car dans mon esprit chaque modif que j’apporterai à mon code sera répercutée par l’écrasement de l’ancien module par un nouveau module donc aucun soucis de conflit de nom. »

Je suppose que la macro dans ce module sera déclenchée par un bouton
Si tel est le cas le nom de celle-ci programmé dans celui-ci sera appelé pour son exécution donc devra toujours correspondre à la dernière version à utiliser

Si le bouton est ciblé sur la macro « macro1 » le nouveau module intégré devra avoir la macro « macro1 » pour être utilisé sinon si le nouveau module a la macro « macro2 » le bouton ne pourra l’exécuter car programmé sur la macro « macro1 » à moins de le reparametrer sur la macro « macro2 » donc des manipulations en plus à prévoir
Fais des essais et tu le constateras
Si tu opères par écrasement de l’ancien module par le nouveau risque de supprimer des procédures éventuellement ajoutées dans le précédent module non présentes dans le nouveau (automatisation de tâches locales par l’utilisateur)
Le risque est présent
Moi même j’utilise des modules en place à cette fin

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.