VBAのエラー処理

投稿日: 2024年5月29日

エラー処理は、プログラムが予期しないエラーで停止するのを防ぐために重要です。以下にエラーの処理の一覧になります。。

ステートメント(メソッド)内容
On Error GoTo エラーが発生したときに実行する処理を指定する
On Error Resume Next エラーが発生しても、エラーを無視してそのまま処理を続ける
On Error GoTo 0エラーが発生したときに処理を無効にする。エラーが発生したら、エラーメッセージが表示され、処理が中断されるようになる
Resumeエラーが発生したときに実行する処理を実行後、エラーが発生した行に戻る
Resume Nextエラーが発生したときに実行する処理を実行後、エラーが発生した行の次の行に戻る
Resume ラベル指定したラベルから再実行します。

On Error GoTo

基本的なエラー処理の構文

「On Error GoTo」ステートメントは、Excel VBAでエラー処理を行うための基本的な方法です。
これを使うことで、プログラムが予期しないエラーで停止するのを防ぎ、エラーが発生した場合に特定の処理を実行することができます。

「On Error GoTo」ステートメントは、エラーが発生したときにプログラムの実行を別の場所に飛ばすために使います。この飛ばす場所をラベル(任意の名前)で指定します。

Sub YourProcedureName()
    On Error GoTo ErrorHandler ' エラーが発生したらErrorHandlerにジャンプする

    ' ここに通常のコードを書く
    ' 例: 故意にエラーを発生させる
    Dim x As Integer
    x = 1 / 0 ' ゼロで割るエラー

    Exit Sub ' 正常に終了する場合、エラー処理を飛ばす

ErrorHandler:
    ' ここにエラー処理のコードを書く
    MsgBox "エラーが発生しました。エラー番号: " & Err.Number & "、説明: " & Err.Description
End Sub

エラーが発生した時「On Error GoTo」で指定されたラベルにジャンプします。ジャンプ先のラベルから始まるエラー処理のコードが実行されます。

入力された数値にエラーが発生した場合の処理

以下に具体的な例を示します。ユーザーに入力を求め、その入力を数値に変換する際にエラーが発生した場合の処理を行います。

Sub ConvertInputToNumber()
    On Error GoTo ErrorHandler ' エラーが発生したらErrorHandlerにジャンプする

    Dim userInput As String
    Dim number As Double
    
    userInput = InputBox("数値を入力してください:") ' ユーザーに入力を求める
    
    number = CDbl(userInput) ' 入力を数値に変換
    
    MsgBox "入力した数値は " & number & " です"
    Exit Sub ' 正常に終了する場合、エラー処理を飛ばす

ErrorHandler:
    MsgBox "エラーが発生しました。数値を入力してください。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & "説明: " & Err.Description
    ' 必要な後処理を書く
End Sub

このように、「On Error GoTo」ステートメントを使うことで、VBAプログラム内で発生するエラーを適切に処理し、プログラムの実行を継続することができます。

On Error Resume Next

「On Error Resume Next」ステートメントは、Excel VBAでエラー処理を行うためのもう一つの方法です。これを使うことで、エラーが発生してもプログラムの実行を続けることができます。

On Error Resume Nextの基本的な使い方

「On Error Resume Next」は、エラーが発生した場合に、そのエラーを無視して次の行から実行を続けます。この方法を使うと、エラーが発生してもプログラムが止まらずに続行できます。

Sub YourProcedureName()
    On Error Resume Next ' エラーが発生しても次の行に進む

    ' ここに通常のコードを書く
    Dim x As Integer
    x = 1 / 0 ' 故意にエラーを発生させる(ゼロで割るエラー)

    ' ここに続きのコードを書く
    MsgBox "プログラムはエラーが発生しても続行されます。"
End Sub

上記のコードはエラーが発生しない時はプログラムは通常通り実行されます。エラーが発生した時はエラーを無視して次の行から実行が続けられます。

入力された数値にエラーが発生しても続行

以下に具体的な例を示します。ユーザーに入力を求め、その入力を数値に変換する際にエラーが発生してもプログラムを続行します。

Sub ConvertInputToNumber()
    On Error Resume Next ' エラーが発生しても次の行に進む

    Dim userInput As String
    Dim number As Double
    
    userInput = InputBox("数値を入力してください:") ' ユーザーに入力を求める
    
    number = CDbl(userInput) ' 入力を数値に変換
    
    If Err.Number <> 0 Then
        MsgBox "無効な入力です。数値を入力してください。"
        Err.Clear ' エラーをクリア
    Else
        MsgBox "入力した数値は " & number & " です"
    End If
End Sub

この例では、ユーザーが無効な入力をした場合、エラーが発生してもプログラムは続行されます。Err.Numberが0でない場合にエラーメッセージを表示し、エラーをクリアします。

このように、「On Error Resume Next」ステートメントを使うことで、VBAプログラム内で発生するエラーを無視して続行することができます。ただし、エラーが発生したかどうかを適切に確認し、必要な処理を行うことが重要です。

On Error GoTo 0

「On Error GoTo 0」は、Excel VBAにおけるエラー処理の一環として使われるステートメントで、エラー処理を無効化(リセット)するためのものです。
これにより、以降のコードでエラーが発生した場合は、通常通りエラーが発生し、プログラムはエラーメッセージを表示して停止します。

On Error GoTo 0の基本的な使い方

「On Error GoTo 0」を使用することで、エラー処理を無効にして、デフォルトのエラー処理(エラーメッセージの表示とプログラムの停止)に戻すことができます。
これは、特定のブロックのコードでのみエラー処理を行いたい場合や、特定の処理が終わった後にエラー処理をリセットしたい場合に便利です。

Sub YourProcedureName()
    On Error GoTo ErrorHandler ' エラーが発生したらErrorHandlerにジャンプする

    ' ここに通常のコードを書く
    Dim x As Integer
    x = 1 / 0 ' 故意にエラーを発生させる(ゼロで割るエラー)

    On Error GoTo 0 ' ここでエラー処理を無効にする

    ' ここに続きのコードを書く
    x = 1 / "a" ' ここでエラーが発生するとプログラムが停止する

    Exit Sub ' 正常に終了する場合、エラー処理を飛ばす

ErrorHandler:
    MsgBox "エラーが発生しました。エラー番号: " & Err.Number & "、説明: " & Err.Description
    Resume Next ' エラー発生後に次の行から実行を続ける
End Sub

エラーが発生するとErrorHandlerにジャンプします。
On Error GoTo 0でエラー処理を無効にします。これ以降のコードでエラーが発生すると、通常通りエラーメッセージが表示され、プログラムが停止します。

実際の例

リストの要素にアクセスする際に範囲外のインデックスを指定した場合にエラー処理を行い、その後エラー処理をリセットします。

Sub AccessArrayElement()
    On Error GoTo ErrorHandler ' エラーが発生したらErrorHandlerにジャンプする

    Dim arr(1 To 3) As Integer
    arr(1) = 10
    arr(2) = 20
    arr(3) = 30

    Dim i As Integer
    i = 4 ' 存在しないインデックス
    
    
    MsgBox "値は: " & arr(4)
    On Error GoTo 0 ' ここでエラー処理を無効にする

    ' ここでエラーが発生するとプログラムが停止する
    MsgBox "値は: " & arr(i)

    Exit Sub ' 正常に終了する場合、エラー処理を飛ばす

ErrorHandler:
    MsgBox "エラーが発生しました。エラー番号: " & Err.Number & "、説明: " & Err.Description
    Resume Next ' エラー発生後に次の行から実行を続ける
End Sub


On Error GoTo 0を使うことで、エラー処理を有効にする範囲と無効にする範囲を明確に区切ることができます。

このように、「On Error GoTo 0」ステートメントを使うことで、VBAプログラム内でエラー処理の範囲を制御し、必要に応じてエラー処理をリセットすることができます。

Resumeとは

「On Error GoTo 0」を使用するときに「Resume Next」というのを使いました。ここで使用されている「Resume」ステートメントは、Excel VBAでエラー処理を行う際に、エラーが発生した後にプログラムの実行を再開するために使われます。
これを使うことで、エラーハンドラ内で特定の処理を行った後、エラーが発生した行やその次の行からプログラムを再開することができます。

「Resume」には主に3つの使い方があります:

  1. Resume:エラーが発生した行から再実行します。
  2. Resume Next:エラーが発生した次の行から再実行します。
  3. Resume ラベル:指定したラベルから再実行します。

Resumeの使い方

「Resume」は、エラーが発生した行から再実行します。これにより、エラーが発生した行をもう一度実行し、エラーが解決されていない場合は再度エラーが発生します。

Sub ExampleResume()
    On Error GoTo ErrorHandler

    Dim x As Integer
    x = 1 / 0 ' ゼロで割るエラー

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。"
    Resume ' エラーが発生した行から再実行する
End Sub

この場合エラーが解消できず無限ループが発生します。

無限ループになってしまったら
「Ctrl + Brake」または「Ctrl + Pause」 を押します。
キーが無い場合は「Fn」+「B」で代用できる場合があります。

Resume Nextの使い方

「Resume Next」は、エラーが発生した次の行から再実行します。これにより、エラーが発生した行をスキップしてプログラムを続行できます。

Sub ExampleResumeNext()
    On Error GoTo ErrorHandler

    Dim x As Integer
    x = 1 / 0 ' ゼロで割るエラー

    MsgBox "このメッセージは表示されない"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。"
    Resume Next ' エラーが発生した次の行から再実行する
End Sub

Resume ラベルの使い方

「Resume ラベル」は、指定したラベルから再実行します。これにより、エラー発生後に特定のコードブロックにジャンプして実行を再開できます。

Sub ExampleResumeLabel()
    On Error GoTo ErrorHandler

    Dim x As Integer
    x = 1 / 0 ' ゼロで割るエラー

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。"
    Resume ContinueHere ' 指定したラベルから再実行する

ContinueHere:
    MsgBox "エラー後の処理をここに書く"
End Sub

Resumeを使う前に、エラーの原因を特定し、必要な処理を行うことが重要です。そうしないと、同じエラーが再度発生する可能性があります。

このように、「Resume」ステートメントを使うことで、エラー処理後にプログラムの実行を再開する位置を柔軟に制御することができます。適切なエラー処理と組み合わせることで、VBAプログラムの信頼性を向上させることができます。

記事