VBAの「On error goto -1」と「on error goto 0」の違いを誰でも見つけることができますか? googleとmsdnを試しましたが、運がありません。
On Error GoTo 0
は、プロシージャに現在存在するエラートラップを無効にします。
On Error GoTo -1
はエラー処理をクリアし、何も設定しないため、別のエラートラップを作成できます。
例:On Error GoTo -1
最初のエラーが発生した後、GoTo ErrorFound
これにより、ルーチンのエラー処理がクリアされ、新しいエラーが設定されます。これにより、GoTo AnotherErrorFound
エラーが見つかったとき。
Sub OnErrorGotoMinusOneTest()
On Error GoTo ErrorFound
Err.Raise Number:=9999, Description:="Forced Error"
Exit Sub
ErrorFound:
On Error GoTo -1 'Clear the current error handling
On Error GoTo AnotherErrorFound 'Set a new one
Err.Raise Number:=10000, Description:="Another Forced Error"
AnotherErrorFound:
'Code here
End Sub
例:エラーGoTo 0の場合
最初のエラーが発生した後、エラー処理が無効になっているため、エラーを受け取ります。
Sub OnErrorGotoZeroTest()
On Error GoTo 0
Err.Raise Number:=9999, Description:="Forced Error"
End Sub
この回答は、エラーオブジェクトとエラーハンドラの間の混乱に対処します。
エラーオブジェクトはErr.Clear
を使用してクリアできます。これはエラーハンドラには影響しません。
エラーハンドラーは、On Error Goto <label>
を使用して有効になります。エラーが発生するとアクティブになります。
エラーハンドラーはactiveですが、新しいエラーハンドラーを割り当てることはできません。 On Error Goto <label>
は効果がありません。 VBAは、新しいエラーハンドラーを割り当てる試みを単に無視します。
Err.Clear
を使用しても、エラーハンドラはキャンセルされません。
Goto <label>
を使用してコード内の別の場所にジャンプしても、エラーハンドラーはキャンセルされません。エラー処理ブロックでGoto <label>
を使用すると混乱を招く可能性があるため、避けてください。実際にはまだアクティブなのに、エラーハンドラはもうアクティブではないと思うかもしれません。
アクティブなエラーハンドラの効果は、新しいエラーハンドラを割り当てることができないことです。 On Error Goto <label>
は効果がありません。 VBAは、新しいエラーハンドラーを割り当てる試みを単に無視します。エラーハンドラーがアクティブな間、追加のエラーは処理されません。
アクティブなエラーハンドラを終了する唯一の方法は次のとおりです。
Resume
Resume Next
Resume <label>
On error goto -1
これらの方法のいずれかを使用してエラーハンドラを終了すると、エラーオブジェクトもクリアされます。
優れたソース: VBAでのピアソンエラー処理 チップピアソンは、彼の記事でOn error goto -1
について言及していません。彼を引用するには:
On Error GoTo -1は、実際の目的を果たさず、正確な方法で使用しない限りExcelアプリケーション全体をロックする可能性があるため、意図的に含めませんでした。はい、On Error GoTo -1は構文的には有効ですが、酔っているティーンエイジャーに銃を与えるようなものです。それから良いものは何もありません。
エラーオブジェクトを使用して、エラーハンドラーを使用せずにインラインでエラーを処理することもできます。 MSDNインラインエラー処理