• ベストアンサー

エクセルVBAでOn Error Resume Next

エラーを回避するためにOn Error Resume Nextを使用することがありますが、その有効範囲について教えてください。 記述の在るプロシージャ内だけかと思っていたのですが、 どうも記述した以降、End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。 ひょっとしてOn Error Goto 0で止めないと、連続しているプロシージャの最後まで有効なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • fpc-furu
  • ベストアンサー率100% (1/1)
回答No.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をかく必要があります。

merlionXX
質問者

お礼

丁寧に解説いただき、ありがとうございます。 なるほど、そういう理屈ですか。 やっと理解できました。

その他の回答 (2)

  • fpc-furu
  • ベストアンサー率100% (1/1)
回答No.2

>そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。 記述の在るプロシージャ内だけだと思います。 が、その中で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

merlionXX
質問者

補足

ありがとうございます。 No1の補足にも書いたとおりです。 Callで呼んだプロシージャにも効くなら、Msgbox"test2-2"も表示されるはずですよね?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

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

merlionXX
質問者

補足

いつもすみません。 こういうケースです。 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"へ戻るようです。

関連するQ&A