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 !