【发布时间】:2014-08-28 19:10:04
【问题描述】:
我正在管理一个包含超过 200 000 个公式(一些非常复杂的数组公式)的工作簿,这意味着我不能让 Excel 每次单击某个位置时自动计算所有单元格(计算所有内容大约需要 8 小时)。
取而代之的是,计算设置为手动,当 Calculation.xlsm 打开时,我执行了以下 VBA 代码:
With Application
.CalculateBeforeSave = False
.Calculation = xlCalculationManual
End With
我使用自定义按钮仅在需要时计算 200k 单元的某些部分。
我注意到 Excel 会跟踪每个工作簿中的设置,这意味着如果我打开 Calculation.xlsm,Excel 会记住计算设置为手动。如果我打开我的 Values.xlsx,Excel 确实记得计算设置为自动。这是在我尝试将值从 Calculation.xlsm 复制到 Values.xlsx 之前。
现在,因为我在 Calculation.xlsm 中使用 VBA 将值复制到 Values.xlsx,所以 Excel 也会将 Application.Calculation 设置应用于该工作簿,这意味着如果我使用新的 Excel 实例打开它,计算仍将设置为手动。
如果我在 Calculation.xlsm 工作簿中使用 VBA 关闭 Values.xlsx 之前添加 Application.Calculation = xlCalculationAutomatic,它会起作用,但 Excel 也会开始计算我的 Calculation.xlsm 工作簿中的 200k 单元格,这显然是我不想要的。
所以我的问题是关于如何根据特定工作簿而不是 Application 对象实际设置 Excel 的计算。这是基于 Excel 确实根据打开的工作簿跟踪该设置的事实(您可以只进行测试并创建 2 个不同的 .xlsx 文件,一个启用计算,另一个禁用计算,Excel 会记住这些设置)。
我知道我可以在关闭之前使用 Worksheets.Range.Calculate 方法来计算我的 Values.xlsx 工作簿,但如果我之后在新的 Excel 实例中打开它,计算仍将设置为手动。
编辑下午 3:20:不确定我是否足够清楚,英语不是我的母语。简而言之,我将 Calculation.xlsm 与 VBA 和 Calculation 设置为手动。我有 Values.xlsx 没有 VBA 和计算设置为自动。如果我在 Calculation.xlsm 中使用以下 VBA 代码打开 Values.xlsx,Excel 会自动将我的 Values.xlsx 工作簿转换为手动计算。
Calculation.xlsm 代码:
Private Sub Workbook_Open()
With Application
.CalculateBeforeSave = False
.Calculation = xlCalculationManual
End With
End Sub
Sub someFunction()
Set WB = Application.Workbooks.Open("Values.xlsx")
Set WBws = WB.Sheets("mySheet")
DoEvents
wb.Save
WB.Close
End Sub
someFunction() 执行后,Values.xlsx 计算设置为手动。那就是问题所在。我希望它保持自动状态(我无法将 VBA 添加到该文件,它必须像上面一样从 Calculation.xlsm 完成)。
编辑下午 3:40:我可以将我的大型工作簿与 Application.Calculation 设置为手动,将我需要的所有数据放入剪贴板(我只需要值,而不是公式) ,关闭它(即使我关闭执行它的工作簿,VBA 是否仍会继续执行?),将 Application.Calculation 设置为 Auto(因为没有打开的工作簿),然后打开目标工作簿以粘贴值(由于另一个工作簿已关闭,Excel 是否仍将数据保留在剪贴板中?),然后保存并关闭该工作簿,将计算设置为手动(未打开工作簿)并重新打开执行代码的原始工作簿?
【问题讨论】:
-
打开工作簿活动对您有帮助吗?喜欢 Private Sub Workbook_Open() 并添加您的代码是否要激活或禁用自动计算..
-
@mehow 这意味着你开始这个过程完成你的轮班并在第二天回来:D
-
Ya正是krish KM,这正是它的意思!我编辑了我的 OP 只是为了确保您理解。
-
是的。计算是
Application级别的属性,因此当您为一个工作簿设置它时,它适用于该应用程序实例中的所有工作簿。您需要的可能是一个应用程序级别的事件处理程序,以便每当您更改 ActiveWorkbook 时,它都会相应地重置该属性。 -
为此,您可以修改我给here 的答案以切换
Application.Calculation而不是Application.CelldragAndDrop属性:)
标签: vba excel excel-2010