Do とか For とかのループを回していて、うっかりその終了条件を入れ忘れていると、止められなくて ESC キーを叩きまくるハメになります。そうでなくても、10万回も回すことにしていたループが、あまりに長時間かかるとか、途中で気が変わるかもとかで、いつでも止められるようにしたいことがあります。
標準モジュール CancelButton(), DemoLoop()
'----- 本体のループを止めるフラグ
Public CancelFlag As Boolean
'----- キャンセルボタンに登録するマクロ
Public Sub CancelButton()
CancelFlag = True
End Sub
'----- 本体のループ
Public Sub DemoLoop()
Dim sw
CancelFlag = False
Do While Not CancelFlag
sw = changeLamp(sw)
Application.Wait [now()] + 300 / 86400000
DoEvents
Loop
End Sub
'--- ランプの点滅関数
Private Function changeLamp(sw)
With Range("Lamp").Interior
.Color = vbYellow
If sw Then .Color = vbWhite
End With
changeLamp = Not sw
End Function
ついでながら。本体の Do ループの最後に DoEvents というステートメントを入れてありますが、これは必須です。ループ中にはなかなかイベントを受け付けてくれないので、これがないとキャンセルボタンをクリックしたことを認識してもらえません。