編寫代碼總會出現意想不到的錯誤,VBA中對這些錯誤有怎樣的功能提供給代碼編寫者?
一、On Error Resume Next 忽略錯誤繼續執行語句下一條。此語句執行後,其後面的語句産生的錯誤都會被忽略(且不會給出任何提示),堅定地繼續執行下一語句。如果有Do Loop循環語句,極易産生死循環。所以此語句用起來最簡單,但也極易産生大問題。
二、On Error Goto “标簽” VBA提供的更為良性的錯誤處理語句。發生錯誤後跳轉到“标簽”的語句,标簽後面的語句寫上應對不同錯誤的代碼。那麼怎麼知道出現的錯誤是哪個類别的呢?
VBA提供了1個Err 對象。Err 對象 代表最近一次發生的程序運行時的錯誤。
Err.Number 屬性:指錯誤代碼。就是下圖中的“13”。
VBA的錯誤都有類似的代碼,隻是同樣的錯誤代碼,有時指示的意思有很大差别,讓人很難搞清是哪裡的代碼出問題了。Err.Number 是個可寫的屬性,可以Goto 到錯誤處理語句,執行完語句後,将Err.Number=0 0代表沒有産生錯誤,大于0就表示有錯誤産生。
Err.Description 屬性:該錯誤的描述。如上圖的“類型不匹配”,此描述對于判斷錯誤原因基本沒什麼用。
Err.Clear 方法:将Err的内容清空。
例句:
On Error GoTo wrong
n = 0 \ 0 '執行此句,會産生錯誤,就會跳轉到wrong: 标簽。因上面語句,不會産生彈窗。
Exit sub '此句用于隔離 錯誤處理語句與主語句。避免主語句執行完後,還要運行錯誤處理語句
wrong:
IF Err.Number > 0 Then
Msgbox “産生了未知的錯誤,請檢查”
End if
Resume Next '返回産生錯誤的語句,并執行其下一條語句
三、On Error Goto 0 恢複默認的VBA處理錯誤的方式,即彈出錯誤提示,并中斷程序運行。
下面介紹幾種錯誤的産生原因,及處理辦法:
1、類型不匹配,錯誤代碼“13”
(1)賦值與聲明類型不符合。在數組應用中,此錯誤極易遇上。
dim arr() As String
arr = Range("A1:B2") '此時會産生 類型不匹配 錯誤
//單元格賦值給數組時,不可以對arr() 聲明具體類型。隻能 Dim arr() 或 Dim arr() As Variant,就是變體類型,否則必報“13”号錯誤。
//因為VBA認為單元格裡會存儲任何類型的數據(不管現在單元格裡實際存儲數據的類型),所以對接的變量也應該具有任何類型。
(2)但是在下面示例中,又必須聲明為具體的類型
需要 Dim arr() As String 。更好的解決辦法,Dim arr ,将arr 聲明為變體變量,對于聲明為數組适用性更廣。
(3)用For Each 循環中。For Each s In "集合",不管這個集合的數據具體是什麼類型,變量s 都要是變體類型的。否則報"13"錯。
2、 錯誤代碼:91。描述:對象變量或With塊變量未設置。原因(1)賦值時沒寫SET。将對象賦值給變量時,前面需寫上Set 。
(2)引用了“空對象"。如:Dim sh1 as Worksheet sh1.range("A1")=0
Dim sh1 as Worksheet
sh1.range("A1")=0 '這裡會報錯,因為sh1還沒被賦值,是個空對象
3、 錯誤代碼:1004。描述:無具體說明。原因:向Excel發出了不能完成的指令。
例:Cells(i,1).value=0 如果i值為0,Excel根本沒有0行,所以報錯。要注意變量的值是否可能為0。
例2:
Sheets(1).Activate
Sheets(2).Range("B2")=10 '此句沒有問題
Sheets(2).Range(Cells(1,1),Cells(3,3)).Value=9 '此句會報 1004 錯。
//要寫成 Sheets(2).Range(Sheets(2).Cells(1,1), Sheets(2).Cells(3,3)).Value=9
這是因為VBA會将Cells()單元格,認為是當前激活狀态下工作表的Cells(),于是就産生了錯誤。
在跨工作表複制時,雖沒報錯,但常有這種混亂産生。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!