VBAのエラーをハンドリングする3つの方法

VBAで発生するエラーをうまくコントロールしたいことはないでしょうか。

例えば、エラーが発生したら例外的に処理をスキップさせたり、エラーを無視して処理を継続させたりなどです。

けど、そんなときに悩むことは、

・エラー発生時に例外処理を行わせる方法はどうすればよい?
・エラーを無視する方法はどうすればよい?

ですよね。

今回は、
VBAのエラーをハンドリングする3つの方法について
まとめます!



VBAのエラーの種類を把握する

まずはVBAのエラーの種類について把握しておきましょう。

大きく分けて3つあります。

①構文エラー(コンパイルエラー)

構文エラーとは、コード内の構文ミスがあったときに発生します。

たとえば、Forステートメントの最後にNextを付け忘れたり、IfステートメントにThenを入れ忘れたりする場合に発生します。

VBEでリアルタイムにチェックしているときに出るエラー、またはVBAを実行後に発生するエラーが該当します。

②実行時エラー(ランタイムエラー)

構文チェックはクリアしたけど、実行後の内容に不備がある場合に発生するエラーです。

開こうとしたエクセルブックが無かったりする場合などに発生します。

③論理エラー

構文エラー、実行時エラーをクリアし、最後まで実行されますが、シミュレーションとは違う結果になる場合のエラーです。

例えば無限ループに陥ったり、異なる値が算出されたり、0で除算をしようとしたりするときが該当します。

タカヒロ
タカヒロ
大量の処理を行う時に発生しやすいですね。



ハンドリング対象となるエラーの種類は?

エラーには3つの種類があることをご説明しましたが、

エラーをハンドリングする対象は③の論理エラー②の実行時エラーとなります。

①構文エラーが外れるのは、そもそも修正をしないとVBAが機能しないので、必ず修正をしなければならないためです。

次に、エラーハンドリングする比率が高いのは③の論理エラーとなります。

それは②の実行時エラーを無視すると、まったく予期しない結果になるためです。

例えばデータファイルが取得できない時は、エラーを無視したり、例外処理をおこなうよりも、エラーをしっかり出して、ファイルを準備してからリトライした方がよいですよね。

エラーに対する対処はエラー発生後の影響範囲や内容によって、決めていく必要があるということです。

タカヒロ
タカヒロ
エラー発生後の対処は、運用に支障が出る場合がありますので、基本設計書や運用設計書などに記載された方針に従うようにしましょう。



エラーハンドリング①VBAのエラーを無視する「OnErrorResume Next」ステートメント

エラーをハンドリングする一つ目の方法の、VBAのエラーを無視する方法について説明をします。

こちらはカンタンで、

OnErrorResume Next

をVBAのコードの中に入れるだけです。

「OnErrorResume Next」ステートメントを使用すると、エラーは発生しても無視され、処理は継続されます。

例えば大量のデータを繰り返し取得しているときに、値がNullだったり、数値の0が入っていたりする場合エラーが発生しても次のデータを取得し、処理を継続したいときに使用します。

実際にサンプルコードでエラーを再現してみましょう。

A列の各セルに数字を入力し、それぞれ値を取得したあとで割り算行い、Debug printする処理となります。

Sub エラーサンプル1()

    Dim intNum As Integer
    
    For n = 1 To 10
        
        intNum = Cells(n, 1).Value
        
        Debug.Print 10 / intNum
        
    Next

End Sub

今回A1の値が0であるので、割り切れず除算エラーとなります。

エラーの詳細はこちらをご覧ください。

VBA エラー 11「0 で除算しました。」の原因と対処方法

次に「OnErrorResume Next」ステートメントを入力します。

Sub エラーサンプル1()
    On Error Resume Next
    
    Dim intNum As Integer
    
    For n = 1 To 10
        
        intNum = Cells(n, 1).Value
        
        Debug.Print 10 / intNum
        
    Next

End Sub

実行してみますと、

A1の値は無視され、最後まで処理が継続されていることがわかりますね。



エラーハンドリング②エラー発生時に例外処理をする「On Error Goto」ステートメント

VBAにはVB.netやC#などにあるTry~Catch文はありません。

ですので、代わりに「On Error Goto ラベル名」ステートメントを使う形になります。

タカヒロ
タカヒロ
ラベル名は自由に決めてもらえばと思います。

例えば、「OnErrorGoTo エラーハンドリング」とし、「エラーハンドリング:」のところに例外処理を加えます。

サンプルコードでは、エラー発生後、エラー発生個所とエラーの内容をDebug printでコンソールに出力します。

Sub エラーサンプル2()

    Dim intNum As Integer
    
    For n = 1 To 10
    On Error GoTo エラーハンドリング
        
        intNum = Cells(n, 1).Value
        
        Debug.Print 10 / intNum
        
    Next
    
エラーハンドリング:
    Debug.Print _
    "行番号:"; n & vbCrLf & _
    "エラー番号:" & Err.Number & vbCrLf & _
    "エラーの詳細:" & Err.Description
    
End Sub

実行してみましょう。

はい、イミディエイトウィンドウにエラーの内容が表示されましたね!



エラーハンドリング③エラー発生時にエラー無視を無効にする「On Error GoTo 0」ステートメント

「On Error GoTo 0」ステートメントを使うとエラー無視を解除することができます。

例えば、「On Error Resume Next」でエラーを無視しますが、エラーを出したい箇所は冒頭に「On Error GoTo 0」ステートメントを加えます。

サンプルコードでは、エラーを無視する処理とエラー無視を解除する2つの処理を入れています。

Sub エラーサンプル3()
    On Error Resume Next 'エラー無視
    
    Dim intNum As Integer
    
    For n = 1 To 10
        
        intNum = Cells(n, 1).Value
        
        Debug.Print 10 / intNum
        
    Next
    
    On Error GoTo 0  'エラー無視を解除
    
    For n = 1 To 10
        
        intNum = Cells(n, 1).Value
        
        Debug.Print 10 / intNum
        
    Next
    

End Sub

実行してみましょう。

はい、2回目のFor処理のところでエラー無視が無効化され、エラーが発生しましたね。



さいごに

今回は、
VBAのエラーをハンドリングする3つの方法について
まとめました。

VBAのエラーハンドリングは他の言語と比べて少ないのですので、

しっかりと方法を把握するようにしておきたいですね!



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です