Excel VBA 學(xué)習(xí)總結(jié) - 代碼優(yōu)化之道
代碼規(guī)范的優(yōu)化
優(yōu)化了算法,采用了合適的函數(shù)和對(duì)象實(shí)現(xiàn)了算法后,代碼其實(shí)還是有優(yōu)化的空間,比如編程習(xí)慣,代碼風(fēng)格等,下面從這些方面總結(jié)一下。
1、盡量減少無(wú)用的操作,如對(duì)象的激活和選擇
事實(shí)上大多數(shù)情況下激活和選擇操作都只是有一點(diǎn)視覺(jué)效果,但很遺憾這對(duì)于VBA來(lái)說(shuō)不是必需的。例如:
Sheets(″Sheet3″).Select
Range(″A1″).Value = 100
Range(″A2″).Value = 200可改為:
.Range(″A1″).Value = 100
.Range(″A2″).Value = 200
End With
2、盡量減少使用對(duì)象引用,即減少“.”的使用,尤其在循環(huán)中
每一個(gè)Excel對(duì)象的屬性、方法的調(diào)用都需要通過(guò)OLE接口的一個(gè)或多個(gè)調(diào)用,這些OLE調(diào)用都是需要時(shí)間的,減少使用對(duì)象引用能加快VBA代碼的運(yùn)行。例如
(1)使用With語(yǔ)句。
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.FontStyle=″Bold″則以下語(yǔ)句比上面的快:
.Name = ″Pay″
.FontStyle = ″Bold″
End With
(2)使用對(duì)象變量。
如果你發(fā)現(xiàn)一個(gè)對(duì)象引用被多次使用,則你可以將此對(duì)象用Set 設(shè)置為對(duì)象變量,以減少對(duì)對(duì)象的訪(fǎng)問(wèn)。如:
Workbooks(1).Sheets(1).Range(″A2″).Value = 200則以下代碼比上面的要快:
Set MySheet = Workbooks(1).Sheets(1)
MySheet.Range(″A1″).Value = 100
MySheet.Range(″A2″).Value = 200 (3)在循環(huán)中要盡量減少對(duì)象的訪(fǎng)問(wèn)。
For k = 1 To 1000
Sheets(″Sheet1″).Select
Cells(k,1).Value = Cells(1,1).Value
Next k則以下代碼比上面的要快:
Sheets(″Sheet1″).Select
For k = 1 To 1000
Cells(k,1).Value = TheValue
Next k
(3)在循環(huán)中要盡量減少對(duì)象的訪(fǎng)問(wèn)。
For k = 1 To 1000
Sheets(″Sheet1″).Select
Cells(k,1).Value = Cells(1,1).Value
Next k
則以下代碼比上面的要快:
Set TheValue = Cells(1,1).Value
Sheets(″Sheet1″).Select
For k = 1 To 1000
Cells(k,1).Value = TheValue
Next k
3、有效地使用數(shù)組與變量,盡量少使用單元格直接參與計(jì)算
通常單元格的操作都比較慢,可以先將單元格的值讀入變量或數(shù)組變量,對(duì)變量進(jìn)行運(yùn)算,這樣可以提高處理的速度。處理結(jié)束以后,只要用一個(gè)語(yǔ)句就可以將數(shù)組中的數(shù)據(jù)傳遞回單元格區(qū)域中。
在創(chuàng)建已知元素的確定數(shù)組時(shí),使用Array函數(shù)對(duì)于節(jié)約空間和時(shí)間以及寫(xiě)出更具效率的代碼是非常理想的。例如:
Dim Names As Variant
Names=Array(“Fan”,“Yang”,“Wu”,“Shen”) 此外,應(yīng)該盡量使用固定大小的數(shù)組。如果確實(shí)選擇使用了動(dòng)態(tài)數(shù)組,應(yīng)該避免數(shù)組每增加一個(gè)元素就改變一次數(shù)組的大小,最好是每次增加一定數(shù)量的元素。
http://wenku.baidu.com/view/7ec7c74e2e3f5727a5e962f1.html