スポンサーリンク

Excel VBAエキスパート体験記25(On Error)

VBAエキスパート

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

今回は9章のエラー処理についてレポートしていきます。

ここではOn Errorステートメントについてわかりやすく説明したいと思います。
 
なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
 

<今回の目的>

On Errorステートメントについて理解する

今回の勉強方法
  1. 9章を精読する

  2. 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ステートメントを使用してスマートに処理しましょう。

コメント

タイトルとURLをコピーしました