VBA错误的三种类型
语法错误:输入代码不符合VBA编写规范;运行时错误:程序运行时发生的错误;逻辑错误:语法和运行都没问题,结果不正确;这里讲的错误主要是运行时的错误;
错误捕获和处理
VBA中使用On Error语句捕获错误,该语句用于启动一个错误处理程序并指定该子程序在一个过程中的位置,或者用来禁止一个错误处理程序。
如果不使用On Error语句,运行时的任何错误都会显示错误信息、终止程序;
错误处理程序依靠Err对象的Number属性中的值来确定错误发生的原因;在其他任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先测试或存储Err对象中相关的属性值。Err对象中的属性值只反映最近发生的错误。Err.Description中包含有与Err.Number相关联的错误信息。
Err.Number值介绍:
引用Err对象等同于访问Err.Number属性,MsgBox Err和MsgBox Err.Number是等同的;
On Error语句
On Error GoTo line:启动错误处理程序,如果发生一个运行时错误,则会跳到line标号处开始执行错误处理程序。标号line必须位于与On Error语句相同的过程中,否则会发生编译时间错误。这个line也可以是其他命名;
sub test() on error goto line1: debug.print "do something" line1: ' 程序如果遇到错误,跳转到该位置往下运行 debug.print "do other things" end sub 123456
案例:打开工作簿处理
Function workbook_open(file_path As String) ' 打开工作簿 Dim wb As Workbook On Error Resume Next ' 遇到错误,跳过 Set wb = Workbooks.Open(file_path) If Err <> 0 Then ' 如果打开工作簿报错,直接结束程序,不运行下面代码 Exit Function End If Debug.Print "处理工作表的其他逻辑" End Sub 1234567891011 On Error Resume Next:
如果一个运行时错误发生,程序会转到发生错误语句的下一条语句,并在此继续运行。访问对象时要使用这种形式而不使用On Error GoTo。类似于python总的pass.
sub deal_err() on error resume next debug.print "do something" ' 这段代码,如果报错,继续错误后下一条代码运行 if err <> 0:debug.print "如果遇到错误,可以在这里添加一点错误处理程序" end if on error goto 0 ''结束异常处理,下面语句如果遇到错误,会抛出错误信息,终止程序,这个0不会跳转,表示结束; debug.print "do other things" end sub 12345678910
# python try:print("do something")num = 1 / 0 except Exception as e:pass # 跳过错误继续运行下一条语句 123456 On Error GoTo 0:
禁止当前过程中任何已启动的错误处理程序。如果没有On Error GoTo 0语句,则在退出过程时,错误处理程序会自动关闭。
在错误未发生时,为了防止错误处理程序代码继续运行,一般在紧靠着错误处理程序的前面写入ExitSub、Exit Function或Exit Property语句。
Resume语句
Resume:如果错误和错误处理程序出现在同一个过程中,则从产生错误的语句处恢复运行。如果错误出现在被调用的过程中,则从最近一次调用包含错误处理程序的过程的语句处恢复运行。Resume Next:
如果错误和错误处理程序出现在同一个过程中,则从紧随着产生错误的语句的下一个语句处恢复运行。如果错误发生在被调用的过程中,则找出最后一次调用包含错误处理程序的过程的语句(或On ErrorResume Next语句),从紧随该语句之后的语句处恢复运行。Resume line:错误处理程序运行结束后,跳转到标号line处恢复运行。line必须和错误处理程序在同一个过程中。
非代码内容提炼自《精通Excel VBA》- 伍云辉