今日学习目标

  • 理解错误处理的重要性
  • 掌握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. 错误处理结构

vba
Sub 示例() 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。

今日代码

vba
Sub 错误处理示例() 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,但目标目录可能不存在,用错误处理兜底:

vba
Sub 导出数据() 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. 创建带有完整错误处理的程序
  2. 处理文件不存在的错误
  3. 记录错误日志

参考解答

1. 使用On Error GoTo ErrorHandler结构,在ErrorHandler标签处处理错误。 2. 打开文件前检查文件是否存在,使用Dir函数或On Error Resume Next捕获错误。 3. 将错误信息写入文本文件或单元格,使用Open语句和Print #写入文件。

常见错误与排查

  1. Run-time error '9': Subscript out of range——引用了不存在的表。用 Resume Next 加 Err.Number 探测。
  2. Run-time error '13': Type mismatch——InputBox 返回空串(用户取消)直接参与计算,先判断是否为 ""。
  3. Run-time error '91': Object variable or With block variable not set——Set 被 Resume Next 吞掉,对象仍是 Nothing。
  4. 正常执行也进了错误处理段——忘写 Exit Sub,主流程跑完顺序落入标签下代码。
  5. Resume Next 后忘写 On Error GoTo 0——错误捕获一直关闭,错误被静默跳过。

延伸练习

  1. 改造实战场景:导出前用 Dir 判断文件是否存在,存在则先 Kill 删除并处理失败。
  2. 编写 安全打开工作簿 函数:失败时返回 Nothing,调用方用 Is Nothing 判断。

由在线工具箱(www.vba.net)整理制作