高贊回答已經很全面了,我再從程式設計師的視角補充一些可有可無的東西,平時基本用不到,真的遇到計算能力弱爆了的電腦(大批次的運算配合低階面向移動裝置的省電低電壓處理器會導致Excel視窗會直接消失)或者計算大一些的資料幾個小時才能出結果的時候再考慮參考一下。
其他想到再說
高贊回答已經很全面了,我再從程式設計師的視角補充一些可有可無的東西,平時基本用不到,真的遇到計算能力弱爆了的電腦(大批次的運算配合低階面向移動裝置的省電低電壓處理器會導致Excel視窗會直接消失)或者計算大一些的資料幾個小時才能出結果的時候再考慮參考一下。
把VBA程式,用VB語言轉化為動態連結庫.dll,也就是說我們平時執行VBA,會讓VBA每一句自動轉化為機器語言然後執行然後定位到下一句準備轉化為機器語言,這一個操作在轉化為dll檔案後就好了。然後工具-引用,選取這個dll,直接在VBA中寫函式名就可以執行,這個折騰適合願意折騰的人來嘗試。熟練應用陣列,把資料,從單元格里傳進陣列,運算完畢傳回單元格,在數組裡運算速度非常快。跟工作表一互動,速度非常明顯的被拖累,不管是賦值還是取值,速度相差大概一個數量級,也就是陣列1秒能完成,工作表的互動需要10秒熟練應用dictionary,感覺這個就是vba的靈魂。可以讓你迅速定位到一百萬資料滿足要求的某一行。讓你在1毫秒內判斷某個電話有沒有在100萬資料中出現過。熟練應用全域性變數。有些變數你的程式每次呼叫都呼叫同樣的值,讀取同樣的表生成同樣的變數。每次執行都要執行一遍必然浪費時間。在模組中宣告public變數,可以讓你的變數永駐記憶體,下次執行程式無需重新定義。(典型示例:結合上一條中提及的dictionary物件。透過dictionary物件對五十萬條資料生成雜湊表的過程大概20秒鐘,每次都執行dictionary操作五十萬條資料必然導致每次都很慢,如果宣告全域性變數,這20秒只需要執行一次即可,注意這裡原始資料發生更改的同時要對這個dictionary物件進行及時的更新才可以保證資料每次都是最新的)VBA是單執行緒語言,只能佔用多核心CPU的某一核。Excel這個程式中的函式本身就擅長把大量的計算分攤給各個CPU。VBA如果能借用Excel的長處必定會讓程式佔用更大的CPU,以便提高計算速度。利用Application.WorksheetFunction可以更快的對你的VBA的許多運算做效能改進,還是得好好學公式,excel提供了很全面的數學公式,應該說我們用到的東西基本不用自己編了(待驗證, 推測這些內建矩陣運算會很高效)還要熟練使用ctrl+shift+enter陣列及excel自帶陣列公式,雖然我也不知道這會不會提高太大效率,我沒試過,可能很多R語言中常用的功能Excel都有提供的方式,只是沒幾個人用excel到這個程度所以沒幾個人會,所以用到這個程度的人也都被告知excel不能做這個了。任務管理器->詳細資訊->Excel.exe->右鍵單擊->設定優先順序->實時,這樣就不用擔心自己本身電腦計算能力有限而別的程式又向excel搶CPU和記憶體資源了。什麼變數就宣告什麼型別。幾千的數值就integer,幾萬就long,不要不宣告資料型別,否則記憶體分配嚴重不合理會導致速度過慢。其他想到再說