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