Interrompre une macro (ou un script) par macro (VBA ou VBS)
Si votre programme est supposé tourner pendant une durée très
longue, avec de nombreuses actions répétées en boucle,
il peut être utile de
prévoir un moyen de l'interrompre à la demande.
Un moyen brutal consiste (en VBA) à interrompre le cours de la macro
en tapant sur la touche ESC ou bien sur CTRL+ATTN. Mais dans ce cas, l'interruption est
mal contrôlée et peut intervenir à un moment inadéquat
(par exemple alors qu'un tableau de chiffres est seulement à moitié rempli).
En outre l'automatisation est malaisée.
Et puis, ESC n'interromp pas les VBS, et il peut s'avérer indiuspensable de passer par le gestionnaire de tâches.
Une solution valable aussi bien pour une macro VBA que pour un VBS consiste à
insérer, à un endroit bien choisi de la boucle, une commande d'arret déclenchée
par un évênement extérieur.
Par exemple, la macro peut tester l'existence d'un fichier donné.
Dès que la macro note la présence ou l'absence du fichier, elle s'arrete.
Par exemple, le script suivant (dont l'intérêt est certes
limité) énumère les dimanches à venir (boucle sans fin) et les
inscrits dans un fichier texte :
Set fs = CreateObject("Scripting.FileSystemObject")
set fich=fs.OpenTextFile("c:\dimanches.txt",2,true)
jour=now
do
if weekday(jour)=1 then fich.writeline (day(jour) & " " & month(jour) & " " & year(jour))
jour=jour+1
loop
Pour se donner la possibilité de l'interrompre à la demande, on peut
créer un fichier "c:\arret.txt" au démarrage, puis en vérifier
l'existence à chaque boucle :
Set fs = CreateObject("Scripting.FileSystemObject")
Fs.CreateTextFile "c:\arret.txt", True, False
set fich=fs.OpenTextFile("c:\dimanches.txt",2,true)
jour=now
do
if weekday(jour)=1 then fich.writeline (day(jour) & " " & month(jour) & " " & year(jour))
jour=jour+1
if not fs.fileexists("c:\arret.txt") then
fich.close
wscript.quit
end if
loop
Rien n'empêche de faire un script pour supprimer le fichier "arret.txt", et donc
interrompre le script principal :
Set fs = CreateObject("Scripting.FileSystemObject")
fs.deletefile "c:\arret.txt"
set fs=nothing
L'exemple, présenté en VBS est évidemment transposable en VBA.
On peut même utiliser un VBS pour stopper une macro VBA !