VBAで発生するエラーをうまく処理したいことはないでしょうか。
例えば、エラーが発生したら例外的に処理をスキップさせたり、エラーを無視して処理を継続させたりなどです。
けど、そんなときに悩むことは、
・エラーを無視する方法はどうすればよい?
ですよね。
今回は、
・VBAのエラーを処理(ハンドリング)する3つの方法「OnErrorResume Next」、「On Error Goto」、「On Error GoTo 0」ステートメント
についてまとめます!
もくじ
VBAのエラーの種類を把握する
まずはVBAのエラーの種類について把握しておきましょう。
大きく分けて3つあります。
①構文エラー(コンパイルエラー)
構文エラーとは、コード内の構文ミスがあったときに発生します。
たとえば、Forステートメントの最後にNextを付け忘れたり、IfステートメントにThenを入れ忘れたりする場合に発生します。
VBEでリアルタイムにチェックしているときに出るエラー、またはVBAを実行後に発生するエラーが該当します。
②実行時エラー(ランタイムエラー)
構文チェックはクリアしたけど、実行後の内容に不備がある場合に発生するエラーです。
開こうとしたExcelブックが無かったりする場合などに発生します。
③論理エラー
構文エラー、実行時エラーをクリアし、最後まで実行されますが、シミュレーションとは違う結果になる場合のエラーです。
例えば無限ループに陥ったり、異なる値が算出されたり、0で除算をしようとしたりするときが該当します。
処理(ハンドリング)対象となるエラーの種類は?
エラーには3つの種類があることをご説明しましたが、
エラーを処理(ハンドリング)する対象は③の論理エラーと②の実行時エラーとなります。
①構文エラーが外れるのは、そもそも修正をしないとVBAが機能しないので、必ず修正をしなければならないためです。
次に、エラー処理(ハンドリング)する比率が高いのは③の論理エラーとなります。
それは②の実行時エラーを無視すると、まったく予期しない結果になるためです。
例えばデータファイルが取得できない時は、エラーを無視したり、例外処理をおこなうよりも、エラーをしっかり出して、ファイルを準備してからリトライした方がよいですよね。
エラーに対する対処はエラー発生後の影響範囲や内容によって、決めていく必要があるということです。
エラー処理(ハンドリング)①VBAのエラーを無視する「OnErrorResume Next」ステートメント
エラーを処理(ハンドリング)する一つ目の方法の、VBAのエラーを無視する方法について説明をします。
こちらはカンタンで、
On Error Resume 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であるので、割り切れず除算エラーとなります。
エラーの詳細はこちらをご覧ください。
次に「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つの方法「OnErrorResume Next」、「On Error Goto」、「On Error GoTo 0」ステートメント
についてまとめました。
VBAのエラー処理(ハンドリング)は他の言語と比べて少ないのですので、
しっかりと方法を把握するようにしておきたいですね!
コメントを残す