(Excel No6)「On Error Resume Next」


いきなりですが、問題です。
次のマクロMacro1を実行するとどういう結果になるでしょう。
===== ちょっと考えましょうか======

Option Explicit

Sub Macro1()
    On Error Resume Next
    Err.Raise 10
    Call Func1
    If (Err) Then
        MsgBox "Macro1_error"
    End If
End Sub

Sub Func1(param1 As Integer)
    On Error GoTo ERR_Func1
    Exit Sub
ERR_Func1:
    MsgBox "Func1_error"
End Sub

===== わかりましたか?======
メッセージボックス"Func1_error"を表示すると思った方、落ち着いて考えましょう。
メッセージボックス"Macro1_error"を表示すると思った方、おめでとうございます!

気持ちは分かりますが、見事に今回の話題にはまっています。
さて、正解は「何も起こらずに終了する」ですね。Err.Raise 10で、エラーを発生させているのでIf (Err) ThenでErr=10だと思われた方もいるかもしれません。
ところが、この段階ではErr=0なんですね。 Func1でOn Errorしてますよね。ここで、0にされてしまうんですね。(Errのヘルプを見てみましょう)
なんでもない事のようですが、この手のミスでえらい目に合う人って結構いるんですよね。せっかくのエラー処理がこれではいけません。Errがクリアされる事を知らないと、はまる事になります。
このように、Errにはクリアされるタイミングがありますので、良く注意してResume Nextした方がよいでしょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください