2014-05-07 34 views
3

每個人。在Excel工作簿中有一個大型VBA模塊,它從一堆其他遠程工作簿中獲取數據並將其複製到當前工作簿中。然後,它格式化和分析數據。所有這些工作都很好,除了可能需要一段時間,因爲我正在處理兩個工作表中的超過30,000行數據(並且每天都在增長)。Excel VBA正在跳過特定行代碼

所以,我試圖讓它把進度作爲一個百分比放在「管理員」工作表上的某個單元格中。這似乎也行得通,但有時只是。在執行期間,Excel似乎隨機跳過了更新進度的.Value代碼行。有時候,它會更新大約四分之三的時間,有時甚至更新,直到執行結束。有誰知道爲什麼?以下是相關代碼的摘要。

<some code that declares variables and whatnot> 
ThisWorkbook.Worksheets("Admin").Range("H18").Value = "Waiting..." 
For Each rw In rng.Rows 
    <code that does the data-gathering and analysis> 
    progress = <code that returns a Double value> 
    ThisWorkbook.Worksheets("Admin").Range("H18").Value = progress & "% complete." 
Next rw 
ThisWorkbook.Worksheets("Admin").Range("H18").Value = "Done!" 
<some cleanup code> 

有時,「等待...」從不顯示。其他時候,它是。 「搞定!」幾乎總是在執行結束時顯示,但Admin!H18不會更新許多循環,並且在跳過時它不會更新同一組循環。計算仍在進行中(我認爲),因爲當它更新時,它會更新到正確的值。但是它並沒有在每個循環中更新單元,只是其中的一部分。

+1

Tim對狀態欄的評論是顯示定期發生進度的好主意。這裏是一個簡短的狀態欄片段的鏈接 - 更新我經常使用的VBA:http://stackoverflow.com/questions/22847329/hiding-worksheet-while-copying-and-pasting/22847823#22847823 –

+0

Tim,你的狀態欄建議完美運作。謝謝!我還會考慮將進度更新分解爲另一個子程序,但由於我的代碼比我提出的要複雜得多,因此需要考慮一些問題。我想將您的評論標記爲問題的答案,但我不能,因爲您已將其發表評論。 – T6J2E5

+0

將我的評論轉換爲答案... –

回答

4

在更新單元格後添加DoEvents可能會解決此問題。但是,如果禁用ScreenUpdating(這會阻止在工作表上更新狀態更新),則代碼運行速度會更快。嘗試更新狀態欄。

此外 - 將狀態更新拆分爲單獨的Sub將簡化您的代碼並允許您更輕鬆地更改顯示更新的方式。

Sub DoStatus(m) 
    ThisWorkbook.Worksheets("Admin").Range("H18").Value = m 
    DoEvents 
End Sub 
2

我相信,如果你行的值設置後檢查ThisWorkbook.Worksheets("Admin").Range("H18").Value,它的價值將完全按照預期。

雖然與Application.ScreenUpdating=True一般顯示屏幕上的任何代碼是幹什麼運行VBA,有沒有要求,即Excel中必須更新屏幕。

相反地,Application.ScreenUpdating=False,有一個要求,即Excel的不得更新屏幕。

如果因任何原因Excel不能命令必須更新屏幕做到這一點必須執行,而Application.ScreenUpdating=True,屏幕更新將被暫時關閉其他任務的系統資源,導致您所描述的問題。 DoEvents可能會解決此問題,但可能會導致性能下降以及其他問題,如果您在工作簿中的其他地方觸發了其他事件 - DoEvents特別說明了「現在處理未決事件」。

如果您在代碼運行時使用Application.ScreenUpdating=False並使用Application.StatusBar來顯示狀態,那麼您將獲得更好的性能。