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

时间:2017-05-05 13:45:16

标签: excel vba

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

我知道

worksheet.Calculate

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

Application.CalculateFull

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

是否可以只制作1个工作簿?

修改  我得到了方法:

For Each wks In ActiveWorkbook.Worksheets
    wks.Calculate
Next

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

7 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

只需使用计算

例如:

Sub Cal_()
    Calculate
End Sub

答案 4 :(得分:0)

史蒂文·G(Steven G)的答案实际上并不起作用,看起来确实如此。(我无法回复该帖子,因为我没有50多名代表,这很烦人)。

它仍然以1个方向的顺序计算图纸。我通过创建5张纸并将它们全部加1到另一个单元(在每张纸上的方向不同)来进行测试。使用选择表然后计算方法将给出错误的结果。

因为它要求工作表是可见的,所以elow是我构建的用于替换使用该方法的计算功能的函数。 (需要词典参考库)。不过不要使用。

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

但是,我很想证明自己是错误的。这是一个烦人而愚蠢的问题。

答案 5 :(得分:0)

我们可以使用

Application.CalculateBeforeSave = True 

然后保存工作簿?可能会更精细地捕获当前值,如果不正确则设置,保存,如果不正确则保存。

答案 6 :(得分:0)

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

Dim xlApp As Excel.Application
Dim wbTest As Workbook

Set xlApp = New Excel.Application
Set wbTest = xlApp.Workbooks.Open("c:\temp\test.xlsx")

' do a bunch of stuff in wbTest

xlApp.Calculate

这是否更好取决于您的情况。打开Excel的第二个实例会花费一些额外的时间,并且可能会占用更多的内存(尽管我没有对此进行测试,并且可能并不算很大)。

您可能不得不更改更多代码,以考虑到该工作簿在不同的实例中,并且某些功能可能存在问题(例如,如果您通过在后台浏览所有工作簿来检查工作簿是否已打开) Excel的原始实例。