dポイントプレゼントキャンペーン実施中!

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

ひょっとしてOn Error Goto 0で止めないと、連続しているプロシージャの最後まで有効なのでしょうか?

A 回答 (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をかく必要があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/05/20 15:30

>そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。



記述の在るプロシージャ内だけだと思います。

が、その中で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"も表示されるはずですよね?

補足日時:2005/05/20 13:57
    • good
    • 0

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"へ戻るようです。

補足日時:2005/05/20 13:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!