2017-03-17 217 views
-2

在使用vba進行編碼時,我注意到當我們期待一個錯誤,然後寫下「錯誤繼續下一步」。當真正發生錯誤時,err值會增加到1. 下面是一個簡單的示例代碼。錯誤處理和錯誤對象

Dim ws as worksheets 
    On error resume next 
    Set ws = sheets("hellosheet") ' hellosheet doesn't exist 
     If err <> 0 then 
     Msgbox "the worksheet hellosheet doesn't exist" 
     End if 

正如你可以看到hellosheet不存在,使代碼是錯誤的。這部分中的錯誤值是否會增加到1.請幫助我理解如果我缺少某些東西的邏輯。 謝謝

+1

如果你用'F8'單步執行宏,當錯誤行(或正好在錯誤行)之前,可以將鼠標懸停在錯誤行上,它會顯示錯誤信息。或者,添加'Debug.print「錯誤是:」&err「,它會將錯誤號碼打印到即時窗口。如果你想錯誤處理,可能[這個線程](http://stackoverflow.com/q/6688131/4650297)可能會有所幫助。 [或這一個](https://stackoverflow.com/questions/6040164/excel-vba-if-worksheetwsname-exists)不使用錯誤處理。 – BruceWayne

+0

本頁頂部有一個「文檔」鏈接,其中有一個專用於VBA錯誤處理的主題。你有沒有嘗試研究一下? –

回答

0

在這種情況下,錯誤編號實際上是9;但是,除非您將其作爲下一行進行硬編碼,否則您不會在Resume Next中獲得類似的消息框。雖然有些情況下Resume Next是您想要做的事情,但在您的情況下,您需要真正地捕獲錯誤。這將需要它以不同的方式進行設置。

Private Sub() 
Dim ws as Worksheet 
On Error GoTo There_is_an_Error 
Set ws = Sheets("HelloSheet") 
<other code> 

Exit_There_is_an_Error: 
Exit Sub 

There_is_an_Error: 
MsgBox "The Worksheet doesn't exist!" 
Resume Exit_There_is_an_Error 
End Sub 
1

Excel有數百個,如果不是數千個不同的錯誤。 MS有全部的編號和編目,每個都有一個編號和說明。

Err.Number 
Err.Description 

您可以指定發生錯誤時代碼應執行的操作。這個想法是,你將代碼指向錯誤處理代碼,它檢查它是什麼類型的錯誤以及如何處理它。例如,如果試圖打開的工作表不存在,則可能需要代碼創建該工作表,並繼續使用該工作表,如同沒有發生錯誤一樣。

另一種方式來處理錯誤是使用

On Error Resume Next 

在下一行,你可能有一個測試,就像

If Err Then 
    ' what to do 
End if 

這將是完美的創造它被發現片失蹤,但您可能想要測試是否真的發生了這種錯誤。

發生錯誤後,您可能希望在下一次測試之前使用Err.Clear命令,以確定是否發生錯誤,因爲Excel會記住第一個錯誤,並告訴它繼續執行下一個命令。

+0

重要提示'On Error Resume Next' - 這個答案應該提及'On Error GoTo 0'來儘可能快地恢復運行時錯誤*,否則OERN會關閉錯誤處理,然後會出現更微妙/煩人的錯誤。 –