Court-circuiter l'alerte macro à l'ouverture d'un fichier Excel (XL et VBS)


Excel est protégé contre l'ouverture intempestive de macros par une option "alerte macro" qui peut être activée dans Excel par Outils / options...
(présentation un peu différente dans Excel 97 et les versions suivantes).
Cette option est extrèmement utile et il est vivement recommandé de l'activer en permanence pour éviter notamment les macro-virus.

Par contre, on peut souhaiter éviter de cliquer systématiquement sur le bouton de validation des macros à chaque ouverture de fichiers connus.
Microsoft propose de "signer" les macros pour les identifier comme sures.

Une méthode beaucoup plus simple (mais bien moins sure) consiste simplement à ouvrir le fichier Excel par un script VBScript.
Par exemple, j'utilise souvent le fichier c:\zaza.xls.
Je crée un fichier c:\zaza.vbs (simple fichier texte créé avec le bloc note et enregistré avec l'extension .vbs) contenant quelques lignes :

set xl=createobject("Excel.Application")
xl.visible=true
xl.workbooks.open("C:\zaza.xls")
set xl=nothing
wscript.quit


Lancé depuis l'Explorateur Windows, le VBS va ouvrir une nouvelle instance d'Excel puis lui demander d'ouvrir zaza.xls. Excel va en oublier de lancer l'alerte macro, quel que soit le niveau de sécurité choisi.



Une autre solution, qui peut dans certains cas s'avérer utile, consiste à lancer le fichier excel par l'intermédiaire d'un VBS qui va désactiver temporairement la sécurité macro en agissant sur les bases de registres :

Set ssh = WScript.CreateObject("WScript.Shell")
old2000="rien"
old97="rien"
on error resume next
old2000 = ssh.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\level") '2000+
old97 = ssh.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\options6") '97
if old2000<>"rien" then _
     ssh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\level",1,"REG_DWORD"
if old97<>"rien" then _
     ssh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\options6",0,"REG_DWORD"
on error goto 0
ssh.run "C:\zaza.xls"
wscript.sleep(1000)
on error resume next
if old2000<>"rien" then _
     ssh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\level",old2000,"REG_DWORD"
if old97<>"rien" then _
     ssh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\options6",old97,"REG_DWORD"
on error goto 0
wscript.sleep(1000)
set xl=nothing
set ssh=nothing
wscript.quit


Attention, le script va désactiver l'alerte macro pour toute la session Excel. Le niveau de sécurité ne sera rétabli qu'à la prochaine ouverture d'Excel.

On peu de même cocher la case "faire confiance au projet Visual Basic" (dans Outils / Macro / Sécurité / Editeurs approuvés) avec la commande :
ssh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\accessVBOM",0,"REG_DWORD"
Cette manipulation est très utile quand on veut par exemple utiliser Excel-VBA comme substitut de VB à partir de VBS (en créant puis executant une macro VBA dans un classeur Excel créé pour l'occasion).