学习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