2009-07-08 53 views
3

我已經在VBA(Excel)中編寫了一些帶有錯誤處理標籤的代碼。它工作正常,直到我最近注意到錯誤處理代碼每次都被執行,而不僅僅是在發生錯誤時。有人知道爲什麼會發生這種情況嗎?謝謝。爲什麼VBA在沒有錯誤時轉到錯誤處理代碼?

這裏是一個簡單的測試案例,其中兩個 msgboxes會彈出。

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)之後沒有退出子例程。之後顯示下一行代碼被執行,這是「不好」的消息。

你既可以及早的錯誤處理標籤(ExitSub)之前退出子程序或GOTO成功的子程序結束(繞過「錯誤」例程)

1

需要添加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