2009-07-08 6 views
3

VBA(Excel)にエラー処理ラベル付きのコードを記述しました。最近エラーが発生したときだけでなく、エラー処理コードが毎回実行されることに気づくまではうまくいきました。誰がなぜこれが起こるのか知っていますか?ありがとう。エラーがない場合、VBAがエラー処理コードに移動するのはなぜですか?

msgboxがポップアップするという簡単なテストケースです。

Sub example() 
    On Error GoTo err_handle 
    MsgBox "OK!" 
err_handle: 
MsgBox "not OK" 
End Sub 

答えて

10

はあなたのルーチンに終了サブを追加したい:フル、について説明用

Sub example() 
    On Error GoTo err_handle 
    MsgBox "OK!" 
    Exit Sub 
    err_handle: 
    MsgBox "not OK" 
End Sub 

Look here

1

これは、最初のメッセージボックス(OK)の後にサブルーチンから戻ってこないためです。それが表示された後、 "not ok"メッセージである次のコード行が実行されます。あなたが(「エラー」ルーチンをバイパス)

1

をお使いのエラーハンドララベル(ExitSub)の前に、早期サブルーチンを終了するか、成功した場合に、サブルーチンの終了を後藤ができどちらか

は他exit subプログラムが実行を継続を追加する必要がありますコードの一部であるラベル

0

他の答えにいくつかの肉を追加するのと同じように。

"err_handle:"はエラー処理コードであり、そのように使用しているためです。他の言語のcatchブロックのようなエラーハンドラではありません。

技術的に「err_handle:」は、ジャンプジャンプを容易にするラベルです。あなたのケースではgotoはちょうどエラー処理のために一般的に受け入れられたパターンは、エラーハンドラと終了プロシージャを持つことです(エラー後藤に)エラーハンドラで使用する

0

を発生します。かなり標準的なコード切れ目は次のようになります:

Public Function Example() As String 
    Dim strRtnVal As String 'Return value variable. 
    On Error GoTo Err_Hnd 
    '*************************************************************************** 
    'Lock interface code here (hourglass, screenupdating etc.) 
    '*************************************************************************** 

    '*************************************************************************** 
    'Your code here. 
    '*************************************************************************** 
Exit_Proc: 
    'Prevents "Error Loops" caused by errors within the exit procedure: 
    On Error Resume Next 
    '*************************************************************************** 
    'Restore Interface. 
    '*************************************************************************** 
    Example = strRtnVal 'Set Return Value. 
    Exit Function 
Err_Hnd: 
    'Display message, do some logging, whatever. 
    Resume Exit_Proc '<- Run exit procedure. 
End Function 
関連する問題