2010-05-27 68 views
6

是什麼做這些點:多少設置這些屬性加快您的Excel宏:Application.ScreenUpdating,Application.DisplayAlerts

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

是否真的保存多少時間?

+3

DisplayAlerts無關如何快速程序運行時,它只會抑制默認的Excel警告(例如提示確認表刪除),您可能會或可能不希望壓制。 (我想技術上它會讓它運行得更快,因爲沒有對話框,但你知道我的意思)。 – goggin13 2010-05-28 02:45:39

回答

5

同意。

我發現,當您關閉ScreenUpdatingCalculation,最好想想如何做到的事情(寫入,讀取,事件,...),儘可能爲少ScreenUpdating電話的回報。這將加速運營,同時也爲用戶提供更好,更可忍受的體驗。比如說,你想盡可能快地寫一些數據到一張紙上。你可以這樣做:

For Each row In rowDic.Keys() 
    ' turn off updating 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
    ' turn on updating 
Next 

或走得更快,你可以這樣做:

' turn off updating 
For Each row In rowDic.Keys() 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
Next 
' turn on updating 

同樣,當寫入數據時,它的最快寫入較大的塊,較少的時間。所以如果有的話,理想的寫入次數是1次。您可以將Range視爲2D array[rows,cols]。我發現下面是有效的:

' turn off updates 

' Organise data in ram so that it fits the range for which it is meant 
Dim two_d_arr (rows,cols) 
loadDataFromSource two_d_arr 

Dim destinationRange as Range 
destinationRange = Sheets(someSheet).Range(someRange).Value = two_d_arr 

Redim two_d_arr(0,0) ' !!! RELEASE MEMORY 
' turn on updates 

在這裏,有沒有循環,這每一個單獨的任務的時間優化從而導致更快的處理時間,並反過來似乎使Excel中正常工作的CPU中(不崩潰)。

HTH,

˚F

4

絕對。幾年前,我有一個運行時間很長的宏,花了差不多一分鐘的時間。我將ScreenUpdating設置爲false,並在5秒內完成。

只要確保你重新ScreenUpdating爲true,當你完成運行宏。

+5

也不要忘記設置ScreenUpdating作爲任何錯誤handeling代碼的第一步你有 – 2010-05-28 07:09:21

13

這取決於有多少你實際上是在屏幕上更新爲你的代碼的一部分(即細胞更新的數量),而且很多片如何在那裏,有多少張/細胞是指板材的代碼更新和整個工作簿中有多少公式。

每次在片改變一些事情的時候,Excel中重新計算所有公式。所以如果你的代碼沒有更新太多的表格/單元格,但是你的工作簿有很多公式,那麼關閉屏幕更新可能根本無法幫到你。

要考慮perfomance還有一件事是計算屬性,將其設置爲xlCalculationManual以關閉自動迴歸並在最後將其變回xlCalculationAutomatic。

Application.Calculation = xlCalculationManual 

還有一點要求索的活動,如果其中一個或多個表的有Worksheet_Chnage或Worksheet_Calculate事件處理每一個你的代碼做會引發他們的變化和你的代碼需要等待,直到他們回來了。所以在你的代碼中關閉它。

Application.EnableEvents = False 

在大多數我的代碼,我susally使用

On Error GoTo lblError 
Dim bEvents As Boolean, iCalc As Integer, bScrnUpd As Boolean 
bEvents = Application.EnableEvents 
iCalc = Application.Calculation 
bScrnUpd = Application.ScreenUpdating 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 

'-----------------------My code 

Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Exit Sub 

'reset them even if you are exiting due to error 
lblError: 
Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Debug.print Err.Description 
+1

完美的答案(這應該是接受的答案)。 「更全面的解釋學校」的典範:例子和樣板文件展示瞭如何最小化代碼對用戶的影響。 – 2014-02-20 17:19:33

5

screenUpdating的改善在很大程度上取決於你的宏是如何編寫的。 這將是特別有用的那些可怕的宏由錄音機,充滿了不必要的「選擇」和「激活」。

3

當你不希望用戶看到屏幕更新我不會用那些「速度」但對於「功能」

Application.ScreenUpdating = False 

當你不想用戶可以看到從應用程序的每個多餘消息:

Application.DisplayAlerts = False 

特別是因爲沒有人願意被威脅到死亡,問你「真是」要更新的消息後,追加或刪除[R ecords。我更喜歡屏蔽這些用戶。