#15 エラーハンドリング
2021-04-05 00:00:00
マクロの実行中にエラーが発生すると、下のようなメッセージがポップアップ表示されます。マクロを使ったことがある方は見たことがあるのではないでしょうか。
ここでデバッグを選ぶと前に紹介したステップ実行でエラーの調査が開始されますが、なるべくならこのメッセージは出ないようにしたいです。
エラー処理の際に、私が使っている基本パターンは下のようなコードです。
Sub ProcWithErrorHandler() On Error GoTo ErrHandler '処理内容 Exit Sub ErrHandler: MsgBox Err.Description End Sub
「On Error GoTo ErrHandler」 とすると、エラー発生時に ErrHandler:で指定した行に処理が移動します。(「ErrHandler」ではなく別の名前でも大丈夫です。)
Err.Description はエラーの内容を返すので、それをMsgBox で表示することでおおまかなエラーの情報の表示ができます。下のように文章を追加してもよいと思います。
MsgBox "ProcWithErrorHandlerでエラーが発生しました。" & vbCrLf & Err.Description
上記のエラー処理の場合はエラー発生時にはサブプロシージャは終了となります。Exit Subがないと通常のエラーが発生しないケースでもErrHandler: 以下が実行されてしまうので注意が必要です。
エラーの発生原因がある程度特定できる箇所では下のようなエラー処理も有効だと思います。
On Error Resume Next Sheets("SheetA").Select If Err.Number <> 0 Then 'エラー発生時の処理 Err.Clear Sheets("Sheet1").Select End If
「On Error Resume Next」を使うと、エラーが発生しても処理は次の行に移ります。エラーの状態は Err.Number で確認可能で、この値が0でない場合がエラー状態です。
上記のコードではSheetAが存在しない場合にはエラーが発生し、代わりにSheet1が選択されます。エラーの解除のためには Err.Clear を実行してエラー状態をリセットします。
※「On Error Resume Next」は何のエラー処理もしないので、ポップアップが出なくなってもエラーは発生しているので注意が必要です。
エラーの発生時にポップアップからデバッグに移行するデフォルトの状態に戻すには下のように書きます。
On Error GoTo 0
シンプルな例で紹介しましたが、どのプロシージャでどのようなエラーハンドリングをするかなど、プロシージャの機能を考えながら実装できると良いと思います。