2017-03-17 186 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会关闭错误处理,然后会出现更微妙/烦人的错误。 –