有没有办法计算整个工作簿,但不能计算VBA中所有打开的工作簿?
我知道
worksheet.Calculate
但它只会做1张。我也知道
Application.CalculateFull
但我认为这会同时重新计算所有打开的工作簿。
是否可以只制作1个工作簿?
修改 我得到了方法:
For Each wks In ActiveWorkbook.Worksheets
wks.Calculate
Next
但是如果工作表之间有链接,这是非常危险的,那么计算的顺序很重要。我知道我可以找到确切的顺序并应用它,问题是在非常大的工作簿上这会变得有些棘手
答案 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的原始实例。