前回はExcel VBAエキスパートスタンダードのデバッグについて勉強しました。
前回までの記事はこちら

今回は9章のエラー処理についてレポートしていきます。
ここではOn Errorステートメントについてわかりやすく説明したいと思います。
なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
<今回の目的>
On Errorステートメントについて理解する
-
9章を精読する
-
On Errorステートメントについてわかりやすく説明する
結論
いきなりですが結論です。
On Errorステートメントはマクロ実行中にでるエラーを回避したり無視する際に使います。
次から詳しく説明します。
サンプル
今回はエラーを実際に体験する為以下のExcelを用意しました。
合計点数/教科数で一人一人の1科目の平均点を出すようにします。

なおいくつかはまだ入力されていない状態です。
このExcelに対して以下のコードを実行します。
Sub Sample1()
'E列にC列の値/D列の値の計算結果を表示させる
Dim i As Long
For i = 4 To 12
With ThisWorkbook.Worksheets("Sheet1")
.Cells(i, 5) = .Cells(i, 3) / Cells(i, 4)
End With
Next i
End Sub
結果としては以下のエラーが表示されます。

これはC5/D5についてD5=0と0で割ったことによるエラーです。
このような場合はマクロが途中で停止してしまう為、以降でエラーに対する対処法を説明します。
On Error GoTo ラベル名
On Error GoTo ラベル名はエラーが発生した際特定の処理をさせたいときに使います。
Sub Sample2()
Dim i As Long
For i = 4 To 12
On Error GoTo Error1
With ThisWorkbook.Worksheets("Sheet1")
.Cells(i, 5) = .Cells(i, 3) / Cells(i, 4)
End With
Next i
Exit Sub
Error1: With ThisWorkbook.Worksheets("Sheet1")
.Cells(i, 6).Value = "処理できませんでした"
End With
End Sub
4行目にOn Error GoTo Error1、9行目にExit Sub、10行目からError1:を記述しています。
On Error GoTo Error1で「エラーが発生したらError1に飛びなさい」という記述をしています。
一方10行目にはError1:とエラー時の処理のコードを期しています。
On Error GoTo ではエラーの処理のコードも記載することになるため通常の処理がなされた場合は使用しないように手前にExit Subをいれます。
結果は以下のようになります。

C5/D5ができなかったのでF5に処理ができなかったことを記載しています。
ただこの場合は一つのエラーしか処理できません。
エラーを無視して処理を続けたい場合は次のステートメントを使用します。
On Error Resume Next
On Error Resume Nextはエラーが出ても次の行から処理を続けたいときに使います。
Sub OnErrorResumeNext()
Dim i As Long
For i = 4 To 12
On Error Resume Next
With ThisWorkbook.Worksheets("Sheet1")
.Cells(i, 5) = .Cells(i, 3) / Cells(i, 4)
.Cells(i, 6) = Err.Description
End With
Next i
End Sub
4行目にOn Error Resume Nextを記述しています。また7行目にErr.DescriptionとErrオブジェクトのプロパティを表示させています。
ErrオブジェクトとはErrorの内容が格納されているオブジェクトです。このオブジェクトはErrorが更新されるたびに上書きされます。
Errオブジェクトに対するプロパティは以下のようなものがあります。
プロパティ | 内容 |
Err.Number | エラーを指定する数値を返します |
Err.Source | 最初にエラーを発生させたオブジェクトまたはアプリケーションの名前を示す文字列(String)を返します |
Err.Description | エラーを説明する文字列を返します |
結果は以下のようになります。

エラーは表示されずエラーの詳細についても記載できました。
On Error GoTo 0
On Error GoTo 0は上記2つのエラーの回避プログラムを無効にしたい際に使用します。
つまり元の状態に戻すということです。
ここでのまとめ
On ErrorステートメントはVBAコードの実行中にエラーが発生した場合のプログラムの制御方法です。
エラーは出ないに越したことはないのですが、どうしてもErrorが回避できない場合もあります。
その際はOn Errorステートメントを使用してスマートに処理しましょう。
コメント