如何在工作簿进行计算之前将Excel计算更改为手动

如何在工作簿进行计算之前将Excel计算更改为手动,excel,vba,add-in,Excel,Vba,Add In,我正在使用vba为excel开发外接程序。打开电子表格后,将重新计算所有值,这会减慢打开速度。我已尝试创建一个Workbook_Open事件,将应用程序计算从自动更改为手动,但此事件处理程序在计算完成后执行。我还尝试在电子表格关闭之前将计算设置为手动,以便下次打开时速度更快。但我的问题是,我觉得这对客户来说是一种侵犯 理想情况下,我想做的是: 当电子表格打开时,获取用户的当前计算设置并保存它 将计算设置更改为手动,以便可以快速打开电子表格 将计算设置更改回用户的原始设置 我怎样才能做到这一点呢?

我正在使用vba为excel开发外接程序。打开电子表格后,将重新计算所有值,这会减慢打开速度。我已尝试创建一个Workbook_Open事件,将应用程序计算从自动更改为手动,但此事件处理程序在计算完成后执行。我还尝试在电子表格关闭之前将计算设置为手动,以便下次打开时速度更快。但我的问题是,我觉得这对客户来说是一种侵犯

理想情况下,我想做的是:

当电子表格打开时,获取用户的当前计算设置并保存它 将计算设置更改为手动,以便可以快速打开电子表格 将计算设置更改回用户的原始设置
我怎样才能做到这一点呢?

我创建了两个sub,当我需要执行此操作时,我会调用它们,分别为Updates\u Off和Updates\u On。您需要在调用子中将变量CalcMode、IterationMode和Iterations声明为public,只有在退出之前重新打开更新时,这才有效。如果你不能做到这一点,你需要有一些辅助单元格来存储这些值

我有if-CalcMode=xlCalculationManual语句在开发过程中警告我以手动模式开始或结束,并在需要时取消注释它们

Public Sub Updates_Off()

' Turn off Screen updating
    Application.ScreenUpdating = False

' Check what calculation mode is in effect and set current to manual
    CalcMode = Application.Calculation
'   If CalcMode = xlCalculationManual Then _
'       MsgBox "Starting mode is manual"

    IterationMode = Application.Iteration
    Iterations = Application.MaxIterations
    Application.Calculation = xlCalculationManual

End Sub


Public Sub Updates_On()

' Turn on Screen updating
    Application.ScreenUpdating = True

' Reset Calculation mode
    Application.Calculation = CalcMode
    Application.Iteration = IterationMode
    Application.MaxIterations = Iterations

'   If CalcMode = xlCalculationManual Then _
'       MsgBox "Reset to manual mode"

End Sub

但我的问题是,我觉得这对客户来说确实是一种侵犯。Application.Calculation是应用程序级别的状态,当Excel关闭然后重新打开时,它将被持久化-然后您的客户不一定会意识到他们的工作表不再计算,当他们意识到发生了什么时,他们会责怪您。现在这是一个Excel加载项,因此它将与Excel一起打开,当显示启动屏幕时。工作表与外接程序有何关联,或外接程序有何关联?是外接程序打开工作簿吗?如果您的计算效率低下,将计算切换回自动将导致明显的延迟,那么为什么不解决实际问题而不是修补症状?看看是否可以帮助您找出症结所在IIRC有一个免费演示/预览模式,否则这是一个付费加载项。查尔斯·威廉姆斯(Charles Williams)的博客还提供了大量加速计算的资源。感谢@MathieuGuindon提供这些资源。外接程序提供工作表正在计算的函数。如果您的自定义项可以优化,请将它们放到=