VBA 学习笔记 错误处理、异常处理
On Error 语句
启用错误处理例程并指定该例程在程序中的位置;还可用于禁用错误处理例程。
如果您未使用 On Error 语句,则出现任何运行时错误都是致命的;也就是说,将显示错误消息并停止执行。
语法
On Error GoTo line
On Error Resume Next
On Error GoTo 0
On Error 语句语法可具有以下任意形式:
语句 | 说明 |
---|---|
On Error GoTo line | 1. 如果发生运行时错误,控制分支将跳转到 line 参数所指定的行,开始进行错误处理。 2. line 参数是任何 行标签或 行号。 3. 指定的 line 必须与 On Error 语句在同一个过程中;否则将出现 编译时错误。 |
On Error Resume Next | 在出现运行时错误时,将转到下一条语句,继续执行。 在访问对象时,使用此形式而不是 On Error GoTo。 |
On Error GoTo 0 | 禁用当前过程中的任何已启用的错误处理程序。 |
———————————— |
示例
出错后打印日志,然后继续
这里用的是 cmd
的 echo
输出的日志,换行不会处理,先替换成" vbCrLf "
字符串了。
Sub 遍历文件夹处理文档()
On Error GoTo ErrorHandler ' 出错时跳转 ErrorHandler:
Dim CurrPath$, CurrFile$
CurrPath = ThisDocument.Path & "\" ' 当前文件的路径
CurrFile = Dir(CurrPath) ' 获取第一个文件
Do Until CurrFile = "" ' 只要不为空就继续
处理文档(CurrPath & CurrFile)
NextFile:
CurrFile = Dir() ' 获取下一个文件
Loop
Exit Sub
ErrorHandler: ' 开始错误处理
log "================================================================================"
log "【错误文件】" & CurrPath & CurrFile
log Err.Number & ":" & Err.Description
GoTo NextFile ' 错误处理完成,跳回去继续
End Sub
'写日志
Sub log(logMsg As String)
Dim logFile As String
logFile = ThisDocument.Path & "\" & Replace(ThisDocument.Name, ".docm", ".log") ' 日志文件路径
Shell "cmd.exe /c echo " & Format(Now, "YYYY-MM-DD HH:MM:SS") & " ===》 " & Replace(logMsg, vbLf, " vbCrLf ") & " >> " & logFile
End Sub
出错一直重试
一下代码实现用户输入判断,出错可以一直重试。
Sub demo()
Dim birthday As Date
On Error Resume Next ' 出错时忽略,继续向下运行。
Do
birthday = InputBox ("输入您的生日(yyyy-MM-dd)") ' 假设此处用户没有输入日期。
If Err. Number <> 0 Then
MsgBox "您的输入有误!请按照提示的日期格式输入。" ' 如有需要,可以在此提醒用户。
GoTo ErrorHandler ' 跳转到标签位置
End IF
' 业务逻辑代码
ErrorHandler: ' 定义标签 errorTag, 名字自己起的。
Err. Clear
Loop
End Sub
参考资料
微软Docs 》Office 》VBA 参考 》语言参考 》参考》 语句 》On Error 语句
微软Docs 》Office 》VBA 参考 》语言参考 》参考》 语句 》Resume语句
微软Docs 》Office 》VBA 参考 》语言参考 》参考》 对象 》Err 对象
微软Docs 》Office 》VBA 参考 》语言参考 》用户界面帮助 》错误消息 》可捕获的错误
微软Docs 》Office 》VBA 参考 》语言参考 》术语表 》VBA (Visual Basic for Applications )术语表
微软Docs 》Office 》VBA 参考 》语言参考 》术语表 》VBE(Visual Basic 编辑器)术语表