【问题标题】:How to reset calculation mode in VBA after error错误后如何在VBA中重置计算模式
【发布时间】: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


【解决方案1】:

您的示例可能有点太简单了——通常会考虑(例如)如何处理调用代码中的错误,以及如何确定错误是“致命”错误(所有后续步骤都应中止)还是可恢复的。

一个典型的方法可能是这样的:

Sub Example()

    Dim OrigCalcMode As XlCalculation
    
    OrigCalcMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    
    On Error GoTo haveError

    ' Main code would go here, but to simply induce an error...
    Dim Val As Integer
    Val = 1 / 0

cleanExit:
    Application.Calculation = OrigCalcMode     'make sure to reset this
    Exit Sub 'don't run into the error handler
    
haveError:
    MsgBox "Error Number: " & Err.Number & vbCrLf & vbCrLf & _
                "Error Description: " & Err.Description
    '<Make any decisions about what to do with this specific error>
    Resume cleanExit 'Resume clears the Err object
        
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2017-05-20
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多