【发布时间】:2022-11-22 06:33:00
【问题描述】:
问题:
在 VBA 中,有没有什么方法可以在引发错误后执行一些清理代码,而不会 A) 通过手动引发错误而丢失本机错误消息的详细信息,或 B) 在我的代码中插入和维护行号?
更多背景/信息:
我想在开始时将计算模式更改为手动,但我想确保在代码退出之前将其更改回来。如果没有错误,这很好,但我能想到的确保即使遇到错误也会引发的唯一方法是将异常处理程序更改为On Error Resume Next之类的东西,确保恢复计算模式,然后手动引发错误.但是这样做会丢失错误发生位置等细节;使解决问题变得更加困难。
我能够找到的唯一“解决方案”是手动(或使用工具)添加行号,然后可以在手动引发的错误中使用这些行号;但这似乎很难维护并且(imo)使代码有点混乱。
如果这真的是唯一的两个选择(而且我的无果搜索似乎表明情况就是如此;但很抱歉,如果这个问题在某个地方得到了回答而我只是找不到它)那么就这样吧;我将不得不选择其中之一。但我只是想看看是否有人知道另一种选择?
虚拟代码:
(只是使用“手动引发错误并丢失详细信息”方法的快速模型)。
Sub Example()
Dim OrigCalcMode as XlCalculation
OrigCalcMode = Application.Calculation
Application.Calculation = xlCalculationManual
On Error Resume Next
' Main code would go here, but to simply induce an error...
Dim Val as Integer
Val = 1 / 0
If Err.Number <> 0 Then
MsgBox ("Error Number: " & Err.Number & vbCrLf & vbCrLf & _
"Error Description: " & Err.Description)
Err.Clear
End If
On Error GoTo 0
Application.Calculation = OrigCalcMode
End Sub
【问题讨论】:
-
你失去了什么细节?我对你想要完成的事情有点困惑,因为你的 Mock 不会丢失任何错误细节
-
您可以在代码中声明一个位置,而不是
On Error GoTo 0,当检测到错误时,它应该在该位置获取宏。例如On Error GoTo ExitSub然后将ExitSub:添加到宏的末尾附近,之后可以添加代码。 automateexcel.com/vba/error-handling -
然后,您还可以使用 Debug.Print 捕获您可能希望能够查看的任何错误消息,这些消息将添加到 VB 编辑器中的
immediate窗口
标签: excel vba error-handling