讀古今文學網 > 別怕,ExcelVBA其實很簡單 > 7.5 讓代碼跑得更快一些 >

7.5 讓代碼跑得更快一些

7.5.1 合理地使用變量

聲明變量為合適的數據類型

不同的數據類型佔據不同大小的內存空間,如表3-1所示,數據所佔內存空間的大小直接影響計算機處理數據的速度。因此,為了提高程序的效率,在聲明變量時,在滿足需求的前提下,應該盡量選擇佔用字節少的數據類型。

盡量不使用Variant型數據

Variant是VBA中一種特殊的數據類型,所有沒有聲明數據類型的變量都默認為Variant型。但Variant型所佔據的存儲空間遠遠大於其他數據類型,所以除非必須需要,否則應避免聲明變量為Variant型。

不要讓變量一直待在內存裡

如果一個變量只在一個過程裡使用,請不要聲明它為公共變量,盡量減少變量的作用域,這是一個好習慣。

如果你不再需要使用某個變量(尤其是對像變量)了,請記得釋放它,不要讓它一直呆在內存裡。

7.5.2 避免反覆引用相同的對象

無論是引用對象,還是調用對象的方法或屬性,都會用到點(.)運算符,每次運行程序,計算機都會對這些點(.)運算符進行解析,當點(.)運算符過多時,會花去不少的時間。

在這個程序中,ThisWorkbook.Worksheets(1).Range(“A1”)是每一句代碼都反覆引用的對象。

引用對像不可避免,但當反覆引用同一個對像時,可以用一些方法來簡化它,從而減少點(.)運算符。

使用With語句簡化引用對像

還可以使用嵌套的With語句進一步簡化程序:

關於With語句,請參閱3.7.7小節的內容。

使用變量簡化引用對像

除了With語句,還可以使用變量來簡化對相同對象的引用。如:

還可以借助With語句進一步簡化輸入:

7.5.3 盡量使用函數完成計算

Excel已經準備了很多現成的函數(工作表函數和VBA內置函數),儘管你可以通過編寫程序去實現相同的目的,但對於相同的計算,使用函數比編寫程序解決效率要高很多。

7.5.4 去掉多餘的激活和選擇

如果你的程序是通過錄製宏得到的,那裡面一定有很多的激活和選擇操作,即Activate方法和Select方法。如:

這是一個複製單元格的程序,調用了4次Select方法。但事實上並不需要激活工作表,選中單元格後才能執行複製、粘貼操作,所以這些選中工作表和單元格的代碼都是多餘的,程序可以簡化為:

去掉多餘的操作,不僅可以讓程序更簡潔,降低閱讀和調試的難度,還能提高程序運行的速度。

7.5.5 合理使用數組

下面的程序把1到65536的自然數寫入A1:A65536中。

逐個將數據寫入單元格,在筆者的電腦上,程序運行的時間是2.52秒,如圖7-23所示。

圖7-23 逐個將數據寫入單元格需要的時間

很明顯,這樣的操作是比較費時的。

如果想提高運行速度,可以先把數據寫入數組,再通過數組批量寫入單元格,如:

使用數組後的程序只需要0.09秒的時間,速度提高了28.1倍,如圖7-24所示,差距顯而易見。

圖7-24 數組批量寫入單元格所需的時間

將一維數組寫入A列單元格前,必須先使用工作表的TRANSPOSE函數將數組進行轉置。如果想省去轉置的計算步驟,可以直接將數組定義為一個多行一列的二維數組,如:

7.5.6 關閉屏幕更新

設置Application對象的ScreenUpdate屬性為False(參閱4.2.1小節),在程序運行過程中關閉屏幕更新,可以在一定程度上縮短程序運行的時間。

如果你的程序很短,需要做的操作很少,那代碼是否優化,也許差別並不大。但如果要處理的數據很多,進行的操作很複雜,編寫的程序很長時,優化程序代碼是很有必要的。

無論你現在是否接觸到這些複雜的問題,但請相信我,養成一個良好的習慣,編寫簡潔、高效的代碼會給你學習和使用VBA,最終成為一個VBA高手帶來很大的幫助。