本帖最后由 hwc2ycy 于 2014-2-14 00:08 编辑
VBA入门从第一篇到现在,咱们已经聊了很多,相信有些童鞋也有一直在动手写代码。
在使用代码的过程中肯定会碰到不少的错误。 代码的错误主要分为两种:
1.编译错误 在代码运行之前编译器对代码编译时所检测到的错误。 点击菜单调试,编译VBProject(L)即可对代码进行编译。
当然这步不是必需去操作的,因为在运行代码前,编译器会自动进行编译处理的。
例如下图,把range 拼成了ranges 。
编译错误的代码均会被选中以高亮显示(默认情况下蓝底白字),这类错误也是非常容易解决的。
2.运行错误
故名思议,也就是代码在运行的过程中所产生的错误。
这就有点像是代码中不小心给埋下的地雷,一个不留神就踩雷了。
当然大家也不要谈蛇色变,杯弓蛇影。 例如下图中的代码,给整型变量赋值,这个值超过了整型变量所能承受的的值范围。
我们讲的错误处理也是以运行错误为切入点进行讲解。 当代码在运行的过程中,错误产生后,对于错误的捕获是VBE进行处理的。
VBE会根据代码中的错误处理机制(如果有的话)进行相关的操作。 如果没有相应的错误处理机制则会以对话框的形式告知用户当前所产生的错误,待使用者对对话框做出响应。 所以错误处理的第一步是要在代码中建立一种错误处理机制。 这个机制主要是通过On Error语句来确定。
A.On Error Resume Next
当一个运行错误发生时,控制转到紧接着发生错误的语句之后的语句,并在此继续运行。 这个语句应用得比较多,可以直接忽略任何的错误(不会弹出对话框),但是不代表不能对错误进行处理。
有个设置可以影响到建立了这种忽略机制后是否还会再次弹出系统的错误消息框。
点击菜单工具,选项,在选项对话框里切换到通用页即可找到。
确保错误捕获选项是勾选的第三项(上图中红色标记项)
例如: Dim sht As Worksheet Set sht = Worksheets("test") 上面的代码在当前工作表中如果没有test 工作表时则会产生下标越界的错误。
对于使用者来说,这是一个糟糕的现象。 万一用户是个VBA盲,是点结束还是调试试,人家也会丈二和尚摸不着头脑 稍微修改下:
Dim sht As Worksheet On Error Resume Next Set sht = Worksheets("test") If sht Is Nothing Then MsgBox "当前工作簿中没有test工作表" & vbCr & "代码结束运行" Exit Sub End If
这样以明确的方式告知用户当前所产生的错误,并且结束当前的代码执行。 不需要再让用户做二选一的选择。 但是需要注意的是On error resume next也不要滥用。 在调用另一个过程时,On ErrorResume Next 语句成为非活动的,所以,如果希望在例程中进行嵌入错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。
下面的测试代码大家可以F8单步测试。
Sub test()
On Error Resume Next
Dim sht As Worksheet
Set sht = Worksheets(19)
On Error GoTo 1
Call test2
Call test3
Call test4
Exit Sub
1:
MsgBox "test"
End Sub
Sub test2()
On Error Resume Next
Dim sht As Worksheet
Set sht = Worksheets(20)
MsgBox sht.Name
Exit Sub
2:
MsgBox "test2"
End Sub
Sub test3()
On Error GoTo 3
Dim sht As Worksheet
Set sht = Worksheets(20)
MsgBox sht.Name
Exit Sub
3:
MsgBox "test3"
End Sub
Sub test4()
On Error GoTo 0
Dim sht As Worksheet
Set sht = Worksheets(20)
MsgBox sht.Name
End Sub
|