はじめに
VBAマクロの実行中に、存在しないシートを選択しようとしたり、0で割り算をしようとしたりすると、エラーが発生してプログラムが強制的に停止してしまいます。これは、マクロの利用者にとっては不親切ですよね。
VBAの On Error GoTo
ステートメントを使えば、このような「実行時エラー」が発生した際に、プログラムを止めずに、指定したエラー処理のコードブロックへジャンプさせることができます。これにより、エラーが発生したことをユーザーに丁寧に伝え、安全にマクロを終了させることが可能になります。
この記事では、VBAにおける最も基本的なエラーハンドリング手法である On Error GoTo
の使い方を、分かりやすく解説します。
On Error GoTo
を使ったエラー処理のサンプルコード
このマクロは、Data
という名前のワークシートを開こうと試みます。もしそのシートが存在すれば正常終了のメッセージを、存在しなければエラー処理ブロックへジャンプして、エラーメッセージを表示します。
完成コード
' On Error GoTo を使った基本的なエラーハンドリング
Sub BasicErrorHandlingExample()
'--- エラーハンドラを設定 ---
' これ以降でエラーが発生したら、「ErrorHandler:」へジャンプする
On Error GoTo ErrorHandler
'--- 正常系の処理 ---
' 存在しない可能性のある処理を実行
Worksheets("Data").Activate
' この行は、エラーが発生しなかった場合にのみ実行される
MsgBox "処理が正常に完了しました。", vbInformation
' 正常終了時は、エラー処理ブロックを飛び越してSubを抜ける
Exit Sub
'--- エラー処理ブロック ---
' ラベル名は任意。コロン(:)を付ける
ErrorHandler:
' エラーが発生した場合にのみ、このブロックが実行される
MsgBox "エラーが発生しました。" & vbCrLf & "「Data」という名前のシートが見つかりません。", vbCritical, "エラー"
' この後、Subは自動的に終了する
End Sub
コードの解説
On Error GoTo ErrorHandler
この一行が、エラーハンドリングを開始する宣言です。VBAは、この行以降で実行時エラーが発生すると、即座に ErrorHandler:
というラベルが付けられた場所に処理をジャンプさせます。
Exit Sub
これが、非常に重要な一行です。もし Exit Sub
がないと、エラーが発生しなかった場合でも、正常系の処理が終わった後に、そのまま ErrorHandler:
の処理が実行されてしまいます。
Exit Sub
は、正常に処理が完了した場合に、エラー処理ブロックを実行することなく、プロシージャを強制的に終了させるためのものです。
ErrorHandler:
エラーが発生した際のジャンプ先を示すラベルです。好きな名前を付けることができ、末尾に必ず**コロン(:
)**を付けます。このラベル以降、End Sub
までの間に、エラー発生時に実行したい処理(メッセージの表示など)を記述します。
まとめ
今回は、VBAの On Error GoTo
を使った、基本的なエラー処理の方法を解説しました。
- プロシージャの冒頭で
On Error GoTo ラベル名
を宣言する。 - 正常系の処理の最後に
Exit Sub
を記述し、エラー処理ブロックをスキップさせる。 - プロシージャの最後に
ラベル名:
を記述し、エラー発生時の処理をまとめる。
この3点セットの構造をマスターするだけで、マクロの安定性が格段に向上し、利用者にとってより親切なツールを作成することができます。