Peut-on rendre une macro VBA autonome ? (VBA, VBS)
Il arrive parfois qu'une macro développée en VBA pour Excel n'ait pas vraiment besoin de son support Excel. C'est notamment le cas lorsque la macro ne s'appuie pas sur un tableau Excel, par exemple une macro qui fait de la musique, qui va chercher une information sur Internet...
On se pose souvent la question : ne peut-on séparer la macro d'Excel pour la transformer en fichier exécutable indépendant d'Excel ?
La solution passe généralement par Visual Basic (VB), qui présente l'avantage d'être très complet mais l'inconvénient de ne pas être livré en standard avec Office, ou bien par le VBScript, moins performant mais intégré de manière standard dans Windows.
Un grand nombre de macros VBA peuvent aisément être transposées en VBScript (cliquez ici !) moyennant des adaptations mineures.
Par contre, dans certains cas, VBScript n'est pas suffisamment puissant pour reproduire l'action de VBA. En particulier, VBScript ne gère pas l'utilisation des API.
Une solution consiste à utilise une instance d'Excel masquée pour y faire tourner les API sous VBA (cliquez ici).
Si le résultat est très satisfaisant, la programmation de cette petite usine à gaz est un peu laborieuse puisque le VBS doit ouvrir Excel, créer un nouveau classeur, y insérer une nouvelle macro dans laquelle devront être recopiées toutes les instructions nécessaires au lancement des API, et finalement lancer la macro, sans oublier de refermer le classeur puis Excel...
Pour rendre cette tache moins ingrate, le script proposé au téléchargement va se charger de toutes les opérations. Il suffit à l'utilisateur d'indiquer où se trouve la macro à transposer. Le VBS crée un nouveau fichier VBS dont l'action va reproduire celle de la macro.
Attention, les déclarations et fonctions éventuellement nécessaires au fonctionnement de la macro doivent être placées dans le même module VBA
cliquez ici pour voir le texte complet du script "transposeur"
cliquez ici pour télécharger le script (zippé)
cliquez ici pour lancer le script.