MVP
宋翔,微软全球最有价值专家(MVP),从事多年网络技术服务以及企业信息化管理工作,对Microsoft Office在销售、人力、财务等多方面的应用有比较丰富的经验。主要致力于微软Windows和Office两大系列产品的深入研究与开发,出版过多部Windows和Office方面的书籍。好读书,求甚解,对任何事物喜欢钻研和琢磨。为人谦虚随和,乐于助人,网名“完美”,是多个Windows和Office论坛的版主,并建有自己的个人网站,与读者以及广大电脑爱好者在线交流电脑技术。业余爱好广泛,尤其喜欢不同风格的音乐,擅长唱歌,以欧美流行歌曲为主。
( 3 )在宏的末尾(正常程序的末尾)添加代码行 Exit Sub ,这样可以避免程序未发生错误时执行错误处理程序。
注意:可以在过程的末尾添加多个错误处理程序,但必须确保每个错误处理程序都以 Resume Next 或 Exit Sub 语句结束,这样可以避免从当前错误程序之后继续执行其后的错误处理程序。
举一个简单的例子可能会更直观地反映出上面所说的内容。在下面的代码中,当检测到工作簿中没有指定的工作表时,将出现错误,并执行错误代码,显示一个包含错误号与错误描述的对话框。
Sub 检测工作表是否存在 ()
Dim wksname As String, msg As String
On Error GoTo MyErr
wksName = Worksheets("sx").Name
MyErr:
msg = " 错误 " & Err.Number & " : " & Err.Description
MsgBox msg
End Sub
Sub ErrTest()
Dim x As Integer, y As Integer, z As Single
x = 1
y = 0
On Error GoTo MyErr
MsgBox x / y
MsgBox x / y
MsgBox " 继续执行错误代码行的下一行代码 "
Exit Sub
MyErr:
MsgBox " 第 1 次:除数不能为 0"
Resume Next
End Sub
Sub ErrTest()
Dim x As Integer, y As Integer, z As Single
x = 1
y = 0
On Error GoTo MyErr
MsgBox x / y
On Error GoTo 0
MsgBox x / y
MsgBox " 继续执行错误代码行的下一行代码 "
Exit Sub
MyErr:
MsgBox " 第 1 次:除数不能为 0"
Resume Next
End Sub
Sub ErrTest()
Dim x As Integer, y As Integer, z As Single
x = 1
y = 0
On Error GoTo MyErr1
MsgBox x / y
On Error GoTo MyErr2
MsgBox x / y
MsgBox " 继续执行错误代码行的下一行代码 "
Exit Sub
MyErr1:
MsgBox " 第 1 次:除数不能为 0"
Resume Next
MyErr2:
MsgBox " 第 2 次:除数不能为 0"
Resume Next
End Sub
以上 3 段代码在执行完错误处理程序后,都会返回发生错误的代码之后继续执行。对于本例来说,在执行完错误处理程序后,都会继续执行“ MsgBox " 继续执行错误代码行的下一行代码 " ”代码行。
虽然我们不希望在程序运行时出现错误,但是有些时候我们可以利用错误来提高代码的效率。例如,当用户由于某些原因将工作簿中的某个工作表删除,如果 VBA 程序中中包括操作该工作表的代码,那么当用户运行该程序时,将导致错误发生。此时,可以利用错误来检测要操作的工作表是否存在于工作簿中。代码如下:
Sub 检测工作表是否存在 ()
Dim WksName As String
On Error Resume Next
WksName = Worksheets("sx").Name
If Err.Number <> 0 Then
MsgBox prompt:=" 此工作簿中未找到工作表 sx", Title:=" 错误 "
End If
On Error GoTo 0
End Sub
与那些新人和旧人们共同经历吧!