Excel VBA解讀(163):錯誤處理技術之概述
- 2020 年 1 月 13 日
- 筆記
學習Excel技術,關注微信公眾號:
Excelperfect
在VBA程式碼中,我們經常會看到類似於On Error Resume Next這樣的語句,這是編譯器在程式碼遇到錯誤時自動處理的語句。有時候,在程式碼中進行適當的錯誤處理,可以使程式碼在實際應用後更健壯,避免由於各種原因導致的程式碼異常給用戶帶來的困擾。
下面是一些常用的錯誤處理語句:
On Error Goto 0
當發生錯誤時,程式碼停止運行並顯示錯誤。
On Error Goto -1
清除當前錯誤設置並恢復為默認值。
On Error Resume Next
忽略錯誤,程式碼繼續運行。
On Error Goto [標籤]
當發生錯誤時,跳轉到指定的標籤處執行。
Err對象
當發生錯誤時,存儲錯誤資訊的對象。
Err.Number
錯誤編號。可以在需要檢查發生指定錯誤時使用。
Err.Description
描述錯誤的文本。
Err.Source
在使用Err.Raise時填充。
Err.Raise
允許生成自已的錯誤。
Error函數
從錯誤編號返回錯誤文本。
Error語句
模擬錯誤。已使用Err.Raise代替。
概述
錯誤處理是指為處理應用程式運行時發生錯誤而編寫的程式碼。這些錯誤通常是由編寫程式碼的人無法控制的事情所引起,例如文件丟失、資料庫不可用、數據無效等。
如果認為某種情形下可能發生錯誤,那麼最好編寫特定程式碼以處理這些可能的錯誤。而對於所有其他錯誤,使用通用程式碼進行處理。這就是VBA錯誤處理語句起作用的地方,它們使我們的應用程式能夠優雅地處理所有意外錯誤。
VBA的錯誤類型
在VBA中,有3類錯誤:
1.語法錯誤
2.編譯錯誤
3.運行時錯誤
使用錯誤處理來處理運行時錯誤。
語法錯誤
當一行程式碼輸入完成後按下回車鍵時,VBA會評估其語法是否正確,如果不正確,將顯示一條錯誤消息。
例如,在輸入If語句時忘記了Then,VBA將顯示下圖1所示的錯誤消息。

圖1
編譯錯誤
在編譯所有程式碼時發現的語法錯誤,例如:
1.If語句沒有相應的End If語句
2.For語句沒有Next
3.Select語句沒有End Select
4.調用的Sub過程和Function過程不存在
5.使用錯誤的參數調用Sub過程和Function過程
6.在要求聲明變數時未聲明變數
下圖2所示,當If語句沒有對應的End If語句時,如果運行程式碼就會發生編譯錯誤。

圖2
在編寫程式碼時,我們可以經常運行菜單欄中的「調試—編譯」命令,及早發現編譯錯誤。如果菜單「調試」下的「編譯」命令為灰色,表明程式碼不存在編譯錯誤。
運行時錯誤
程式運行時會發生運行時錯誤。它們通常不在控制範圍內,但也可能是由於程式碼中的錯誤引起。例如,假設程式碼要從外部工作簿中讀取數據,但該工作簿文件不存在,當程式碼嘗試打開該工作簿讀取數據時會發生錯誤。還有一些常見的運行時錯誤,包括資料庫不可用、用戶輸入無效數據、使用的單元格內容應為數字但實際上是文本,等等。
正如我們所看到的,錯誤處理的目的是處理運行時發生的錯誤。
當認為可能發生運行時錯誤時,可將程式碼放置在適當的位置來處理它。例如,通常會將程式碼放置在適當的位置以處理未找到的文件。
下面的程式碼在嘗試打開文件之前檢查文件是否存在。如果該文件不存在,則會顯示一條對用戶更友好的消息,並且退出過程。
Sub OpenFile()
Dim strFile As String
strFile = "C:data.xlsx"
' 使用Dir檢查文件是否存在
If Dir(strFile) = "" Then
'如果文件不存在則顯示消息
MsgBox "不能找到文件: "& strFile
Exit Sub
End If
' 如果文件存在則執行下面的語句
Workbooks.Open strFile
End Sub
當認為某種情形可能發生錯誤時,最好添加程式碼來處理這種情況。我們通常將這些錯誤稱為可預見的錯誤。如果沒有特定的程式碼來處理錯誤,則將其視為意外錯誤。我們使用VBA錯誤處理語句來處理意外錯誤。
這裡需要說明的是,有一類錯誤,程式碼能夠正常運行,但結果不符合要求,這是由於編寫程式碼時誤輸入造成的,例如本來應該是:
result= a + b
結果程式碼輸入成了:
result= a * b
此外,在使用錯誤處理過程之前,應該設置VBA選項「遇到未處理的錯誤時中斷」選項,如下圖3所示。如果選取「發生錯誤則中斷」選項,那麼VBA會忽略錯誤處理程式碼。

圖3