关于VBA中的错误处理
关于VBA中的错误处理
现在看来关于VBA中的错误处理语句,应该主要有三种形式:①On Error Resume Next;②On Error Goto 0;③On Error Goto ErrorHnadler.可以说这三种就涵盖了⼏乎所有的错误处理语句.下⾯是关于这三种错误处理语句的⼀点认识:
启动⼀个错误处理程序并指定该⼦程序在⼀个过程中的位置;也可⽤来禁⽌⼀个错误处理程序。
语法
On Error GoTo line
On Error Resume Next
On Error GoTo 0
On Error 语句的语法可以具有以下任何⼀种形式:
语句
描述
On Error GoTo line
启动错误处理程序,且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何⾏标签或⾏号。如果发⽣⼀个运⾏时错误,则控件会跳到 line,激活错误处理程序。指定的 line 必须在⼀个过程中,这个过程与 On Error 语句相同;否则会发⽣编译时间错误。
On Error Resume Next
说明当⼀个运⾏时错误发⽣时,控件转到紧接着发⽣错误的语句之后的语句,并在此继续运⾏。访问对象时要使⽤这种形式⽽不使⽤ On Error GoTo。
On Error GoTo 0
禁⽌当前过程中任何已启动的错误处理程序。
说明
如果不使⽤ On Error 语句,则任何运⾏时错误都是致命的;也就是说,结果会导致显⽰错误信息并中⽌运⾏。
在任何过程中,⼀旦错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运⾏。
注意
⼀个错误处理程序不是 Sub 过程或 Function 过程。它是⼀段⽤⾏标签或⾏号标记的代码。
错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发⽣的原因。在其它任何错误发⽣之前,或在调⽤⼀个可能会导致错误发⽣的过程之前,错误处理程序应该先测试或存储 Err 对象中相关的属性值。Err 对象中的属性值只反映最近发⽣的错误。Err.Description 中包含有与Err.Number 相关联的错误信息。
On Error Resume Next
会使程序从紧随产⽣错误的语句之后的语句继续执⾏,或是从紧随最近⼀次调⽤含有 On Error Resume Next 语句的过程的语句继续运⾏。这个语句可以置运⾏时错误于不顾,使程序得以继续执⾏。可以将错误处理程序放置在错误发⽣的地⽅,⽽不必将控件传输到过程中的其它位置。
On Error GoTo 0
停⽌在当前过程中处理错误。即使过程中包含编号为 0 的⾏,它也不把⾏ 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句,在退出过程时,错误处理程序会⾃动关闭。
在错误未发⽣的时候,为了防⽌错误处理程序代码运⾏,请像在下段程序中那样,在紧靠着错误处理程序的前⾯写⼊ Exit Sub、Exit Function 或 Exit Property 语句。
Sub InitializeMatrix(Var1, Var2, Var3, Var4) On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
错误处理程序代码在 Exit Sub 语句之后,⽽在 End Sub 语句之前,从⽽与过程中的流程分开。
vba 字符串转数组On Error 语句⽰例
本⽰例先使⽤ On Error GoTo 语句在⼀个过程中指定错误处理的代码所在。本⽰例中,试图删除⼀已经打开的⽂件从⽽⽣成的错误码为 55。这个错误将由⽰例中的错误处理程序码来处理,处理完後,控制会回到发⽣错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句⽤来改变错误陷阱,以便发觉下⼀个语句产⽣的错误的范围。请注意⽰例中使⽤ Err.Clear 在错误处理完後,清除 Err 对象的属性。
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler '
打开错误处理程序。
Open "TESTFILE" For Output As #1 '
打开输出⽂件。
Kill "TESTFILE" '
试图删除已打开的⽂件。
On Error Goto 0
'
关闭错误陷阱。
On Error Resume Next '
改变错误陷阱。
ObjectRef = GetObject("MyWord.Basic") '
试图启动不存在的对象
'
检查可能发⽣的
Automation
错误。
If Err.Number = 440 Or Err.Number = 432 Then
'
告诉⽤户出了什么事。然后清除
Err
对象。
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear '
清除
Err
对象字段。
End If
Exit Sub '
退出程序,以避免进⼊错误处理程序。
ErrorHandler: '
错误处理程序。
Select Case Err.Number '
检查错误代号。
Case 55 '
发⽣“⽂件已打开”的错误。
Close #1 '
关闭已打开的⽂件。
Case Else
'
处理其他错误状态
. . .
End Select
Resume '
将控制返回到产⽣错误的语句。
49DLL 调⽤规格错误
51内部错误
52错误的⽂件名或数⽬
53⽂件不到
54错误的⽂件⽅式
55⽂件已打开
57 I/O 设备错误
58⽂件已经存在
59记录的长度错误
61磁盘已满
62输⼊已超过⽂件结尾
63记录的个数错误
67⽂件过多
68设备不可⽤
70没有访问权限
71磁盘尚未就绪
74不能⽤其他磁盘机重命名
75路径/⽂件访问错误
76不到路径
91尚未设置对象变量或 With 区块变量
92For循环没有被初始化
93⽆效的模式字符串
94Null 的使⽤⽆效
97不能在对象上调⽤ Friend 过程,该对象不是定义类的实例298系统 DLL 不能被加载
320在指定的⽂件中不能使⽤字符设备名
321⽆效的⽂件格式
322不能建⽴必要的临时⽂件
325源⽂件中有⽆效的格式
327未到命名的数据值
328⾮法参数,不能写⼊数组
335不能访问系统注册表
336ActiveX 部件不能正确注册
337未到 ActiveX 部件
338ActiveX 部件不能正确运⾏
360对象已经加载
361不能加载或卸载该对象
363未到指定的 ActiveX 控件
364对象未卸载
365在该上下⽂中不能卸载
368指定⽂件过时。该程序要求较新版本
371指定的对象不能⽤作供显⽰的所有者窗体
380属性值⽆效
381⽆效的属性数组索引
382属性设置不能在运⾏时完成
383属性设置不能⽤于只读属性
385需要属性数组索引
387属性设置不允许
393属性的取得不能在运⾏时完成
394属性的取得不能⽤于只写属性
400窗体已经显⽰,不能显⽰为模式窗体
402代码必须先关闭顶端模式窗体
419允许使⽤否定的对象
422不到属性
423不到属性或⽅法
424需要对象
425⽆效的对象使⽤
429ActiveX 部件不能建⽴对象或返回对此对象的引⽤
430类不⽀持⾃动操作
432在⾃动操作期间不到⽂件或类名
438对象不⽀持此属性或⽅法
440⾃动操作错误

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。