ExcelVBA技 全般 E13M011

E13M011 (Excel2000~2013)
実行中のマクロを強制終了する

実行中のマクロを強制終了するには[Esc]キーを押します。(又は[Ctrl]+[Break]キーでも同様)
但し、この場合「コードの実行が中断されました」と表示されコードの継続処理(後処理)が出来なくなります。

[Esc]キーによる強制終了を出来ないようにマクロを記述するにはEnableCancelKeyプロパティにxlDisabledを設定します。 このプロパティは慎重に使用してください。このプロパティを xlDisabled に設定すると、無限ループのような、自ら停止しないプロシージャの場合は止めることができなくなります。
 Application.EnableCancelKey = xlDisabled '強制終了を無視します

また、xlErrorHandler を設定すると、エラー処理ルーチンが Resume ステートメントで制御を戻すだけのものの場合はそのプロシージャを止めることができなくなります。

[Esc]キーによる強制終了を有効にするには次の様にxlInterruptを設定します。 なお、プロシージャが終了するとEnableCancelKeyプロパティは常にxlInterruptに戻されます。
 Application.EnableCancelKey = xlInterrupt

[Esc]キーが押されて強制終了した時に何らかの後処理が必要な場合は、EnableCancelKeyプロパティにxlErrorHandlerを設定しエラートラップを行います。 xlErrorHandlerを設定すると実行中のプロシージャに対してエラー番号18が送られ、On Error GoTo ステートメントでトラップ出来ます。
以下にに使用例を示します。

'標準モジュール
Option Explicit

'[Esc]キーが押されて強制終了した時に何らかの後処理が必要な場合のエラートラップ例
Sub example_e13m011()
  Dim ii&, jj&
  On Error GoTo HandleErr
  AppActivate ActiveWindow.Caption
  Application.EnableCancelKey = xlErrorHandler
  MsgBox "この処理には時間がかかります。強制終了は[Esc]キーを押してください", , "example_e13m011"
  Application.DisplayStatusBar = True
  For ii = 1 To 1000
    Application.StatusBar = "実行中です。  " & ii & "/1000"
    For jj = 1 To 1000000
    '
    Next
  Next
  Application.StatusBar = False
  Exit Sub
HandleErr:
  If Err = 18 Then 'ESCが押された
    MsgBox "強制終了しました" & vbCrLf & ii & "/1000"
    '実際はここで後処理を記述
  Else
    MsgBox "エラー:" & Err & vbCrLf & Error
  End If
  Application.StatusBar = False
End Sub