category name  »  page title date

処理を中断させる

Do とか For とかのループを回していて、うっかりその終了条件を入れ忘れていると、止められなくて ESC キーを叩きまくるハメになります。そうでなくても、10万回も回すことにしていたループが、あまりに長時間かかるとか、途中で気が変わるかもとかで、いつでも止められるようにしたいことがあります。

たとえば、左のような(赤い)ボタンをつけておいて、これをクリックするとループを抜けることにしましょう。
下に例示したソースコードの DemoLoop() は、点滅セル(セル名="Lamp"としてあります)の黄色を0.3秒ごとに点けたり消したりを延々繰り返すだけのマクロですが、放っておくと永遠にこれが続いて、このマクロを抜け出すことができません。この唯一の終了条件は、CancelFlag が True になった時です。
いっぽう CancelButton() は、CancelFlag を True にします。このマクロを、赤いボタンに登録しておく、というだけで目的達成。ここでは、ワークシート上のボタンですが、もちろんユーザーフォームのコマンドボタンのクリックイベントで CancelFlag の値を更新しても、同じことができます。

標準モジュール      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 というステートメントを入れてありますが、これは必須です。ループ中にはなかなかイベントを受け付けてくれないので、これがないとキャンセルボタンをクリックしたことを認識してもらえません。