終了までに時間がかかるようなマクロを実行しているとき、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キーによるエラー」と「その他のエラー」を判別するためのサンプルです。