




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
提高VBA運行效率方法
速度問題一直是VBA程序值得關注的一個方面。當您編寫了一個對大量數據進行操作的程序后,在運行時可能會發現程序運行得很慢,有的甚至達好幾分鐘,就像Excel應用程序已崩潰了一樣。但當您發現程序確實在運行,并得到正確的結果后,您可能就會想到如何使程序更快的運行了。當然,代碼運行速度慢可能是VBA程序的一個缺點,這也可能是程序語言本身的一個原因,但我們也可以找到一些方法優化VBA代碼并使程序盡可能快的運行。
下面是我整理的一些優化VBA代碼或提高程序運行速度的方法,有些方法是我們在編程中好的做法和應該養成的好習慣,希望能帶給您一些有益的參考。高質量的程序和運行效率是需要不斷實踐,并在實踐中不斷總結和積累經驗的,也希望您能將在編寫程序過程中發現的一些優化方法介紹給大家共享。
1、盡量簡化代碼
通過簡化代碼,可以提高程序的性能。您可以將通用過程編寫為子過程來調用。例如,假設有一個應用程序需要在不同的地方實現查找一定范圍內的某個特殊條目,在一個沒有簡化代碼的應用程序中,不同的過程可能需要應用各自的算法以實現在某個范圍內查找某一條目,修改每個過程使其采用一個更有效的算法并不是一件很容易的事。而一個簡化的程序則只有一個查找算法,即將該查找算法編寫成通用的子程序,需要查找某個范圍的過程都調用該子程序,通過在查找方法的子程序中優化查找算法,使得調用該方法的所有過程都享受性能提高所帶來的好處。
另外,刪除所有無關的代碼,這在所錄制宏中表現得尤為明顯。在錄制宏時,經常會產生一些與所實現的功能無關的代碼,您可以將這些代碼刪除,以使得代碼得以簡化。
在下面將要講到的設置對象變量代替長對象引用,使用With…EndWith語句、執行ForEach…Next循環語句,根據程序環境盡量減少OLE引用,等等,均是簡化代碼的好方法。
2、強制聲明變量
在VBE編輯器中的菜單“工具——選項”對話框中“編輯器”選項卡中,您應該始終保持“要求變量聲明”復選框被選中,這樣將在模塊代碼頂部出現OptionExplicit語句,要求您在編寫代碼時對所有出現的變量均進行聲明,這樣,在使用變量時減少內存需求并加速性能。
(1)要節省內存資源,必須始終用特定的數據類型聲明所有變量。如果不使用特定的數據類型聲明變量,VBA會創建Variant類型的變量,這將比任何其他數據類型要求更多的內存。
(2)清楚每種數據類型需要多少內存以及它可以存儲的值的范圍。除使用較小的數據類型會導致隱性轉換的情況外,應始終使用盡可能小的數據類型。例如,因為Integer類型的變量將被轉換成Long類型的變量,應該將那些存儲整型值的變量聲明為Long類型,而不是Integer類型。
(3)除非確實需要,應避免使用浮點數據類型。盡管Currency數據類型更大,但它比Single數據類型快,因為Currency數據類型不使用浮點處理器。
(4)如果在一個過程中多次引用一個對象,可以創建對象變量,并將對該對象的引用指派給它。因為對象變量存儲對象在內存中的位置,VBA將不必再次查找其位置。
(5)將對象變量聲明為特定的類型(不是Object類型),以便利用早期綁定。
3、減少變量的作用范圍并及時釋放變量
主要是對象變量,在其使用完后,及時釋放。例如,
DimTempObjAsAnyObject,AnObjAsAnyObject
SetTempObj=NewAnyObject
SetAnObj=TempObj
SetTempObj=Nothing‘釋放對象變量
4、盡可能使用早期綁定
綁定是指將程序調用與實際代碼相匹配。為了實現早期綁定,先應創建對對象庫的引用。早期綁定可以在代碼中使用定義在對象庫中的常量,可以自動列出對象的方法和屬性,但早期綁定只有在所控制的對象擁有獨立的類型庫或對象庫文件才適用且還需要已安裝了特定的庫。而后期綁定則只是在運行時才知道對象的類型并對對象進行引用,因此不具備上述特點。
使用早期綁定創建對象通常更有效率,使代碼能獲得更好的性能。因為對象的早期綁定引用在編譯時可以通過VBE的解析,而不是通過運行時模塊解析,因此早期綁定的性能要好得多。雖然在程序設計時不可能總是使用早期綁定,但應該盡可能使用它。
5、關閉屏幕刷新
在Excel中,其ScreenUpdating屬性值的默認值為True,這樣當寫數據到工作表或者執行任何導致其顯示屬性變化的動作時,Excel的屏幕界面將會不斷的刷新,不僅影響顯示,而且影響程序運行的速度。您可以在進入主程序運行前將屏幕刷新屬性關閉,即用Application.ScreenUpdating=False語句關閉屏幕刷新,這樣將大大改善程序的運行速度。
但在程序運行完成前,要確保將其恢復為原來的設置,即將ScreenUpdating屬性的值設置為True。因為您對該屬性的修改是永久性的修改,Excel不會為您自動恢復其默認值,您必須用語句Application.ScreenUpdating=True恢復設置。
6、設置計算模式為手動
如果您的工作表中含有多個公式,在每次單元格中的值發生變化時,公式都將會重新計算,這會影響程序運行速度。您可以在進入主程序運行前,將計算模式設置為手動,即使用如下語句Application.Calculation=xlCalculationManual,以避免不必要的計算。
當程序運行結束前,您要恢復Excel的默認計算模式設置,即設置為自動重算,可使用下面的語句Application.Calculation=xlCalculationAutomatic,這同ScreenUpdating屬性一樣,Excel不會自動恢復其為默認值。Calculation屬性是對所有工作簿進行的設置,您也可以用工作表的EnableCalculation屬性來設置對某個工作表是否進行重新計算。
7、使用ForEach…Next循環
可以使用ForEach…Next循環來保證程序代碼更快地執行。在使用ForEach…Next循環時,對于存儲在集合或數組中的每個對象執行一組語句,程序更簡潔,也更容易閱讀、調試和維護。當ForEach…Next語句迭代集合時,自動指定一個對集合當前成員的引用,然后在到達集合的尾部時跳出循環語句。
8、使用With…EndWith語句
可以使用With…EndWith語句來盡量減少對象引用。使用With語句對指定的對象完成一系列的任務,而不用重復引用對象。也可以使用嵌套的With語句進一步提高程序代碼的效率。例如,下面的使用With…EndWith語句是在同一個單元格中執行多個操作。
WithWorkbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)
.Formula=”=SQRT(20)”
With.Font
.Name=”Arial”
.Bold=True
.Size=10
EndWith
EndWith
同理,可使用With…EndWith語句在同一個單元格區域中執行多個操作。
9、在執行循環時考慮如何能夠盡可能地節省資源(1)分析循環以查看是否正在不必要地執行一些消耗內存的重復操作。例如,是否可以在循環外(而不是在循環中)設置某些變量?每次都通過循環執行的轉換過程是否可以在循環之外執行?
的。例如,
DimNamesAsVariant
Names=Array(“Fan”,“Yang”,“Wu”,“Shen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關注信息處理技術員考試試題
- 材料力學與智能材料性能監測重點基礎知識點
- 材料疲勞裂紋萌生機理研究重點基礎知識點
- 檢修火災應急演練預案(3篇)
- 化驗室初期火災應急預案(3篇)
- 經濟政策與社會治理的良性互動試題及答案
- 高考數學整體復習安排與試題及答案
- 邊防火災應急預案(3篇)
- 地鐵區間火災的應急預案(3篇)
- 解決代數難題的思路試題及答案
- 滬科版七年級數學下冊 第十章 相交線、平行線與平移 單元測試卷
- 國家開放大學-傳感器與測試技術實驗報告(實驗成績)
- 機械工業出版社2020《人工智能導論》課程第1章 緒論
- 教育教學實習教案幼兒園
- 大眾電子助力轉向EPS 雙齒輪電動助力轉向系統
- 【醫院管理案例學習】-床單位終末消毒標準的執行
- 退化草地修復親水性聚氨酯復合材料應用技術規范
- 暗挖格柵加工技術交底
- DB5106∕T 01-2019 農村彩鋼棚管理指南
- 2023年安徽省公安機關警務輔助人員條例訓練題庫211題及答案
- LBS支撐平臺LBS-p中移動終端地圖數據格式及數據策略研究的中期報告
評論
0/150
提交評論