今日学习目标
- 理解错误处理的重要性
- 掌握On Error语句的使用
- 学会自定义错误处理
知识点
1. On Error语句
vba' 遇到错误跳转到标签
On Error GoTo 标签名
' 忽略错误继续执行
On Error Resume Next
' 恢复错误捕获
On Error GoTo 0三种写法:On Error GoTo 标签名 主流程兜底;On Error Resume Next 跳过预期内的单点风险;On Error GoTo 0 恢复默认报错。推荐"GoTo 兜底 + Resume Next 精确豁免"。
2. 错误处理结构
vbaSub 示例()
On Error GoTo ErrorHandler
' 可能出错的代码
Exit Sub
ErrorHandler:
' 错误处理代码
MsgBox "错误: " & Err.Description
End Sub两个细节:正常代码结束后必须有 Exit Sub,否则会"漏"进错误处理段;处理完用 Err.Clear 清除。
3. Err对象
Err 记录最近一次运行时错误:Err.Number 错误号(0 为无错误),Err.Description 英文描述,Err.Clear 清除。出错判断用 If Err.Number <> 0 Then。
今日代码
vbaSub 错误处理示例()
On Error GoTo ErrorHandler
Dim ws As Worksheet
' 可能出错的操作
Set ws = Worksheets("不存在的表")
ws.Range("A1").Value = "测试"
Exit Sub
ErrorHandler:
MsgBox "发生错误!" & vbCrLf & _
"错误号: " & Err.Number & vbCrLf & _
"描述: " & Err.Description, vbCritical, "错误信息"
End Sub
Sub ResumeNext示例()
On Error Resume Next
' 忽略错误继续执行
Worksheets("Sheet1").Range("A1").Value = "测试"
Worksheets("不存在的表").Range("A1").Value = "这行不会出错"
On Error GoTo 0 ' 恢复错误捕获
MsgBox "代码执行完成", vbInformation
End Sub实战场景
把结果导出为 CSV,但目标目录可能不存在,用错误处理兜底:
vbaSub 导出数据()
On Error GoTo ErrorHandler
Open "D:\报表\汇总.csv" For Output As #1
Print #1, "日期,销售额"
Close #1
MsgBox "导出成功", vbInformation
Exit Sub
ErrorHandler:
Close #1 ' 防止文件句柄残留
MsgBox "导出失败:" & Err.Description, vbCritical
End Sub若目录不存在,Open 触发 Run-time error '76': Path not found,跳到 ErrorHandler 而不是崩溃。真实项目里 MsgBox 通常换成写日志。
练习题
- 创建带有完整错误处理的程序
- 处理文件不存在的错误
- 记录错误日志
参考解答
1. 使用On Error GoTo ErrorHandler结构,在ErrorHandler标签处处理错误。 2. 打开文件前检查文件是否存在,使用Dir函数或On Error Resume Next捕获错误。 3. 将错误信息写入文本文件或单元格,使用Open语句和Print #写入文件。
常见错误与排查
Run-time error '9': Subscript out of range——引用了不存在的表。用 Resume Next 加Err.Number探测。Run-time error '13': Type mismatch——InputBox返回空串(用户取消)直接参与计算,先判断是否为 ""。Run-time error '91': Object variable or With block variable not set——Set被 Resume Next 吞掉,对象仍是 Nothing。- 正常执行也进了错误处理段——忘写
Exit Sub,主流程跑完顺序落入标签下代码。 - Resume Next 后忘写
On Error GoTo 0——错误捕获一直关闭,错误被静默跳过。
延伸练习
- 改造实战场景:导出前用
Dir判断文件是否存在,存在则先Kill删除并处理失败。 - 编写
安全打开工作簿函数:失败时返回 Nothing,调用方用Is Nothing判断。
由在线工具箱(www.vba.net)整理制作