我想我聽到你需要一種方法來監視是否執行正在執行的計算中的每一步。
假設你不感興趣的重新設計使用更易於追蹤比表格計算(如內VBA或數據透視表揮發物計算)方法的工作簿,這可能會爲你工作:
在VB中,你可以利用.EnableCalculation和.Calculate設置整個工作表爲「髒」(需要計算),然後重新計算。這與您當前流程的主要區別在於,我們將在手動模式下執行這些操作一個工作表。通過在VBA中一次啓動一個工作表的計算,您將能夠執行額外的中間操作,用於追蹤您在計算過程中的進度。
請注意,這種方法假設一個相當線性的工作簿結構,這樣如果我們首先按照您希望的順序重新計算Sheet1,Sheet2,Sheet3等,您的工作簿將產生正確的結果。如果你的公式依賴性比線性更「意大利麪條」,這可能不適合你。它還假定您正在使用Excel 2000或更高版本。
例如,您可以編寫一個VBA例程來完成以下步驟。 您需要了解自己的依賴關係,才能知道哪些計算必須先於其他計算,並從工作表開始處於「乾淨」狀態,此時不存在任何計算。
步驟1:設置活性片到需要重新計算的第一個工作表
步驟2:設置計算模式爲手動如下:
Application.Calculation = xlCalculationManual
步驟3 : 「髒」 的整個活性片如下:
With ActiveSheet
.EnableCalculation = False
.EnableCalculation = True
使用啓動該工作表只(不是整個工作簿)重新計算:
步驟4
.Calculate
End With
注意,如果計算模式被設置爲自動,步驟3將啓動跨過重新計算整個工作簿。通過使用手動模式和With,我們將該計算限制在當前工作表中。
現在你已經變髒並重新計算第一張紙(歡呼!)。現在,通過將上面的步驟3和4嵌入到For/Each或For/Next循環中,您可以爲工作簿中的每個工作表重複該過程。再次確保您知道工作表需要計算的順序(如果需要訂單)。
現在的大結局 - 通過創建你的循環中的計數器變量,你可以跟蹤通過更新每次完成一個工作表計算你的計數器變量的值,你在計算多遠了。例如,在重新計算工作表後,可以將計數器值設置爲當前值+ 1,並將結果存儲在全局變量中(以便即使在VBA例程結束之後它仍會保留)或工作表中的單元格中。這樣,您可以稍後檢查此值以查看在計算完成或中斷之前更新了多少工作表。
如果你有你的工作簿相對較少的工作表,同樣的方法可以在一個時間,而不是一紙應用到一個範圍。
我不會去了解如何構建一個「反」的細節,環路,還是在這裏全局變量,但如果需要的話,可以用你喜歡的搜索引擎很容易找到這些信息。我也強烈建議您在完成後重新啓用自動計算,因爲很容易忘記它已被設置爲手動模式。
我希望這對你的作品 - 有關計算模式和重新計算的更多信息,這是一個有用的鏈接:在Excel http://msdn.microsoft.com/en-us/library/bb687891.aspx
您可以防止中斷髮生,但我建議您花費一些努力加速計算:一小時計算是非常過分的。請參閱http://www.decisionmodels.com/optspeed.htm或http://msdn.microsoft.com/en-us/library/ff700515.aspx – 2012-01-12 23:59:46
我衷心贊同。但即使我將腳本運行時間減少了一個數量級,它仍將運行6分鐘,並且由於Excel對於中斷計算的傾向是如此安靜,我的數據是否準確,我還是會懷疑。 我其實對防止中斷和更感興趣知道中斷是否發生不太感興趣。 – BenTobin 2012-01-13 00:22:35
偉大的問題。我注意到,當計算中斷時,狀態欄中會出現「計算」一詞。除了簡單地查看狀態欄,我不知道有什麼方法來利用這些信息。 – JimmyPena 2012-01-13 01:25:24