我有一个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不再计算整个工作簿,但在任何其他工作簿中再次启用自动计算。
有没有办法这样做?
答案 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的建议
答案 2 :(得分:0)
你只是使用错误的值,不是 xlAutomatic 它只是 xlCalculationAutomatic
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.Calculation = XlCalculation.xlCalculationAutomatic End Sub