我已經在VBA(Excel)中編寫了一些帶有錯誤處理標籤的代碼。它工作正常,直到我最近注意到錯誤處理代碼每次都被執行,而不僅僅是在發生錯誤時。有人知道爲什麼會發生這種情況嗎?謝謝。爲什麼VBA在沒有錯誤時轉到錯誤處理代碼?
這裏是一個簡單的測試案例,其中兩個 msgboxes會彈出。
Sub example()
On Error GoTo err_handle
MsgBox "OK!"
err_handle:
MsgBox "not OK"
End Sub
我已經在VBA(Excel)中編寫了一些帶有錯誤處理標籤的代碼。它工作正常,直到我最近注意到錯誤處理代碼每次都被執行,而不僅僅是在發生錯誤時。有人知道爲什麼會發生這種情況嗎?謝謝。爲什麼VBA在沒有錯誤時轉到錯誤處理代碼?
這裏是一個簡單的測試案例,其中兩個 msgboxes會彈出。
Sub example()
On Error GoTo err_handle
MsgBox "OK!"
err_handle:
MsgBox "not OK"
End Sub
您想將退出小組添加到您的例行:
Sub example()
On Error GoTo err_handle
MsgBox "OK!"
Exit Sub
err_handle:
MsgBox "not OK"
End Sub
Look here一個完整的交代。
這是因爲在第一個消息框(OK)之後沒有退出子例程。之後顯示下一行代碼被執行,這是「不好」的消息。
你既可以及早的錯誤處理標籤(ExitSub)之前退出子程序或GOTO成功的子程序結束(繞過「錯誤」例程)
需要添加exit sub
否則程序繼續執行標籤,因爲它是代碼的一部分
正如澄清添加一些肉給其他答案。
「err_handle:」只是錯誤處理代碼,因爲您正在使用它。它本質上不是像其他語言中的catch塊一樣的錯誤處理程序。
從技術上講,「err_handle:」只是一個便於跳轉的標籤。在你的情況下,goto恰好與錯誤處理程序一起使用(錯誤轉到)
錯誤處理的一般接受模式是有錯誤處理程序和退出過程。一個相當標準的代碼可能看起來像這樣:
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