Lancer une macro VBA en cliquant sur un lien hypertexte


Le lancement d'une macro VBA Excel par le biais d'un lien hypertexte n'est pas simple :
Si on fait pointer un lien hypertexte sur le nom de la macro, on se contente d'accéder au texte de la macro.
On peut facilement remplacer le clic sur le lien hypertexte par un clic sur une cellule Excel, et intercepter le clic par VBA (Worksheet_SelectionChange), et lancer la macro...
Mais l'utilisation d'un "vrai" lien hypertexte (sans VBA) n'est pas simple.

La solution proposée consiste à diriger le lien hypertexte sur une page html (macro.html), avec en paramètres l'adresse du fichier excel contenant la macro et le nom de la macro (voire des paramètres à transmettre à la macro).
La page html va simplement servir à retransmettre ces paramètres à un VBScript (macro.vbs) qui va lancer la macro, après avoir, si nécessaire; ouvert le fichier la contenant.

La création du lien hypertexte dans Excel se fait par Insertion / lien hypertexte / fichier ou URL : c:\macro.html ; Emplacement dans le fichier : #c:\rien.xls,macrocodile
(l'objectif étant de lancer la macro macrocodile du fichier c:\rien.xls).

Quand on clique sur le lien, on est dirigé vers l'URL :
file:///C:/macro.html#c:\rien.xls,macrocodile
Il suffit de récupérer les paramètres dans la chaîne par quelques lignes de VBScript dans la page html, puis de les transmettre à macro.vbs :

<HTML><HEAD><SCRIPT LANGUAGE="VBSCRIPT">
'extraire les paramètres
txt=document.location.hash
txt=right(txt,len(txt)-1)
txt=replace(txt,","," ")
'envoyer les paramètres au VBS
Set sh = CreateObject("WScript.Shell")
sh.run "c:\macro.vbs " & txt
'revenir à la page contenant le lien hypertexte
history.back()
set sh=nothing
</SCRIPT></HEAD><BODY></BODY></HTML>


Le script va envoyer la ligne de commande :
"c:\macro.vbs c:\rien.xls macrocodile"
qui va lancer le script macro.vbs avec comme paramètres l'adresse du fichier et le nom de la macro.
macro.vbs va se charger de lancer la macro :

'chercher le nom du fichier
nomfich= wscript.Arguments(0)
do while instr(nomfich,"\")>0
nomfich=right(nomfich,len(nomfich)-1)
loop
'chercher l'instance d'Excel ouverte
set xl=GetObject(,"Excel.Application")
'chercher si le fichier cible est ouvert
ouvert=false
for each fich in xl.workbooks
if fich.name=nomfich then ouvert=true
next
if not ouvert then set fch=xl.workbooks.open(wscript.arguments(0))
xl.run nomfich & "!" & wscript.arguments(1)
if not ouvert then fch.close(false)
set xl=nothing
set fch=nothing


cliquez ici pour télécharger les fichiers (zip).
Enregistrez les fichiers macro.html et macro.vbs directement sous c:\.