VBA – 打开AFTER工作簿closures后的自动计算

我有一个Excel文件,启动时自动禁用自动计算。 这是一个包含大量数据和公式的大文件。 我通常筛选我所需要的,然后只计算过滤的数据。

到现在为止还挺好。 当closures工作簿时,它会自动再次启用自动计算,以便在处理不同工作簿时处于活动状态。

我使用这些工作簿事件来做到这一点

Private Sub Workbook_Open() Application.Calculation = xlCalculateManual Application.CalculateBeforeSave = False End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.Calculation = xlAutomatic End Sub 

问题是,只要我点击Xbuttonclosures工作簿,Workbook_BeforeClose事件就会启动,整个文件开始计算。 这需要五分钟,只有计算完成后,我才能保存并closures工作簿。

我希望在工作簿closures后重新激活自动计算,以便Excel不再计算整个工作簿,而是在其他工作簿中再次启用自动计算。

有没有办法做到这一点?

注意 :跳到第二个解决scheme。 看完评论后,下面的方法会起作用,但不够理想。 第二种方法是更有效率和有效的任务。 我保留原来的解决scheme只是为了保持编辑和更新显而易见。

初始解决scheme

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

虽然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 

我跑了几个testing,我成功地能够抑制工作表的计算,同时仍然改变application.calculation模式。

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

第二个scheme

每ASH这里是另一种方法,避免完全的应用程序设置(注意,这只能在第一张表中执行,这将需要相应地编辑):

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

你可以将它绑定到一个热键或一个button。 只要确保你在工作簿中也有这个事件:

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

我还没有testing过滤数据如何工作,但它将解决计算问题,而不必担心任何应用程序级别的事件。

一个有点冒险的解决scheme可能是运行一个子计算器,在延迟时间内将计算设置回自动化,以便在工作簿结束后运行。

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

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