我的四核心 Acer Aspire S3 Ultrabook 上運行著一個 VBA 程式。問題是,它只使用 25% 的 CPU(其他進程總共使用約 1%)。該筆記型電腦運行 Windows 8.0。 Excel 版本為 2013(32 位元)。僅使用了 55% 的系統 RAM,其中 Excel 使用了 55% 的一半。
我認為可能只使用了 25%,因為 Excel 只使用了一個核心。然而,我沒有任何東西支持這個理論。如何加快程式運作速度?
謝謝。
答案1
我聽起來您嘗試使用的程式是單線程的,這意味著它只能使用單個核心,它不知道其他核心的存在。除了購買具有更快單核心時脈速度的處理器或使用支援多執行緒的程式之外,確實沒有具體的方法可以加快速度。
答案2
以下所有內容適用於 Excel 2007 及更早版本。根據關聯@Ƭᴇcʜιᴇ007 在上面的評論中發布,Excel 2013 中有一些對多線程的本機支援。
遺憾的是,VBA 不支援多線程,因此您的 VBA 計算將僅限於處理器的一個核心。
然而,有一種高級方法可以透過產生 VBscript 檔案並同時執行它們來欺騙 VBA 運行多個執行緒。這可以透過在 Excel 進程之外執行程式碼來解決該問題,並允許 Windows 管理分配給不同執行緒的資源。
也就是說,讓這個工作很可能意味著完全重新思考程式碼的邏輯(即,您必須弄清楚如何以一種對它們同時運行有意義的方式分配任務),這可能對您的專案來說很可能是不可行的。我自己從來沒有實現過這個,所以除了告訴你我已經告訴過你的內容之外,我無法真正幫助你。
不過,如果你想走進兔子洞,這裡有一個有趣的部落格文章這顯示了這樣做的一個例子。請注意:除非您是一位出色的程式設計師,否則您最好忘記這個想法並接受 VBA 在單執行緒中運行。
Stack Overflow 上提供給勇敢者的其他資源:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
當然,還有其他方法可以在不使用多執行緒的情況下最佳化 VBA 程式碼。如果沒有看到您的程式碼,就不可能提出針對性的建議,但這裡有一些常見的嫌疑犯:
- 將工作表中的資料載入到數組中以加快處理速度。與工作表的交互作用是 VBA 執行的主要瓶頸,可以透過使用陣列來最小化。
- 一個相關問題是 Excel 在每次對儲存格進行變更後重新計算工作簿。透過設定可以避免這種情況
Application.Calculation = xlManual
。請務必Application.Calculation = xlAutomatic
在退出 Sub 之前將其設定回原來的位置。
答案3
正如其他人所說,VBA 本身並不是多線程的。如果您想加快速度,您可能需要考慮用另一種語言編寫使用者定義函數(UDF)。
我會推薦您使用 ExcelDNA 並使用 C# 或 VB.Net。如果您已經知道如何編寫一些 C# 並且可以在 UDF 中控制多線程,那麼它們將非常容易使用。
答案4
正如上面其他人所說,線程將是答案,但這並不是一個真正可行的解決方案,升級到 64 位元的差異可以忽略不計。您可以嘗試做的一件事是提高進程的優先級,您可以看到如何做到這一點這裡。
很難說這是否會讓你的腳本更快,因為程式中的其他地方可能存在另一個瓶頸(例如,從光碟讀取/寫入),但它至少會讓Windows 知道它的優先順序比你的更高。