2010-11-03 46 views
1

我有一個需要很長時間的Excel宏。當我離開它時,它似乎會使Excel崩潰(我在任務欄中收到Not Responding消息),但是如果我將每五秒或十秒鐘發生一次斷點,那就沒關係。麻煩的是,我需要從斷點開始大約四分之一秒(我們正在尋找大約200小時來執行這個野獸)我如何屈服於Excel VBA 2010中的消息泵?

我猜測沒有消息泵活動是對抗內核,那麼我該如何刷新消息隊列呢?或者我完全吠叫錯誤的樹?

順便說一句,我很新,所以文檔的參考將非常受歡迎。

乾杯, 蓋伊

回答

6

借調即200H是有點令人擔憂,但是你可以嘗試DoEvents聲明,「投降宏的執行,以便操作系統可以處理其他事件」的意見。 (請注意,調用DoEvents有額外的時間損失)

+0

200小時也嚇壞了我,但這是一個可用的人力和優先事項。我讓這個宏更具可定製性,這樣一個熟悉文件組織的人(我錯誤地使用「組織」這個詞)可以手動優化搜索路徑 - 儘管這意味着有人需要照顧過程,他們不是一個昂貴的工程師。我認爲我們現在下降到大約10個小時。我可以用一個C++ DLL(我最喜歡的語言)來完成它,並且它的工作速度更快,但是這個宏只花了幾個小時來編寫和測試--C++路由本來會更加昂貴 – hatcat 2010-11-03 16:31:58

0

「沒有響應」並不意味着Excel的崩潰,它只是意味着它實際上並沒有到窗口的消息作出迴應。

除非這是一個問題,否則你不需要擔心。我很擔心你的評論,你期望任務花費200小時(這是一週以上!)。在我看來,你沒有使用正確的工具來完成這項工作。試着找出需要花費很長時間的東西,並解釋你實際在做什麼。然後我們可以看到如何更好地解決這個任務。

1

我必須同意0xA3,如果你有一個excel例程,預計需要超過200小時的運行,那麼你要麼設置它在非常效率低下,或者您使用錯誤的工具完成這項工作。

在任何情況下,您都可以做一些事情來優化例程。如果您不斷向單個單元寫入值,這些將特別有用。

Sub MarathonCalc 

    Application.EnableEvents = False 
    Application.ScreenUpdating = False 

    ' Code to decode human genome goes here 

    Application.EnableEvents = True 
    Application.ScreenUpdating = True 

End Sub 

同樣,如果您發佈了一些代碼,或許我們可以幫助追查爲什麼它需要這麼長時間。

0

以前的答案給了你'DoEvents',這是你的問題的第一線修復。

但是......仔細看看發生了什麼會引起一些令人擔憂的問題。首先,Excel的線程模型是相當原始的:有一個過程(根據文檔),沒有新線程是由內部或外部生成的事件,回調和消息創建的。只有一個進程和一個進程,其他所有內容都要等到當前的VBA宏或電子表格計算運行完成。實際上,有些東西可能會打斷這個:{esc}和{ctrl-break}(儘管這些可以暫時禁用),所以至少有一個其他線程始終在Excel中運行,並且您希望操作系統被允許進入一個進程......不是嗎?

醜陋的現實是,除非您調用「DoEvents」和某些Windows消息(注意大小寫),否則Excel應用程序不允許外部事件和消息在宏或計算運行時運行到「事件接收器」仍然不會被處理。

如果沒有記錄的消息和外部事件數量懸而未決,應用程序將崩潰。根據我自己的測試,我認爲這個數字是50;有關於註冊表設置的文檔,但我沒有鏈接到我認爲不可靠的材料 - 我嘗試了有問題的設置,發現它無效。

那麼,你離開了哪裏?

首先,再次查看您的代碼。 Application.EnableEvents = False和Application.ScreenUpdating = False是有用的設置:下一步是查找對錶單上單個單元格的所有讀取或寫入操作,並只抓取單元格數組 - 使用數組獲取數組要快得多myVBAarray = Range.Value,在VBA中進行計算,然後將VBA數組變量寫回Range.Value。其次......你也已經看到,由斷點強加的「等待」狀態可以讓某些事情自行排序。這聽起來像是一個異步運行的外部過程(數據庫查詢?):是否會導致Excel崩潰的消息或事件來自該進程?