備選標題:爲什麼按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
我應該注意以下幾點:
- 這是在MS Word的64位版本最明顯,32位版本似乎與原來的代碼相當快的運行(我還沒有與修改後的代碼進行測試)
- 像在第一環節作者我不使用選擇對象等
- 我更感興趣的任何見解,爲什麼代碼執行的速度是如此受以下因素影響:
- 按Esc鍵
- 移動從用戶窗體調用一個標準模塊
- 宏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秒。
下圖顯示了代碼計時結果的示例。基本上,據我所知,代碼執行的延遲來自許多與相同基本任務相關的遞增延遲。
由於計時器與調用堆棧的工作方式,我不得不測試代碼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鍵後但它和它似乎有事情做與修改樣式。 ..
我建議你把一些'debug.print Now&「:放在代碼中''絕對到處去理解它究竟滯後的地方 –
@ThomasG我很欣賞你在說什麼,我可以用'vba.Timer'來查找滯後和(現在很痛苦)我可能會回去做這件事 - 但我已經有了一個解決方案......我只是不明白爲什麼解決方案能夠正常工作,也不知道爲什麼按Esc鍵會加快代碼的速度。 – SlowLearner
我不理解,也正是試圖理解它,你應該知道它落後於哪條指令。定時器不會在這裏任何幫助 –