VBA - 錯誤處理

15 Dec 2018

VBA程式會有3種錯誤情況:

  1. 語法錯誤
  2. 執行階段錯誤
  3. 邏輯錯誤

要使用錯誤處理陳述式,你必須在陳述式指定的位置,加上一段錯誤處理程序;你也可以使用這段程序停止錯誤處理。

語法

錯誤處理陳述式有3種:

  1. On Error GoTo line
  2. On Error Resume Next
  3. On Error GoTo 0

On Error 陳述式可以是下列的任何一種格式:

陳述式 描述
On Error GoTo line 可在錯誤處理常式 line 參數指定的位置開始處理錯誤程序。
line 引數可以是行標籤行號
如果發生執行階段錯誤,控制權會移至 line,使錯誤處理常式作用。
指定的 line 必須位於 On Error 陳述式相同的程序中;否則,會發生編譯階段錯誤。
On Error Resume Next 當發生執行階段錯誤時,控制項會移至錯誤陳述式下一行,並繼續執行陳述式。 存取物件時,請使用這個格式,而不要使用 On Error GoTo
On Error GoTo 0 停用目前程序中任何已啟動的錯誤處理常式。

註解

如果你不使用 On Error 陳述式,任何的執行階段錯誤都可能導致嚴重的錯誤;也就是只會顯示錯誤訊息,就立刻停止執行程式。

一個"啟用中"的錯誤處理器是被 On Error 陳述式開啟的;一個"作用中"的錯誤處理器,是指一個被啟用的錯誤處理器正在處理錯誤的程序中。如果一個錯誤發生在錯誤處理作用中(錯誤發生在 Resume,Exit Sub,Exit FunctionExit Property 陳述式中),目前程序的錯誤處理將無法處理錯誤。控制權將會返回呼叫程序。

如果返回的呼叫程序有啟用中的錯誤處理器,它將會被用來處理該錯誤。如果返回的呼叫程序的錯誤處理器正在作用中,控制權將會再回傳之前的呼叫程序,直到一個被啟用但沒作用中的錯誤處理器被找到。如果沒有被啟用但沒作用中的錯誤處理器被找到,這個地方將會產生嚴重的錯誤。

每次錯誤處理器將控制權回傳給呼叫程序,這個呼叫程序將會變成目前的程序。之後在任何程序處理的錯誤,會繼續執行 Resume 陳述式所指定的程序。

錯誤處理常式不是 Sub 程序或者 Function 程序。它是一段被行標籤行號標示的程式碼區塊。

錯誤處理常式依據 Err 物件的 Number 屬性的值,來判斷錯誤的原因。 錯誤處理常式應該測試,或將相關的屬性值儲存於 Err 物件,在其他錯誤會發生或可能引起錯誤的程序被呼叫之前。Err 物件只會反映最近發生的錯誤。Err.Number 相關的錯誤訊息都包含在 Err.Description 裡面。

On Error Resume Next 在執行階段錯誤時,會緊接著執行 On Error Resume Next 陳述式後面的程序,或者是緊接著執行最近所呼叫的,包含 On Error Resume Next 陳述式的程序。這個陳述式允許繼續執行程序,儘管已經發生執行階段錯誤。你可以放置錯誤處理常式在可能發生錯誤的地方,而不是轉移控制權到程序的其他地方。當其他的程序被呼叫時,錯誤處理常式就會變成非作用中,所以你應該在每一個被呼叫的常式執行 On Error Resume Next 陳述式,如果你想要在常式裡面做錯誤的處理。

當存取物件期間產生處理錯誤,On Error Resume Next 可能會優先於 On Error GoTo

On Error GoTo 0 會停止目前程序的錯誤處理。他不會指定 line 0 作為錯誤處理的起始點,即使程序包含行號為 0 的 line。沒有 On Error GoTo 0 陳述式,當程序結束時會自動停用錯誤處理器。

為了避免在沒有錯誤被觸發的情況下,執行錯誤處理程式碼,請在錯誤處理常事前,放置 Exit Sub,Exit FunctionExit Property 陳述式,如下列程式片段所示:

Sub InitializeMatrix(Var1, Var2, Var3, Var4) 
 On Error GoTo ErrorHandler 
 . . . 
 Exit Sub 
ErrorHandler: 
 . . . 
 Resume Next 
End Sub

在這裡,錯誤處理程式碼會遵循 Exit Sub 陳述式並且先於 End Sub 陳述式,從而分隔程序的流程。錯誤處理程式碼可以放在程序的任何地方。