VBA - 关闭工作簿后打开自动计算

时间:2017-06-27 14:04:41

标签: excel vba excel-vba

我有一个excel文件,可以在启动时自动禁用自动计算。这是一个包含大量数据和公式行的巨大文件。 我通常过滤我需要的东西,然后只计算过滤后的数据。

到目前为止一切顺利。关闭工作簿时,它会自动再次启用自动计算,以便在处理不同的工作簿时它处于活动状态。

我使用这些工作簿事件来执行此操作

Private Sub Workbook_Open()

Application.Calculation = xlCalculateManual
Application.CalculateBeforeSave = False

End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.Calculation = xlAutomatic


End Sub

问题是,只要我按下X按钮关闭工作簿,Workbook_BeforeClose事件就会启动,整个文件开始计算。最多只需五分钟,计算完成后,我可以保存并关闭工作簿。

我希望在工作簿关闭后重新激活自动计算,以便excel不再计算整个工作簿,但在任何其他工作簿中再次启用自动计算。

有没有办法这样做?

3 个答案:

答案 0 :(得分:2)

注意:跳至第二个解决方案。阅读完评论后,下面的方法工作,但不太理想。考虑到这项任务,第二种方法更有效率。我在这里保留原始解决方案仅仅是为了保持编辑和更新。

初始解决方案

我想我有一个解决方案(在这个过程中我学到了新东西)。

虽然EnableEvents属于Application对象,但EnableCalculation属于工作表对象。这使我们可以非常精确地计算我们想要计算的工作表。

Option Explicit
Public AppCalcSetting As Long
Public AppEventSetting As Long

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ' Remember the application events setting
    AppEventSetting = Application.EnableEvents

    ' Turn off Calculation for the specified worksheet
    ThisWorkbook.Sheets(1).EnableCalculation = False

    ' Prevent other events from firing
    Application.EnableEvents = False

    ' Turn Application level calculation back to what it was previously set to
    Application.Calculation = AppCalcSetting

    ' Restore EnableEvents
    Application.EnableEvents = AppEventSetting

    ' Turn Calculation ability back on
    ThisWorkbook.Sheets(1).EnableCalculation = True
End Sub
Private Sub Workbook_Open()
    ' Remembers user preferences for calculation mode.
    AppCalcSetting = Application.Calculation

    ' Turn off Automatic Calculation
    Application.Calculation = xlCalculationManual
End Sub

我运行了一些测试,我成功地能够抑制工作表的计算,同时仍然改变了application.calculation模式。

请注意,虽然Worksheet.Calculation模式设置为false,但无法计算工作表,因此如果用户打算计算新值,则必须恢复此选项。

第二种解决方案

Per A.S.H这是另一种完全避免应用程序设置的方法(请注意,这仅在第一张纸上执行,并且需要相应地进行编辑):

Public Sub Calculate()

    With ThisWorkbook.Sheets(1)
        .EnableCalculation = True
        .Calculate
        .EnableCalculation = False
    End With
End Sub

您可以将其绑定到热键或按钮。只需确保您在工作簿中也有此事件:

Private Sub Workbook_Open()
    ThisWorkbook.Sheets(1).EnableCalculation = False
End Sub

我还没有测试过它对过滤数据的影响,但它可以解决计算问题而无需担心任何应用程序级事件。

答案 1 :(得分:0)

一个有点hacky的解决方案可能是运行一个sub来将计算设置回一个时间延迟的自动,以便它在工作簿完成关闭后运行。

真正需要的是为个别工作簿设置计算模式的方法:请参阅我对Uservoice的建议

https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10601079-workbook-level-calculation

答案 2 :(得分:0)

你只是使用错误的值,不是 xlAutomatic 它只是 xlCalculationAutomatic

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Application.Calculation = XlCalculation.xlCalculationAutomatic
    End Sub