- ベストアンサー
エクセルVBAでOn Error Resume Next
エラーを回避するためにOn Error Resume Nextを使用することがありますが、その有効範囲について教えてください。 記述の在るプロシージャ内だけかと思っていたのですが、 どうも記述した以降、End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。 ひょっとしてOn Error Goto 0で止めないと、連続しているプロシージャの最後まで有効なのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Callで呼んだプロシージャにも効くなら、 >Msgbox"test2-2"も表示されるはずですよね? あ、いや、On Error Resume Nextがかかれたプロシージャだけで有効です。 No1の補足のケースで言いますと、test1()はエラーを無視しますが、 test2()にはOn Error Resume Nextとはかかれていないのでエラーとなり そこで処理は抜けてしまって制御がtest1()に戻ります。 しかしtest1はエラー無視なのでそのまま処理は進みます。 具体的には・・ Sub test1() Dim x, y On Error Resume Next y = x / 0 →[1]エラーですが無視 MsgBox "test1-1" →[2]表示 Call test2 →[3]CALL →[6]test2はエラーだったが無視 MsgBox "test1-2" →[7]表示 End Sub Sub test2() Dim x, y MsgBox "test2-1" →[4]表示 y = x / 0 →[5]エラーでTest2は抜ける(終了) MsgBox "test2-2" Call test3 End Sub もし、エラーでも"test2-2"を表示したいのでしたら、 test2にもOn Error Resume Nextをかく必要があります。
その他の回答 (2)
- fpc-furu
- ベストアンサー率100% (1/1)
>そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。 記述の在るプロシージャ内だけだと思います。 が、その中でCALLしているプロシージャを含みます。 Sub f_functin1() On Error Resume Next Call f_function2 End Sub 例えば上のような場合ですと、f_function2でエラーがあったとしても無視されるかと思います。 f_function2はf_functin1プロシージャ内と解釈できるからです。 もし、実行時エラーはだしたくないが、エラー処理はしたいのであれば、私ならこんな感じでかきます。 Sub f_functin1() On Error GoTo ERR Call f_function2 EXT: Exit Sub ERR: MsgBox ERR.Description 'エラー処理 Resume EXT End Sub
補足
ありがとうございます。 No1の補足にも書いたとおりです。 Callで呼んだプロシージャにも効くなら、Msgbox"test2-2"も表示されるはずですよね?
- Wendy02
- ベストアンサー率57% (3570/6232)
merlionXXさん >End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降 単独プロシージャでは、そんなことはないはずです。実際のコードを見なければ、はっきりといえませんが、サブルーチン上では、そのまま引き継ぎますので、つい、うっかり失敗しますね。これが、なかなか分からないです。 もう1つ、うっかりするのは、ループなどしている場所で、On Error Resume Next と On Error Gto 0 で挟まれた場所の変数は、Err の発生する前の値を確保しているので、Err が発生したら、その変数の中を、一旦空にしてあげないといけませんね。(Test_Err3) 'サンプル Sub test_Err1() On Error Resume Next Err.Raise 3 If Err.Number > 0 Then MsgBox Err.Description End If Call test_Err2 On Error Goto 0 End Sub Sub test_Err2() If Err.Number > 0 Then MsgBox Err.Description End If End Sub '---------- Sub Test_Err3() Dim i As Long, a As Long For i = 65534 To 65538 On Error Resume Next a = Cells(i, 1).Row On Error GoTo 0 MsgBox a Next i End Sub
補足
いつもすみません。 こういうケースです。 Sub test1() Dim x, y On Error Resume Next y = x / 0 MsgBox "test1-1" Call test2 MsgBox "test1-2" End Sub Sub test2() Dim x, y MsgBox "test2-1" y = x / 0 MsgBox "test2-2" Call test3 End Sub Sub test3() Dim x, y MsgBox "test3-1" y = x / 0 MsgBox "test3-2" End Sub test1からtest2を呼び出し、MsgBox "test2-1"まで表示されますが、次のエラーは表示されず、MsgBox "test1-2"へ戻るようです。
お礼
丁寧に解説いただき、ありがとうございます。 なるほど、そういう理屈ですか。 やっと理解できました。