Excel VBA エラー処理

スポンサーリンク

エラー

VBAには、以下の3種類のエラーがあります。

  1. コンパイルエラー
    コンパイルエラーは、VBAの構文が間違っている場合に発生する構文エラーです。
  2. 実行時エラー
    実行時エラーはプログラムの実行中に発生するエラーです。実行時エラーが発生すると処理が中断され、エラーメッセージが表示されます。
  3. 論理エラー
    論理エラーは、プログラムの中断はありませんが、意図した結果が得られないエラーのことです。

今回は、実行時エラーの処理方法について説明します。

実行時エラー

プログラムの実行中に何らかの原因でエラーが発生したときにそのままでは、プログラムがデバックモードで停止してしまいます。エラーが起きてもデバックモードで停止しないようにするためには、エラーが発生したときの動作を組み込んでおかなければいけません。

実行時エラーを処理する主なステートメント一覧

ステートメント内容
On Error GoTo
【オンエラーゴートゥ】
エラーが発生したときに指定した行ラベルに
処理をジャンプさせます。
On Error Resume Next
【オンエラーリズームネクスト】
エラーが発生しても、そのエラーを無視して
処理を続行します。

On Error GoTo【オンエラーゴートゥ】ステートメント

エラーが発生したときに指定したラベルに処理をジャンプさせて、デバックモードでのプログラムの中断を防ぎます。
On Error GoTo【オンエラーゴートゥ】ステートメントはエラーが発生する可能性があるコードの前に記述し、エラーが発生した場合に移動する場所を行ラベルで指定しておき、行ラベル以降には、エラー処理のコードを記述しておきます。

On Error GoTo【オンエラーゴートゥ】ステートメント書式と設定値の説明

Sub プロシージャー名()
   On Error GoTo 行ラベル
    実行する処理
   Exit Sub
  行ラベル:
     エラー処理ルーチン
End Sub
  • On Error GoTo 行ラベル
    エラーが発生する可能性があるコードの前に記述します。エラーが発生したらGoToステートメントで指定した行ラベルの位置まで処理をジャンプさせます。行ラベルのラベル名は、長さ半角40文字以内で、大文字小文字の区別はありません。日本語も使用できます。ただし、同一モジュール内で同じ行ラベル名は使用できません。
  • Exit Sub【エグジットサブ】
    エラーが発生しなかった場合にその後のエラー処理ルーチンが実行されないようにExit【エグジット】ステートメントでSub【サブ】プロシージャーを途中で終了させます。
  • 行ラベル:
    エラーが発生した場合に移動する場所です。最初のOn Error GoTo【オンエラーゴートゥ】ステートメントで指定した行ラベル名の後にコロン「:」を記述することにより移動先の行ラベルと認識されます。
  • エラー処理ルーチン
    エラー処理ルーチンとは、エラーが発生したときに実行する処理のことです。通常、エラー処理ルーチンはプロシージャーの最後に記述します。

On Error GoTo ステートメントの使用コードと解説

このコードはワークシートを追加するコードで
InputBox関数を使ってシート名を入力してもらいます。シート名を入力しないでInputBoxのOKボタンを押した場合やすでにあるシート名を入力した場合にエラーになります。

Sub エラー()
Dim シート名 As String
On Error GoTo エラー処理
シート名 = InputBox("シート名を入力してください。")
 Worksheets.Add
 ActiveSheet.Name = シート名
Exit Sub
エラー処理:
 Application.DisplayAlerts = False
 ActiveSheet.Delete
 Application.DisplayAlerts = True
 MsgBox "シート名が取得できませんでした。" & vbCrLf & "または、同じシート名が存在します。"
End Sub
2行目【Dim シート名 As String】
InputBox【インプットボックス】関数でユーザーから受け取るシート名を格納する変数「シート名」を文字列型(String)で宣言します。


3行目【On Error GoTo エラー処理】
On Error GoTo【オンエラーゴートゥ】ステートメントで「エラートラップ」を有効にします。移動先の行ラベル名を「エラー処理」とします。「エラートラップ」とは、エラーが発生した場合に実行させる処理に移動させる仕組みのことをいいます。


4行目【シート名 = InputBox(“シート名を入力してください。”)】
InputBox関数を使用してユーザーに追加するシート名を入力してもらい、変数「シート名」に代入します。


5行目【Worksheets.Add】
Worksheets【ワークシーツ】コレクションのAdd【アド】メソッドを使用してワークシートを追加します。


6行目【 ActiveSheet.Name = シート名】
Worksheet【ワークシート】オブジェクトのName【ネーム】プロパティを使用してアクティブシートにシート名を代入します。シート名はInputBox関数でユーザーから受け取った文字列が格納されている変数「シート名」です。ここで、変数「シート名」に代入されている文字列が長さ0文字の文字列「””」だったり、すでにあるシートと同じ名前だった場合はエラーが発生して3行目のOn Error GoToステートメントに処理が移動します。


7行目【Exit Sub】
エラーが発生しないで、新しいシートが追加された場合はExit【エグジット】ステートメントでSub【サブ】プロシージャーを途中で終了します。


8行目【エラー処理:】
エラーが発生した場合はここまで処理がジャンプしてきます。


9行目【 Application.DisplayAlerts = False】
次の処理で追加したワークシートを削除しますがアラートが出るので、Application【アプリケーション】オブジェクトのDisplayAlerts【ディスプレイアラーツ】プロパティにFalseを設定してアラートの発生を抑制します。


10行目【ActiveSheet.Delete】
6行目のシート名を代入するコードでエラーが発生しても5行目のAddメソッドでワークシートは追加されてアクティブシートになっているのでWorksheet【ワークシート】オブジェクトのDelete【デリイト】メソッドを使用して追加したシートを削除します。


11行目【Application.DisplayAlerts = True】
抑制していたアラートの発生を再開します。


12行目【MsgBox “シート名が取得できませんでした。” & vbCrLf & “または、同じシート名が存在します。”】
MsgBox【メッセージボックス】関数を使用してユーザーにエラーの原因を伝えます。

実行結果 エラーにならない場合



実行結果 エラーの場合



On Error Resume Next【オンエラーリズームネクスト】ステートメント

エラーが発生しても、そのエラーを無視して次の処理を実行するには、On Error Resume Next【オンエラーリズームネクスト】ステートメントを使用します。エラーにより処理が中断することはありませんが、エラーを無視するためプログラムが正常に動作しなくなる可能性がありますので、確実にエラーを無視していい場合だけに使用します。

On Error Resume Next【オンエラーリズームネクスト】ステートメントの書式と設定値の説明

Sub プロシージャー名()
    処理
  On Error Resume Next
  エラーを無視しても実行する処理
End Sub
On Error Resume Nextステートメントはエラーが発生したコードの次のコードから処理を継続します。

On Error Resume Next【オンエラーリズームネクスト】ステートメント使用コード例リンク

以上でエラー処理についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告