エラー処理とは

エラー処理とは、プログラムが何かしらのエラーで処理が行えなくなった際に、不具合の影響が最小限で収まるように対処することをいいます。

VBAでのエラー処理は、「On Error」ではじまるステートメントを使用します。

On Errorステートメントには以下のものがあります。

  • On Error GoTo ラベル
  • On Error Resume Next
  • On Error GoTo 0


  • On Error GoTo ラベル

    On Error GoTo ラベルは、エラーが発生した時に、ラベルの位置に処理が移動します。

    例えば、以下の例では8行目の計算でエラーが発生します(0で割ることができないため)。

    エラーが発生すると13行目のErrLabelに移動して、「エラー発生」が表示されます。

    エラー発生時は10行目の「計算が終了しました。」は表示されません。

        Option Explicit
    Sub calc()
      Dim x As Integer
    
      On Error GoTo ErrLabel
      
      'ここでエラーが発生する
      x = 3 / 0
    
      MsgBox "計算が終了しました。”
      
      Exit Sub
    ErrLabel:
      MsgBox "エラー発生"
    End Sub
    


    On Error Resume Next

    On Error Resume Nextは、エラーが発生すると、エラーの次の行から再開して動作するというものです。値渡し参照渡しの2種類があります。

    例えば、以下の例では8行目の計算でエラーが発生します(0で割ることができないため)。

    エラーが発生すると10行目に移動しますので「計算が終了しました」のメッセージが表示されて、プロシージャを抜けます。


    Option Explicit
    
    Sub calc()
      Dim x As Integer
    
      On Error Resume Next
      
      'ここでエラーが発生する
      x = 3 / 0
      
      MsgBox "計算が終了しました。"
      
      Exit Sub
    
    End Sub
    


    Resume Next

    Resume Nextと「On Error Goto ラベル」を組み合わせて使用することができます。

    以下に例を示します。

    8行目でエラーが発生すると「ErrLabel」に移動して処理を行い、17行目のResumeNextに到達すると、エラーが発生した次の行に移動して処理を行います。

    よって、「エラー発生」のメッセージを表示した後に「計算が終了しました」のメッセージが表示されます。


    Option Explicit
    
    Sub calc()
      Dim x As Integer
    
      On Error GoTo ErrLabel
      
      'ここでエラーが発生する
      x = 3 / 0
      
      MsgBox "計算が終了しました。"
      
      Exit Sub
        
    ErrLabel:
        MsgBox "エラー発生"
        Resume Next
    End Sub
    


    On Error GoTo 0

    「On Error Goto ラベル」はラベルの間までに発生したエラーを補足し、「On Error Resume Next」はプロシージャを抜けるまでの間のエラーを補足します

    On Error Goto 0は、On Error Goto ラベル もしくは、On Error Resume Next 以降に配置します。

    On Erro Resume 0 以降は、エラーの補足を無効にするという特徴があります。

    以下に例を示します。

    6行目で「On Error Goto ErrLabel」がありますので、22行目の「ErrLabel」までのに発生したエラーを補足することができます。

    しかし、14行目に「On Error GoTo 0」がありますので、15行目以降で発生したエラーは補足されなくなります。


    Option Explicit
    
      Sub calc()
        Dim x As Integer
    
        On Error GoTo ErrLabel
        
        'ここでエラーが発生する
        x = 3 / 0
        
        MsgBox "計算が終了しました。"
        
        
        On Error GoTo 0
        
        x = 5 / 0
        
        MsgBox "5 ÷ 0 を計算できませんでした"
        
        Exit Sub
        
    ErrLabel:
        MsgBox "エラー発生"
        Resume Next
    End Sub
    


    エラー番号とエラーメッセージの取得

    プログラムにはエラーが付きものです。このエラーの原因を調べる際に役に立つのが、エラー番号とエラーメッセージです。

    エラー番号はErr.Noで取得することができ、エラーメッセージはErr.Descriptionで取得することができます。On Error Goto 0は、On Error Goto ラベル もしくは、On Error Resume Next 以降に配置します。

    以下に、Err.NoとErr.Descriptionの使用例を示します。

    エラーが発生すると、ErrLabelに移動してメッセージボックスにエラー番号とエラーメッセージを表示しています。

    エラー番号は、発生したエラー原因ごとに付けられている番号で、その内容はErr.Messageで取得できます。

    様々なエラーが発生する可能性がある場合は、Select Case文などでErr.Noを判定して、エラーごとに対応することが可能になります。


    Option Explicit
    
    Sub calc()
      Dim x As Integer
    
      On Error GoTo ErrLabel
      
      'ここでエラーが発生する
      x = 3 / 0
      
      MsgBox "計算が終了しました。"
        
    ErrLabel:
        MsgBox Err.Number & ":" & Err.Description
    End Sub