HOME > 即効テクニック > Excel VBA > その他関連のテクニック > Escキーでマクロを停止する

即効テクニック

その他関連のテクニック

Escキーでマクロを停止する

(Excel 97/2000/2002/2003/2007)
マクロの終了までに長い時間がかかる場合、途中でユーザーが停止できると便利です。
たとえば次のコードは、ステータスバーに1から100000までを表示します。

Sub Sample1()
    Dim i As Long
    For i = 1 To 100000
        Application.StatusBar = i
    Next i
    Application.StatusBar = False
End Sub
このマクロは実行中にEscキーを押すことで中断することができます。 しかし、中断するとVBEが開き、実行中のマクロが表示されてしまいます。 そうではなく、Escキーを押されたことをマクロ内で関知して、ユーザーに「中断しますか?」と確認するには、ApplicationオブジェクトのEnableCancelKeyプロパティにxlErrorHandlerを指定して、エラーを発生させます。 次のコードは、マクロ実行中にEscキーが押されると「中断しますか?」というメッセージを表示します。
Sub Sample2()
    Dim i As Long
    Application.EnableCancelKey = xlErrorHandler
    On Error GoTo MyError
    For i = 1 To 100000
        Application.StatusBar = i
    Next i
    Application.StatusBar = False
    Exit Sub
MyError:
    If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbNo Then
        Resume
    Else
        Application.StatusBar = False
    End If
End Sub
「中断しますか?」のメッセージに対して[いいえ]ボタンがクリックされた場合は、Resumeメソッドを実行して元の処理に復帰します。 このとき、Escキーによって発生したエラーのコードは「18」です。 このエラーコードを調べることで、Escキーが押されてエラーが発生したのか、あるいは何らかの理由で別のエラーが発生したのかを調べることが可能です。 次のコードは、Integerで宣言した変数jの値が32767を超えるとエラーが発生します。
Sub Sample3()
    Dim i As Long, j As Integer
    Application.EnableCancelKey = xlErrorHandler
    On Error GoTo MyError
    For i = 1 To 100000
        Application.StatusBar = i
        j = i
    Next i
    Application.StatusBar = False
    Exit Sub
MyError:
    Select Case Err.Number
    Case 6
        MsgBox Err.Description, vbExclamation
    Case 18
        If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbNo Then
            Resume
        End If
    Case Else
        MsgBox "予期しないエラーが発生しました", vbExclamation
    End Select
    Application.StatusBar = False
End Sub