即効テクニック |
マクロの終了までに長い時間がかかる場合、途中でユーザーが停止できると便利です。 たとえば次のコードは、ステータスバーに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