错误处理和错误对象
在使用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.请帮助我理解如果我缺少某些东西的逻辑。 谢谢
在这种情况下,错误编号实际上是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
Excel有数百个,如果不是数千个不同的错误。 MS有全部的编号和编目,每个都有一个编号和说明。
Err.Number
Err.Description
您可以指定发生错误时代码应执行的操作。这个想法是,你将代码指向错误处理代码,它检查它是什么类型的错误以及如何处理它。例如,如果试图打开的工作表不存在,则可能需要代码创建该工作表,并继续使用该工作表,如同没有发生错误一样。
另一种方式来处理错误是使用
On Error Resume Next
在下一行,你可能有一个测试,就像
If Err Then
' what to do
End if
这将是完美的创造它被发现片失踪,但您可能想要测试是否真的发生了这种错误。
发生错误后,您可能希望在下一次测试之前使用Err.Clear命令,以确定是否发生错误,因为Excel会记住第一个错误,并告诉它继续执行下一个命令。
重要提示'On Error Resume Next' - 这个答案应该提及'On Error GoTo 0'来尽可能快地恢复运行时错误*,否则OERN会关闭错误处理,然后会出现更微妙/烦人的错误。 –
如果你用'F8'单步执行宏,当错误行(或正好在错误行)之前,可以将鼠标悬停在错误行上,它会显示错误信息。或者,添加'Debug.print“错误是:”&err“,它会将错误号码打印到即时窗口。如果你想错误处理,可能[这个线程](http://*.com/q/6688131/4650297)可能会有所帮助。 [或这一个](https://*.com/questions/6040164/excel-vba-if-worksheetwsname-exists)不使用错误处理。 – BruceWayne
本页顶部有一个“文档”链接,其中有一个专用于VBA错误处理的主题。你有没有尝试研究一下? –