Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何计算整个工作簿,而不是所有打开的工作簿?_Excel_Vba - Fatal编程技术网

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

Excel 如何计算整个工作簿,而不是所有打开的工作簿?,excel,vba,Excel,Vba,是否有一种方法可以在VBA中计算整个工作簿而不是所有打开的工作簿 我知道 worksheet.Calculate Application.CalculateFull 但它只能做一张纸。我也知道 worksheet.Calculate Application.CalculateFull 但我认为这会同时重新计算所有打开的工作簿 可以只做一个工作簿吗 编辑: 我得到的方法是: For Each wks In ActiveWorkbook.Worksheets wks.Calculat

是否有一种方法可以在VBA中计算整个工作簿而不是所有打开的工作簿

我知道

worksheet.Calculate
Application.CalculateFull
但它只能做一张纸。我也知道

worksheet.Calculate
Application.CalculateFull
但我认为这会同时重新计算所有打开的工作簿

可以只做一个工作簿吗

编辑: 我得到的方法是:

For Each wks In ActiveWorkbook.Worksheets
    wks.Calculate
Next
但是这是非常危险的,如果图纸之间有链接,那么计算顺序很重要。我知道我可以找到确切的顺序并应用它,问题是在非常大的工作簿上,这可能会变得有些棘手

尝试以下方法:

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

经过一些调查和测试后,首先选择所有板材,然后进行计算:

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

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

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

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

我不知道,史蒂文

你实际上在做
应用程序时浪费了时间。工作表(1)。计算

我运行了一个计时测试:在同一个Excel实例中打开3个工作簿

一个具有8200个易失性函数,8000个在一个工作表中,位于4个非连续范围内,200个在其他工作表中

另外两本工作簿,总共包含100个功能。结果是:

  • 应用程序。计算
    -4.41毫秒
  • 此工作簿。工作表(1)。计算每个工作表的
    -52.05毫秒
  • 此工作簿。工作表(1)。范围(“R1”)。计算
    (重复4次)-84.64毫秒
这是违反直觉的,但却是事实

Dim wks声明为工作表也会浪费时间。除非你是为了。。。每个人都将其称为此工作簿。工作表(1)
-速度更快

另外,请小心参考
ActiveWorkbook
——当代码运行时,主工作簿可能不是活动工作簿<代码>此工作簿(带有代码的工作簿)更安全。

只需使用Calculate即可

例如:


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并计算所有打开的工作簿

然而,我希望被证明是错的。这是一个如此烦人和愚蠢的问题。

我们可以使用

Application.CalculateBeforeSave = True 

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

另一个选项是创建一个新的Excel实例,打开工作簿就是该实例,然后计算该实例。这将使原始实例中的任何工作簿都无法计算,如果另一个工作簿的计算速度非常慢(例如100k+公式),则可能会节省您的时间

这是否更好取决于你的情况。打开第二个Excel实例需要一点额外的时间和可能更多的内存(尽管我还没有测试过这个,而且可能不是很大)


您可能需要更改更多代码,以考虑此工作簿位于不同的实例中,并且某些函数可能存在问题(例如,如果您通过后台处理Excel原始实例中的所有工作簿来检查工作簿是否已打开).

Application.Calculate将计算所有打开的工作簿,因此我理解正确,您一次打开了多个工作簿(Excel文件)。您想更新其中一个工作簿(文件),但不想更新其余的工作簿(文件)?如果是这样,请尝试上面的脚本。这是非常危险的,因为所有工作表之间都有链接,因此您可以计算工作表1,但需要先计算工作表2。我对答案投了更高的票,因为它确实计算了整个工作簿,但很可能无法生成预期的应用程序结果。Calculative为什么不设置更新工作表的顺序?指定工作表(“Sheet2”)。计算,然后是工作表(“Sheet1”)。计算很难确保在大量工作簿上执行正确的顺序。我一直在寻找像Application.CalculateFull一样的调用,但我猜它根本不存在。如果没有更简单的解决方案,只需添加“没有内置的功能,但是这里有一个解决方法,假设您的工作表之间没有链接”,我会接受答案不起作用。我得到对象“工作表”的“方法“选择”失败如果工作表不是自包含的,则该方法可能错误。找到了一个解决方案:循环所有工作表并将EnableCalculation设置为false(相关工作簿除外),然后调用应用程序。计算并还原EnableCalculation