有没有办法计算整个工作簿,但不是所有VBA中的开放工作簿?
我知道
worksheet.Calculate
但它只会做1张。我也知道
Application.CalculateFull
但我认为这会同时重新计算所有打开的工作簿。
是否可以只做一本工作簿?
编辑:我得到的方法:
For Each wks In ActiveWorkbook.Worksheets
wks.Calculate
Next
但是如果工作表之间有链接,这是非常危险的,那么计算的顺序很重要。我知道我可以找到确切的顺序并应用它,问题是在非常大的工作簿上这可能会有些棘手
经过一些调查和测试,首先选择所有工作表并计算后续工作:
Application.Calculation = xlManual
ThisWorkbook.Sheets.Select
ActiveSheet.Calculate
这将计算所有选定的工作表,同时创建正确的计算顺序
我不知道,史蒂文。
你实际上浪费时间做Application.Worksheets(1).Calculate
我运行了一个计时测试:在同一个Excel实例中打开了3个工作簿。
一个具有8200个易失性功能,一个工作表中的8000个在4个非连续范围内,200个在其他工作表中。
另外两本工作簿,共有100个功能。结果:
Application.Calculate
- 4.41毫秒ThisWorkbook.Worksheets(1).Calculate
- 每个工作表52.05毫秒ThisWorkbook.Worksheets(1).Range("R1").Calculate
(重复4次) - 84.64毫秒这是违反直觉的,但却是真的。
你也失去了宣布Dim wks as Worksheet
的时间。除非你这样做......每个人都称之为ThisWorkbook.Worksheets(1)
- 更快
另外,请小心参考ActiveWorkbook
- 当您编写代码运行时,您的主工作簿可能不是活动的。 ThisWorkbook
(带代码的那个)更安全。
ThisWorkbook将仅使用代码所在的工作簿
For Each wks In ThisWorkbook.Worksheets
wks.Calculate
Next wks
只需使用Calculate
例如:
Sub Cal_()
Calculate
End Sub
Steven G的答案实际上并不起作用,它只是看起来像。(我不能回复那篇文章,因为我没有50多个代表,这很烦人)。
它仍然按1个方向顺序计算工作表。我通过创建5张纸并将它们全部+ 1到另一个单元格,在不同方向的每张纸上进行测试。使用选择表格然后计算方法将给出错误的结果。
因为它要求纸张可见,所以下面是我使用该方法替换计算功能的功能。 (需要词典参考库)。不要使用。
EXAMPLE, METHOD DOES NOT WORK
Function Calculate_Workbook(Optional Wb As Workbook)
'Application.calculate will calculate all open books, which can be very slow.
'Looping through all sheets in workbook to calculate can be risky due to formula referencing a cell thats not yet calculated, calculation order may be important.
Dim DicShtVisible As New Dictionary
DicShtVisible.CompareMode = TextCompare
Dim Asht As Worksheet, AWkbk As Workbook 'Previously selected books
Dim Sht As Worksheet
Set Asht = ActiveSheet
Set AWkbk = ActiveWorkbook
If Wb Is Nothing Then Set Wb = ThisWorkbook
Wb.Activate
'Unhide all sheets as can't select very hidden stuff
For Each Sht In Wb.Sheets
DicShtVisible.Add Sht.Name, Sht.Visible
Sht.Visible = xlSheetVisible
Next Sht
'Select all sheets and calculate the lot
Wb.Sheets.Select
ActiveSheet.Calculate
'Reapply visibility settings
Dim Key As Variant
For Each Key In DicShtVisible.Keys
Wb.Sheets(Key).Visible = DicShtVisible.Item(Key)
Next Key
'Reset selections
AWkbk.Activate
Asht.Select
End Function
据我所知,没有解决方案,唯一的答案是要么知道工作簿的计算顺序,要么按顺序手动计算工作表,要么接受使用Calculate,它将计算所有打开的工作簿。
但我希望被证明是错的。这是一个令人烦恼和愚蠢的问题。
试试这个:
Sub CalcBook()
Dim wks As Worksheet
Application.Calculation = xlManual
For Each wks In ActiveWorkbook.Worksheets
wks.Calculate
Next
Set wks = Nothing
End Sub
我们可以用
Application.CalculateBeforeSave = True
然后保存工作簿?可能会更加精细地捕获当前值,如果不是真的设置,保存,重置如果不是真的。