在 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。