web-dev-qa-db-ja.com

「on error goto 0」と「on error goto -1」の違い-VBA

VBAの「On error goto -1」と「on error goto 0」の違いを誰でも見つけることができますか? googleとmsdnを試しましたが、運がありません。

39
sterlingalston

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
56
Francis Dean

この回答は、エラーオブジェクトとエラーハンドラの間の混乱に対処します。

エラーオブジェクトErr.Clearを使用してクリアできます。これはエラーハンドラには影響しません。

エラーハンドラーは、On Error Goto <label>を使用して有効になります。エラーが発生するとアクティブになります。

エラーハンドラーはactiveですが、新しいエラーハンドラーを割り当てることはできません。 On Error Goto <label>は効果がありません。 VBAは、新しいエラーハンドラーを割り当てる試みを単に無視します。

Err.Clearを使用しても、エラーハンドラはキャンセルされません。

Goto <label>を使用してコード内の別の場所にジャンプしても、エラーハンドラーはキャンセルされません。エラー処理ブロックでGoto <label>を使用すると混乱を招く可能性があるため、避けてください。実際にはまだアクティブなのに、エラーハンドラはもうアクティブではないと思うかもしれません。

アクティブなエラーハンドラの効果は、新しいエラーハンドラを割り当てることができないことです。 On Error Goto <label>は効果がありません。 VBAは、新しいエラーハンドラーを割り当てる試みを単に無視します。エラーハンドラーがアクティブな間、追加のエラーは処理されません。

アクティブなエラーハンドラを終了する唯一の方法は次のとおりです。

  1. Resume
  2. Resume Next
  3. Resume <label>
  4. On error goto -1
  5. 手順を終了する

これらの方法のいずれかを使用してエラーハンドラを終了すると、エラーオブジェクトもクリアされます。

優れたソース: VBAでのピアソンエラー処理 チップピアソンは、彼の記事でOn error goto -1について言及していません。彼を引用するには:

On Error GoTo -1は、実際の目的を果たさず、正確な方法で使用しない限りExcelアプリケーション全体をロックする可能性があるため、意図的に含めませんでした。はい、On Error GoTo -1は構文的には有効ですが、酔っているティーンエイジャーに銃を与えるようなものです。それから良いものは何もありません。

エラーオブジェクトを使用して、エラーハンドラーを使用せずにインラインでエラーを処理することもできます。 MSDNインラインエラー処理

14
D_Bester