2017-07-26 63 views
4

備選標題:爲什麼按Esc鍵讓我的MS-Word宏運行速度更快

在等待一些代碼來運行我碰到一些有趣的東西絆倒了。爲什麼從標準模塊(而不是用戶表單)調用VBA代碼時運行得更快?

代碼運行緩慢...按Esc代碼運行速度很快。例如:

  • Esc鍵執行後立即 - 2秒完成
  • 不按Esc鍵在所有 - 高達30秒完成

要我這沒有任何意義。原來,其他人都注意到類似的行爲,例如:

而且他們已經發現各種解決方案或解決方法。 但是,這些帖子是針對MS-Excel的;它看起來對於Esc關鍵字具有不同的行爲。

In MS-Excel pressing the Esc key可以(取決於Application.EnableCancleKey的設置)中斷代碼或引發錯誤(Err 18),或者什麼都不做。另一方面,in MS Word no such thing happens,改爲Application.EnableCancleKey改變行爲Ctrl + 暫停。儘管如此,按下Esc也會大大加快代碼執行速度。

不同之處在於,我的問題更多地與代碼在用戶窗體中的位置有關。例如,在我的用戶窗體:

Private Sub Cmd_Click() 

    Module1.Macro1 
    Module1.Macro2 
    Module1.Macro3 

End Sub 

在測試了Word 2010中的64位版本,使用上面的結構比本顯著慢:

用戶窗體:

Private Sub Cmd_Click() 

    Module1.RunMacro123 

End Sub 

標準模塊:

Private Sub RunMacro123() 

    Module1.Macro1 
    Module1.Macro2 
    Module1.Macro3 

End Sub 

我應該注意以下幾點:

  1. 這是在MS Word的64位版本最明顯,32位版本似乎與原來的代碼相當快的運行(我還沒有與修改後的代碼進行測試)
  2. 像在第一環節作者我不使用選擇對象等
  3. 我更感興趣的任何見解,爲什麼代碼執行的速度是如此受以下因素影響:
    • Esc鍵
    • 移動從用戶窗體調用一個標準模塊
  4. 宏1,Macro2 & Macro3創建和編輯文檔樣式和(FWIW)涉及讀取INI文件多次

在一個側面說明,在一個聰明的嘗試被發現我嘗試使用SendKeys發送Esc鍵,但它沒有任何影響。

編輯 - 定時碼的結果:

我最終使用的定時器功能,以時間的代碼,我已實施將其適於從這裏堆棧類:http://www.tek-tips.com/viewthread.cfm?qid=1468970

我增加了一個「絕對'定時器(debug.print timer - startTime),以便在每次彈出時記錄每次推送之間的時間並重置定時器(startTime = timer)。這樣做使得比較時間更容易在NotePad ++

這使我可以確定將樣式應用到文檔的子應用樣式(定時器返回的NB值=午夜過後的秒)需要0.04秒。

下圖顯示了代碼計時結果的示例。基本上,據我所知,代碼執行的延遲來自許多與相同基本任務相關的遞增延遲。 Comparing code execution times in NotePad++

由於計時器與調用堆棧的工作方式,我不得不測試代碼getStyleElement以確保它不會顯着影響額外的時間。我通過直接對代碼進行計時來完成這項工作,並能夠確認運行速度一直很快。

檢查其餘代碼確認問題出在applyStyleFormat(其調用getStyleElement)。

樣式應用於文檔 - 代碼結構包括With塊和For循環;是這樣的:

For i = 1 to Styles.Count 
    With aDocument.Styles(i) 
     .Font.??? = Something 
     ' or .Paragraph.??? = Something 
    End With 
Next i 

我沒有清晰的,爲什麼代碼運行在用戶窗體之外更快,或按Esc鍵但它和它似乎有事情做與修改樣式。 ..

+0

我建議你把一些'debug.print Now&「:放在代碼中''絕對到處去理解它究竟滯後的地方 –

+0

@ThomasG我很欣賞你在說什麼,我可以用'vba.Timer'來查找滯後和(現在很痛苦)我可能會回去做這件事 - 但我已經有了一個解決方案......我只是不明白爲什麼解決方案能夠正常工作,也不知道爲什麼按Esc鍵會加快代碼的速度。 – SlowLearner

+0

我不理解,也正是試圖理解它,你應該知道它落後於哪條指令。定時器不會在這裏任何幫助 –

回答

0

只需拉動@Florent B的線程評論,你有沒有嘗試過在點擊事件中運行宏之前可以禁用什麼?像

Application.EnableEvents = False 
Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

'code 
Module1.Macro1 
Module1.Macro2 
Module1.Macro3 

Application.EnableEvents = True 
Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 

只是爲了看看事情是否更快?可能有其他命令取消其他人可以添加的內容。

+1

感謝您的想法 - 在MS Word中,(據我所知)沒有等同於Application.EnableEvents&Application.Calculation。至於屏幕更新,已被禁用,此外屏幕更新通過API被禁止:Private Declare PtrSafe Function LockWindowUpdate Lib「user32」(ByVal hWndLock As LongPtr)As LongPtr 欣賞拉這個線程可能會暴露的問題,但我什麼'最感興趣的是'爲什麼'...我會根據最近公佈的最新測試結果更新這個問題......乾杯, – SlowLearner

相關問題