なんだかGoodVibes

日々の勉強メモです。

VBAでエラー色々

こんにちは。今日はVBAのエラー処理関連です。
では、早速サンプルいきます。

  • エラーを発生させる
    ' エラー番号104を発生させる
    Err.Raise Number:=104

    ' 自作のエラーを発生させる
    Err.Raise Number:=1000, Description:="自作エラー発生"

VBAでエラーを意図的に発生させるには
Errオブジェクトを使用します。
そして、Raiseメソッドでエラーを発生させることができます。
Numberでエラー番号を指定します。これは必須となっています。
自作のエラーを作る際は、エラー番号に加え、エラー説明文も指定しています。
エラー番号ですが0〜512は既存のエラーの番号として使われているので、513〜65535を使用しましょう。


  • エラーを回避する(On Error Resume Next)
' ------------------------------------------------
' エラー回避サンプル
' ------------------------------------------------
Sub Sample()

    ' エラーが発生した場合に無視する方法
    Dim loopIdx As Long
    Dim result As String

    On Error Resume Next
    For loopIdx = 1 To 5
        result = result & Sample_sub(loopIdx) & vbCrLf
    Next loopIdx

    MsgBox result
End Sub

' ------------------------------------------------
' エラーを強制的に発生させる関数
' ------------------------------------------------
Function Sample_sub(ByVal idx As Long) As Long

    ' インデックスが3のときに強制的にエラーとなるようにする
    If idx = 3 Then
        Err.Raise Number:=1001, Description:="自作エラー発生"
    End If

    Sample_sub = idx
End Function

このサンプルでは、ループで1〜5を回し
最後にその値をメッセージボックスに表示します。
しかし、ループが3のときに強制的にエラーが発生するようにしています。
そのため、エラー回避しなければ途中でマクロが落ちてしまいます。
そこで、On Error Resume Nextです。
エラーが発生するであろう処理の前にこの記載をすることで、エラーは発生した場合は
無視して後続の処理を実行します。
そのため、最後の結果は「1,2,4,5」と表示されるでしょう。


  • エラーを回避する(On Error GoTo)
' -----------------------------
' エラー回避サンプル
' -----------------------------
Sub Sample()

    ' エラーが発生したら指定した場所にスキップ
    Dim result As String
    On Error GoTo ErrorContinue
    result = "1"
    result = result & vbCrLf & "2"
    Err.Raise Number:=1003, Description:="自作エラー発生"
    result = result & vbCrLf & "3"

    MsgBox result
    Exit Sub

ErrorContinue:
    MsgBox "エラーが発生しました。"

End Sub

こちらもエラー回避のサンプルですが、先程の回避処理とは動きが違います。
今回の方法では、エラーが発生するとしてした場所にスキップします。
エラーが発生する処理の前にOn Error GoTo ジャンプ先と記載します。
サンプルを実行すると、「エラーが発生しました。」というメッセージボックスが表示されます。

ここで、1点注意が必要です。
サンプルを見ると、エラー発生時にジャンプする場所の前でExit Subをしていますね?
これは、エラーが発生しなかった場合に、
エラー用の処理(今回だとエラーメッセージ表示の処理)も実行されてしまうからです。
そのため、エラーが発生しなかった場合を考慮して
エラー用の処理の前で関数を抜ける必要があるのです。

今回の場合、Exit Subをしなかったら、エラーが発生しないようにしても
「エラーが発生しました。」というメッセージボックスが表示されてしまいます。

  • エラーの内容を調べる

Errオブジェクトのプロパティを利用してエラーの内容を知ることができます。
例えば、エラー番号とエラーの説明文を知りたいと思ったら

Err.Number
Err.Description

としたら、エラー番号とエラーの説明文を取得できます。



エラー処理は様々な場面で必要になるので覚えておくといいですね。
VBAのエラー処理については以上です。