人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBAにおけるOn Error処理の上書きについて。
下記マクロ実行時、「!!」の箇所でnormalErrorに飛ばしたいのですが、fatalErrorに飛びます。
normalErrorに飛ばしたいときの表現ってありますか?初歩的な質問かもしれませんがよろしくお願いします。
Sub test()
Dim i As Long
On Error GoTo fatalError
On Error GoTo normalError
i = 1 / 0 '!!
normalError:
fatalError:
End Sub

●質問者: ReoReo7
●カテゴリ:インターネット ウェブ制作
✍キーワード:AS GOTO ON sub test
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● spyglass
●27ポイント

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


2 ● きゃづみぃ
●27ポイント

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 処理を入れなければなりませんね。

初歩的なエラーの指摘をわざわざしていただく結果となり、たいへん申し訳ありませんでした。


3 ● SALINGER
●27ポイント ベストアンサー

エラーを切り分ける場合、エラーがどのコードで起こったかで分けるか、エラーの種類で分けるかの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は型の不一致です。

エラーの種類はこちらをみてください。

http://support.microsoft.com/kb/146864/ja

◎質問者からの返答

ありがとうございます。

err.number

で分かるのですね。

On Error GoTo 0

の意味も初めて知りました。

コードの書き方として参考にさせて頂きました。ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ