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