如何计算整个工作簿,但不是所有打开的工作簿?

问题描述 投票:9回答:6

有没有办法计算整个工作簿,但不是所有VBA中的开放工作簿?

我知道

worksheet.Calculate

但它只会做1张。我也知道

Application.CalculateFull

但我认为这会同时重新计算所有打开的工作簿。

是否可以只做一本工作簿?

编辑:我得到的方法:

For Each wks In ActiveWorkbook.Worksheets
    wks.Calculate
Next

但是如果工作表之间有链接,这是非常危险的,那么计算的顺序很重要。我知道我可以找到确切的顺序并应用它,问题是在非常大的工作簿上这可能会有些棘手

excel vba
6个回答
7
投票

经过一些调查和测试,首先选择所有工作表并计算后续工作:

Application.Calculation = xlManual
ThisWorkbook.Sheets.Select
ActiveSheet.Calculate 

这将计算所有选定的工作表,同时创建正确的计算顺序


3
投票

我不知道,史蒂文。

你实际上浪费时间做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(带代码的那个)更安全。


2
投票

ThisWorkbook将仅使用代码所在的工作簿

For Each wks In ThisWorkbook.Worksheets
    wks.Calculate
Next wks

1
投票

只需使用Calculate

例如:

Sub Cal_()
    Calculate
End Sub

0
投票

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,它将计算所有打开的工作簿。

但我希望被证明是错的。这是一个令人烦恼和愚蠢的问题。


0
投票

试试这个:

Sub CalcBook()
    Dim wks As Worksheet
    Application.Calculation = xlManual
    For Each wks In ActiveWorkbook.Worksheets
        wks.Calculate
    Next
    Set wks = Nothing
End Sub

0
投票

我们可以用

Application.CalculateBeforeSave = True 

然后保存工作簿?可能会更加精细地捕获当前值,如果不是真的设置,保存,重置如果不是真的。

© www.soinside.com 2019 - 2024. All rights reserved.