こんにちは。今日は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のエラー処理については以上です。