2010-09-17 143 views
20

我的Excel工具執行的任務很長,我試圖通過在狀態欄或工作表中的某個單元格中提供進度報告來讓用戶友好,如下所示。但屏幕不會刷新,或停止刷新(例如33%)。任務最終完成,但進度條沒用。在Excel VBA中強制執行屏幕更新

我能做些什麼來強制屏幕更新?

For i=1 to imax ' imax is usually 30 or so 
    fractionDone=cdbl(i)/cdbl(imax) 
    Application.StatusBar = Format(fractionDone, "0%") & "done..." 
    ' or, alternatively: 
    ' statusRange.value = Format(fractionDone, "0%") & "done..." 

    ' Some code....... 

Next i 

我使用Excel 2003中

回答

30

在循環中添加一個DoEvents函數,參見下文。

您可能還希望確保狀態欄對用戶可見,並在代碼完成時重置它。

Sub ProgressMeter() 

Dim booStatusBarState As Boolean 
Dim iMax As Integer 
Dim i As Integer 

iMax = 10000 

    Application.ScreenUpdating = False 
''//Turn off screen updating 

    booStatusBarState = Application.DisplayStatusBar 
''//Get the statusbar display setting 

    Application.DisplayStatusBar = True 
''//Make sure that the statusbar is visible 

    For i = 1 To iMax ''// imax is usually 30 or so 
     fractionDone = CDbl(i)/CDbl(iMax) 
     Application.StatusBar = Format(fractionDone, "0%") & " done..." 
     ''// or, alternatively: 
     ''// statusRange.value = Format(fractionDone, "0%") & " done..." 
     ''// Some code....... 

     DoEvents 
     ''//Yield Control 

    Next i 

    Application.DisplayStatusBar = booStatusBarState 
''//Reset Status bar display setting 

    Application.StatusBar = False 
''//Return control of the Status bar to Excel 

    Application.ScreenUpdating = True 
''//Turn on screen updating 

End Sub 
+0

如果你在每個循環上做了很多'doevents',而不是每個循環做10個左右:'如果我mod 10 = 0,那麼Doevents' – 2016-08-14 06:56:09

6

將到DoEvents來電循環。

這會影響性能,所以你可能只想每次調用它,例如第10次迭代。
但是,如果你只有30個,那不是問題。

0

這不是直接回答你的問題,而只是提供一個替代方案。我發現在很多長時間的Excel計算中,大部分時間都是在屏幕上顯示Excel更新值。如果是這樣的話,你可以在你的子前面插入如下代碼:

Application.ScreenUpdating = False 
Application.EnableEvents = False 

,並把這個作爲結束

Application.ScreenUpdating = True 
Application.EnableEvents = True 

我發現,這往往加速的任何代碼我非常努力地工作,不得不提醒用戶進度是不必要的。這只是一個想法,您可以嘗試一下,它的有效性取決於您的工作表和計算。

+0

好信息... thx – ZEE 2017-05-31 21:15:29

8

工作表中的文本框有時不會更新 其文本或格式更改,甚至 DoEvent命令不起作用。

由於在Excel中沒有用於刷新用戶表單的工作表 的命令,因此必須使用 來強制Excel更新屏幕。

下面的命令似乎做的伎倆:

- ActiveSheet.Calculate  
- ActiveWindow.SmallScroll  
- Application.WindowState = Application.WindowState 
+0

有一個表單的問題今天。表單和工作表停止更新。每隔幾次迭代添加application.windowstate技巧就解決了我的問題。 – 2012-11-07 04:34:39

+1

正在爲我使用'ActiveWindow.SmallScroll down:= 1'' ActiveWindow.SmallScroll up:= 1' – Hubisan 2015-02-12 13:00:08

0

特別是,如果你正在處理一個用戶窗體,那麼你可以嘗試重畫方法。如果您在表單中使用事件觸發器,則可能會遇到與DoEvents有關的問題。例如,功能運行時按下的任何按鍵都將由發送DoEvents鍵盤輸入將在屏幕更新之前處理,因此如果要通過按住鍵盤上的某個箭頭鍵更改電子表格上的單元格,那麼在主函數完成之前,單元格更改事件將繼續觸發。

用戶窗體在某些情況下不會被刷新,因爲DoEvents會觸發事件;但是,重新繪製將更新用戶窗體,並且即使另一個事件緊跟在上一個事件之後,用戶也將在屏幕上看到更改。

在窗體的代碼很簡單:

Me.Repaint 
-3

DoEvents只是你在哪裏更新UI前行,它應該工作。

+5

這個答案對於4-5年前寫入的其他代碼有什麼價值? – 2015-12-20 14:38:06