在 VBA 中使用 Try-Catch

Glen Alfaro 2023年1月30日 2022年5月18日
  1. 使用 On Error Resume Next 處理 VBA 中的錯誤
  2. 使用 On Error GoTo 0 處理 VBA 中的錯誤
  3. 使用 On Error GoTo [Label] 處理 VBA 中的錯誤
在 VBA 中使用 Try-Catch

Try-Catch 方法可防止在計算機程式設計中發生內部錯誤時程式崩潰。防止系統錯誤並讓程式碼執行順暢流動很有用。

但是,與其他程式語言不同,VBA 沒有 Try-Catch 塊。從好的方面來說,它有專門為錯誤處理過程設計的變通方法。

在本文中,將討論和演示 VBA 中的錯誤處理過程以及幾個示例,這些示例將幫助你在 VBA 專案中實現錯誤處理方案。

錯誤處理程式是程式碼的重要組成部分。當 VBA 編譯器無法處理事情時,它們是我們的首選。

下面列出了 VBA 錯誤處理方法:

  1. On Error Resume Next - 將忽略任何遇到的錯誤,程式碼將繼續執行。
  2. On Error GoTo 0 - 將停止導致錯誤的行上的程式碼並顯示一個描述錯誤的訊息框。
  3. 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