Escキーでマクロを停止させない


終了までに時間がかかるようなマクロを実行しているとき、Escキーを押すとマクロを一時停止することができます。

一時停止すると上のようなダイアログボックスが表示され、マクロの継続や終了、またはデバッグ作業への移行などを選択できます。

マクロの作成中にはとても便利な機能ですが、第三者が操作するマクロの場合は「Escキーを押されても停止させたくない」と思うこともあるでしょう。マクロ実行中に押されたEscキーを制御するには、ApplicationオブジェクトのEnableCancelKeyプロパティに動作を表す次の定数を指定します。

定数 動作
xlDisabled Escキーを無視します
xlInterrupt プロシージャを停止します(標準)
xlErrorHandler エラーを発生させます

省略した場合の標準では定数xlInterruptが指定されたことになっています。定数xlDisabledを指定すると、マクロ実行中にEscキーが押されても無視されます。

もっと詳細に制御したいのでしたら定数xlErrorHandlerを指定します。定数xlErrorHandlerはEscキーが押されたときエラーを発生させます。エラー番号は「18」です。エラートラップをしかけることで、Escキーが押されたかどうかを判定することが可能です。

次のサンプルは、マクロ実行中にEscキーが押されたときメッセージを表示し、マクロを終了するかどうかを選択できます。また、Integerで宣言した変数 j に有効桁数を超える数値が代入されるようにしてありますので、何もしなくてもエラーが発生します。

Sub Sample()
    Dim i As Long, j As Integer
    Application.EnableCancelKey = xlErrorHandler
    On Error GoTo MyError
    For i = 1 To 33000
        Range("A1") = i
        j = i
    Next i
    Exit Sub
MyError:
    If Err.Number = 18 Then
        If MsgBox("マクロを終了しますか?", 292) = vbNo Then
            DoEvents
            Resume
        End If
    Else
        MsgBox "予期しないエラーが発生しました" & vbCrLf & _
            Err.Description, vbCritical
    End If
End Sub

「On Error GoTo MyError」を指定していますので、何らかのエラーが発生するとラベルMyErrorにジャンプします。そこでエラー番号からエラーの内容を判定します。エラー番号「18」が「Escキーが押された」ことによるエラーですので、マクロを終了するかどうかの確認メッセージを表示します。もし「いいえ」(=終了しない)が選択された場合は「Resume」で、エラーが発生した時点からマクロを再開させます。このとき「DoEvents」を実行しているのは、画面を強制的に書き換えるためです。これがないと「マクロを終了しますか?」のダイアログボックスが表示されたままになることがあります。

For Nextステートメント内で「j = i」としています。これは単に「変数 i の数値を変数 j に代入せよ」という意味ですが、変数 i はLong型、変数 j はInteger型で宣言しています。Integer型は32767までしか代入できませんから、i が32768になるとエラーが発生します。これは、同じエラートラップで「Escキーによるエラー」と「その他のエラー」を判別するためのサンプルです。