下記マクロ実行時、「!!」の箇所でnormalErrorに飛ばしたいのですが、fatalErrorに飛びます。
normalErrorに飛ばしたいときの表現ってありますか?初歩的な質問かもしれませんがよろしくお願いします。
Sub test()
Dim i As Long
On Error GoTo fatalError
On Error GoTo normalError
i = 1 / 0 '!!
normalError:
fatalError:
End Sub
エラーを切り分ける場合、エラーがどのコードで起こったかで分けるか、エラーの種類で分けるかの2通りになります。
1 コードの場所の場合
on error goto 0 でエラー処理を停止させ該当の場所だけを違うエラー処理にする。
Sub test() Dim i As Long On Error GoTo normalError '処理 On Error GoTo 0 On Error GoTo fatalError i = 1 / 0 '!! On Error GoTo 0 On Error GoTo normalError '処理 Exit Sub normalError: 'エラー処理 Exit Sub fatalError: 'エラー処理 End Sub
2 エラーの種類で分ける。
on error resume next でエラーが起きても処理を止めずに、err.numbarでエラーの種類を判断します。
Sub test2() Dim i As Long On Error Resume Next i = 1 / 0 '!! Select Case Err.Number Case 11 GoTo normalError Case 13 GoTo fatalError End Select On Error GoTo 0 '処理 Exit Sub normalError: 'エラー処理 Exit Sub fatalError: 'エラー処理 End Sub
11というのは0の除算のエラーで、13は型の不一致です。
エラーの種類はこちらをみてください。
fatalErrorとの違いは何でしょうか?
normalErrorだけなら単純なエラー処理は出来るのですが。
--------------------------------
Sub OnErrorTest()
On Error GoTo normalError
i = 1 / 0 '!!
Exit Sub
normalError:
MsgBox "エラー番号:" & Err.Number
MsgBox "エラー内容:" & Err.Description
Resume Next
End Sub
--------------------------------
ありがとうございます。具体的には以下のイメージです。
sub main()
on error goto fatalerror
shori1()
shori2()
fatalerror:
debug.print "致命的エラーです。"
end sub
sub shori1()
on error goto shori1error
i=2/0
shori1error:
debug.print "計算ミスです。処理を続行します。"
end sub
sub shori2()
debug.print "以下の処理は絶対に成功させなければならないので、ミスったら致命的エラーになります。"
'いろんな処理
end sub
回答3まで頂いた後での追記:上記サンプルコードは例が悪いです。無視して下さい。やりたいことが逆に難しくなってしまいました。混乱させてしまう結果となり、すみません。
また、質問文にあるコードで
「「!!」の箇所でnormalErrorに飛ばしたい」とありますが、
質問文のコードでnormalErrorにちゃんと飛んでいるようです(F8でステップ実行したときに、エラー箇所でF8を押したときにEnd Subにカーソルが行くので、normalErrorではなくてfatalErrorに飛んでいるものと思った。これではエラー再現できていることになりません・・・)。
質問がまずかったのですが、質問の趣旨はまったく違うものです。
以下、少し長いですが質問のコードの構造(1000行以上あるのでここにコピーペーストできませんので、骨組みの概略だけ書きます)を書かせて頂きます。
Sub testParent()
On Error GoTo myError
Call testChild
myError:
Debug.Print "ここに飛ぶはずが無い。"
End Sub
Sub testChild()
Dim i As Long
On Error GoTo error1
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error2
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error3
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error4
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error5
'i = 1 / 0 'もしこの処理を実行すれば、ちゃんとerror5に飛んでくれる。
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error6
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error7
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error8
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error9
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error10
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error11
Debug.Print "何かの命令処理。"
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error12
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error13
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error14
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error15
'i = 1 / 0 '【エラー再現できませんでした。】なぜかmyErrorに飛ぶことがある。しかも、コードをまったく変えずにF8で実行すると、ちゃんとerror15に飛ぶ。
On Error GoTo 0 'この行は挿入しなくても、飛ぶ箇所は同じなんですね。
On Error GoTo error16
i = 1 / 0 '【エラー再現できませんでした。】なぜか必ずmyErrorに飛ぶ。コードをまったく変えずにF8で実行しても、myErrorに飛ぶ。
error1:
Debug.Print
Exit Sub
error2:
Debug.Print
Exit Sub
error3:
Debug.Print
Exit Sub
error4:
Debug.Print
Exit Sub
error5:
Debug.Print
Exit Sub
error6:
Debug.Print
Exit Sub
error7:
Debug.Print
Exit Sub
error8:
Debug.Print
Exit Sub
error9:
Debug.Print
Exit Sub
error10:
Debug.Print
Exit Sub
error11:
Debug.Print
Exit Sub
error12:
Debug.Print
Exit Sub
error13:
Debug.Print
Exit Sub
error14:
Debug.Print
Exit Sub
error15:
Debug.Print "通常はここに飛びますが、条件によって飛びません。"
Exit Sub
error16:
Debug.Print "通常はここに飛びますが、飛んでくれません。"
End Sub
http://www.red.oit-net.jp/tatsuya/vb/Err.htm
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_140_02.html
一番目の回答にあるプログラムを一部修正して実行すると
計算ミスです。処理を続行します。
以下の処理は絶対に成功させなければならないので、ミスったら致命的エラーになります。
致命的エラーです。
という結果になります。
修正箇所は shori1()などを Call shori1と変えただけです。
あと このプログラムでは
shori1() shori2() fatalerror: debug.print "致命的エラーです。"
となってますが
これだと shori1とshori2を呼んだ後に debug.print "致命的エラーです。"を実行してしまいます。
質問にあるのもそうです。
Sub test() Dim i As Long On Error GoTo fatalError On Error GoTo normalError i = 1 / 0 '!! normalError: fatalError: End Sub
これだと normalError:の後 そのままfatalError:を実行してるのでは ないのでしょうか?
エラー処理で ちゃんと ジャンプさせるような処理は 入れてるのでしょうか?
Resume Nextとか。
ありがとうございます。その通りです。
きちんと Exit Sub 処理を入れなければなりませんね。
初歩的なエラーの指摘をわざわざしていただく結果となり、たいへん申し訳ありませんでした。
エラーを切り分ける場合、エラーがどのコードで起こったかで分けるか、エラーの種類で分けるかの2通りになります。
1 コードの場所の場合
on error goto 0 でエラー処理を停止させ該当の場所だけを違うエラー処理にする。
Sub test() Dim i As Long On Error GoTo normalError '処理 On Error GoTo 0 On Error GoTo fatalError i = 1 / 0 '!! On Error GoTo 0 On Error GoTo normalError '処理 Exit Sub normalError: 'エラー処理 Exit Sub fatalError: 'エラー処理 End Sub
2 エラーの種類で分ける。
on error resume next でエラーが起きても処理を止めずに、err.numbarでエラーの種類を判断します。
Sub test2() Dim i As Long On Error Resume Next i = 1 / 0 '!! Select Case Err.Number Case 11 GoTo normalError Case 13 GoTo fatalError End Select On Error GoTo 0 '処理 Exit Sub normalError: 'エラー処理 Exit Sub fatalError: 'エラー処理 End Sub
11というのは0の除算のエラーで、13は型の不一致です。
エラーの種類はこちらをみてください。
ありがとうございます。
err.number
で分かるのですね。
On Error GoTo 0
の意味も初めて知りました。
コードの書き方として参考にさせて頂きました。ありがとうございます。
ありがとうございます。
err.number
で分かるのですね。
On Error GoTo 0
の意味も初めて知りました。
コードの書き方として参考にさせて頂きました。ありがとうございます。