【问题标题】:How To Change Excel Calculation to Manual Before Workbook Does Calculation如何在工作簿进行计算之前将 Excel 计算更改为手动
【发布时间】:2021-05-04 05:43:42
【问题描述】:

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

理想情况下我想做的是:

  • 当电子表格打开时,获取用户当前的计算设置并保存
  • 将计算设置更改为手动,以便快速打开电子表格
  • 将计算设置改回用户的原始设置

我该怎么做?

【问题讨论】:

  • “我的问题是我觉得它对客户是有侵略性的”——确实如此。 Application.Calculation 处于 应用程序级 状态,并且在 Excel 关闭然后重新打开时将保持不变 - 然后您的客户不一定会意识到他们的工作表不再计算,并且会在他们时责备您意识到发生了什么。
  • 现在这是一个 Excel 加载项,因此在显示初始屏幕时它会与 Excel 一起打开。 “工作表”与“加载项”有何关联,或者加载项有何关联?是打开工作簿的加载项吗?如果您的计算效率低下,将计算切换回自动会导致显着延迟无论如何,那么为什么不解决实际问题而不是修补症状呢?
  • 看看FastExcel 是否可以帮助找出痛点是什么(IIRC 有一个免费的演示/预览模式,否则它是一个付费加载项)。 Charles Williams 的博客也有大量资源可以加快计算速度。
  • 感谢@MathieuGuindon 提供的资源。加载项提供了工作表正在计算的函数。
  • 看看你的UDF是否可以优化,把它们放到Code Review =)

标签: excel vba add-in


【解决方案1】:

我创建了 2 个我需要这样做时调用的 subs,Updates_OffUpdates_On。您需要在调用子程序中将变量 CalcModeIterationModeIterations 声明为公共,并且只有在退出之前重新打开更新时这才有效。如果您不能这样做,您将需要一些帮助单元格来存储这些值。

我有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多