在 VBA 中使用 Try-Catch
-
使用
On Error Resume Next
處理 VBA 中的錯誤 -
使用
On Error GoTo 0
處理 VBA 中的錯誤 -
使用
On Error GoTo [Label]
處理 VBA 中的錯誤
Try-Catch
方法可防止在計算機程式設計中發生內部錯誤時程式崩潰。防止系統錯誤並讓程式碼執行順暢流動很有用。
但是,與其他程式語言不同,VBA 沒有 Try-Catch
塊。從好的方面來說,它有專門為錯誤處理過程設計的變通方法。
在本文中,將討論和演示 VBA 中的錯誤處理過程以及幾個示例,這些示例將幫助你在 VBA 專案中實現錯誤處理方案。
錯誤處理程式是程式碼的重要組成部分。當 VBA 編譯器無法處理事情時,它們是我們的首選。
下面列出了 VBA 錯誤處理方法:
On Error Resume Next
- 將忽略任何遇到的錯誤,程式碼將繼續執行。On Error GoTo 0
- 將停止導致錯誤的行上的程式碼並顯示一個描述錯誤的訊息框。On Error GoTo [Label]
- 如果你的程式碼有錯誤,你可以指定要執行的操作。
我們將在下面詳細討論所有這些錯誤處理例程。
使用 On Error Resume Next
處理 VBA 中的錯誤
此錯誤處理程式允許編譯器忽略錯誤並執行下一個程式碼行。它是 VBA 中常用的錯誤處理程式,因為它不需要任何複雜的程式碼來實現。
但是,在使用此錯誤處理程式時,請謹慎行事,因為它會忽略錯誤。由於這些未檢測到的錯誤,程式碼執行可能無法按計劃執行。
On Error Resume Next
最好知道你可能會遇到什麼樣的錯誤。然後,如果你認為忽略這些錯誤是安全的,你可以使用它。
下面的程式碼塊將在沒有錯誤處理例程的情況下輸出錯誤,因為在數學上不允許除以零。
Sub DivideNumbers()
Dim x,y,z as integer
x = 10/4
y = 15/0
z= 2/5
Debug.Print x & vbNewLine & y & vbNewLine & z
End Sub
DivideNumbers
輸出:
Error: ! Runtime Error '11':
Division by Zero
使用 On Error Resume Next
錯誤處理程式:
Sub DivideNumbers()
On Error Resume Next
Dim x, y, z As Integer
x = 10 / 4
y = 15 / 0
z = 2 / 5
Debug.Print x & vbNewLine & y & vbNewLine & z
End Sub
DivideNumbers
輸出:
2.5
0
DivideNumbers
輸出顯示第二行已被跳過,因為該行發生除零
錯誤。
使用 On Error GoTo 0
處理 VBA 中的錯誤
On Error GoTo 0
錯誤處理程式重置編譯器的預設錯誤行為。
那為什麼還要用呢?On Error GoTo 0
錯誤處理程式解決了由 On Error Resume Next
錯誤處理程式引起的未檢測到錯誤的風險。因此,On Error GoTo 0
通常與 On Error Resume Next
結合使用,以在不應發生錯誤的程式碼部分啟用錯誤檢測。
要獲得更好的解釋,請參見下面的程式碼塊:
Sub ErrorSub()
On Error Resume Next
'An error could happen in this area but will not be detected.
On Error Goto 0
'Once an Error occurs, an error message will appear.
End Sub
有關更好的示例,請參見下面的程式碼塊。
Sub DivideNumbers()
On Error Resume Next
Dim x, y, z, a, b, c
x = 3 / 2
y = 0 / 0
z = 2 / 6
Debug.Print x & vbNewLine & y & vbNewLine & z
On Error GoTo 0
a = 8 / 7
b = 2 / 0
c = 2 / 7
Debug.Print a & vbNewLine & b & vbNewLine & c
End Sub
DivideNumbers
輸出:
1.5
0.333333333333333
然後發生錯誤,因為程式碼第二部分的 On Error GoTo 0
否定了 On Error Resume Next
。
Error: ! Runtime Error '11':
Division by Zero
使用 On Error GoTo [Label]
處理 VBA 中的錯誤
上面的兩個錯誤處理程式不處理錯誤;他們要麼跳過了這個錯誤,要麼忽略了這個錯誤。第三個錯誤處理程式 On Error GoTo [Label]
將允許你處理錯誤並讓你選擇發生錯誤時要採取的操作。
使用 On Error GoTo [Label]
有幾個最佳實踐,一個是在發生錯誤時終止程式碼執行,另一個是糾正錯誤,然後重試等等。下面的示例將演示 On Error GoTo [Label]
的用法。
下面的程式碼塊會在發生錯誤時自動終止程式碼。
Sub DivideNumbertoNumber()
On Error GoTo ErrHandler
Dim i As Integer
For i = 5 To -5 Step -1
Debug.Print i / i
Next i
ErrHandler:
End Sub
DivideNumbertoNumber
輸出:
1
1
1
1
1
正如所觀察到的,當 i
= 0 時程式碼執行停止,因為 i
除以 i
意味著 0 除以 0,這將導致溢位。
在下一個示例中,我們將演示如果發生錯誤,如何在立即視窗
中列印。我們還可以使用 Err.Description
屬性來列印實際錯誤。
Sub DivideNumbertoNumber()
On Error GoTo ErrHandler
Dim i As Integer
For i = 5 To -5 Step -1
Debug.Print i / i
Next i
Exit Sub
ErrHandler:
Debug.Print "An Error occured at i is equal to " & i & vbNewLine & "Error Type: " & Err.Description
End Sub
DivideNumbertoNumber
輸出:
1
1
1
1
1
An Error occured at i is equal to 0
Error Type: Overflow
請注意,在沒有發生錯誤的情況下,將 Exit Sub
放在 ErrHandler
之前以在子程式到達 ErrHandler
之前退出子程式。如果沒有插入 Exit Sub
,即使沒有錯誤,編譯器也會執行 ErrHandler
。