VBA編程時常用的提速方法作者:網(wǎng)絡(luò) | 來源:網(wǎng)絡(luò)轉(zhuǎn)摘 | 時間:2008-05-07 | 閱讀權(quán)限:游客 | 會員幣:0 | 【大 中 小】
速度是程序設(shè)計永恒的熱門話題,使用VBA編程當然也不例外,這里就將在網(wǎng)上收集到的VBA編程常用提速的方法與自己在VBA編程時的心得整理一下,上傳到這里.
一、讓代碼"專注"運行
1.將Application.ScreenUpdating設(shè)定為False,關(guān)閉屏幕更新.這個是最基本的加速方法,在程序結(jié)束設(shè)還原時設(shè)定為True.
2.將Application.EnableEvents設(shè)定為False,禁止觸發(fā)事件.這個在有其它自定義事件時,如定義了Worksheet_Change時,就有需要設(shè)定,還原時設(shè)定為True.
3.將Application.Interactive設(shè)定為False,禁止交互模式.當我們運行程序時,如刪除有數(shù)據(jù)的工作表而不需要提示,這時就可以使用,見意這段代碼只加在需要的地方,之后就立即開啟.
4.將Application.Calculation設(shè)定為xlCalculationManual,將計算模式設(shè)定為手動.當工作簿中有大量公式時,這樣的設(shè)定提速特別明顯,還原時設(shè)定為xlCalculationAutomatic.
二、單元格(區(qū)域)寫法的選擇
單元格(區(qū)域)寫法有3種,以A1單元格為例,可以使用
1.Cell對象寫法:cells(1,1)
2.Range對象寫法:Range("A1")
3.名稱寫法:[A1]
三種寫法各有優(yōu)缺點,但以取值速度論,cells(1,1)最快,[A1]寫法最慢,Range("A1")比cells(1,1)稍慢,但優(yōu)點是在VBE中輸入可以顯示屬性方法等快速輸入信息.此外,要明示對象屬性而不要依賴于對象的默認屬性,這是一種好的編程習慣.下面兩句,第二句要比第一句快得多:
x= cells(1,1)
x= cells(1,1).value
三、比較語句
1.分解IF語句
如:
IF A THEN
IF B THEN
優(yōu)于
IF A AND B THEN
與
IF A THEN
...
ELSE IF B THEN
優(yōu)于
IF A OR B then
2.并列的條件使用elseif或select,elseif寫起來麻煩,但速度優(yōu)于select
3.將最可能的條件及容易計算的條件放在前面
上面分解后的A應(yīng)當比B出現(xiàn)的機會更大,或者需要進行計算更容易計算出結(jié)果,select語句放在前面的case也應(yīng)這樣
4.Iif速度慢于if/else
四、循環(huán)語句
1.For 語句快于DO/WHILE,這是因為FOR語句的增量部分是VBA自帶的,特別是步長為1的更明顯
2.For/each快于for/to
五、使用With語句
with語句不僅僅是簡化了寫法,速度也大大提升了。
六、盡量不用Variant類型
這不用多說吧,使用Option Explicit是一個好習慣。
給返回值一個明確的類型,會對提速有好處。雖然有時候我們覺得不明顯,這是很多人使用left$,而不用left,使用int%,而不用int的原因(你是否對這種寫法好奇過?)。但如果你一開始你就沒有DIM,這就很有必要了。
七、關(guān)注內(nèi)存
對占用內(nèi)存較多的對象變量,不要時要記住set=nothing,如果你對你的機器內(nèi)存的容量沒有信心,應(yīng)避免使用遞歸程序,遞歸的過程會吃掉大量的內(nèi)存。
八、使用工作表函數(shù)(方法)
有些工作表函數(shù)(方法)速度是很快的,比如FIND,VLOOKUP等,要記得使用它們,不要花力氣去做不討好的事。當使用工作表函數(shù)時,操作對象應(yīng)避免使用內(nèi)存變量,那樣反而慢。
九、劃零為整
當需要對較大區(qū)域進行相同的操作時,可以先使用union等方法收集,一次進行。在Range對象上尤其明顯,內(nèi)容、格式變更,刪除等等一個一個的處理要比把這些選定后一起處理慢得多的多。
十、使用內(nèi)存數(shù)組
1.內(nèi)存變量的運算速度大大快于RANGE對象。
1)將RANGE數(shù)據(jù)寫入內(nèi)存數(shù)組。下面兩句將生成一個65536行,6列的數(shù)組。用這種方法產(chǎn)生的數(shù)組都是兩維數(shù)組,即使引用的RANGE只有一行或一列。下標始于1,不受option base設(shè)置的影響。arr必需聲明為Variant類型。
Dim arr()
arr=range(“A1:F65536”)
2)將內(nèi)存數(shù)組數(shù)據(jù)寫入RANGE。在內(nèi)存數(shù)組經(jīng)過計算處理后,寫回時只需下句就可以了。
range(“A1:F65536”)= arr
2.非數(shù)組變量快于數(shù)組變量。當數(shù)組很大時,根據(jù)下標提取數(shù)值會比從單個變量慢得多,這時可以把需要多
次使用的數(shù)組值先賦給內(nèi)存變量。
3.減少使用REDIM的次數(shù)。REDIM是對數(shù)組操作中最費時的動作??梢韵阮A(yù)算大小,不夠或多余時再進行調(diào)整。
轉(zhuǎn)載請注明:本文來自:Excel吧 (www.excelba.com) 詳細出處參考:http://www.excelba.com/Art/Html/264.html