Excel VBA 学习总结 - 代码优化之道
代码规范的优化
优化了算法,采用了合适的函数和对象实现了算法后,代码其实还是有优化的空间,比如编程习惯,代码风格等,下面从这些方面总结一下。
1、尽量减少无用的操作,如对象的激活和选择
事实上大多数情况下激活和选择操作都只是有一点视觉效果,但很遗憾这对于VBA来说不是必需的。例如:
Sheets(″Sheet3″).Select
Range(″A1″).Value = 100
Range(″A2″).Value = 200可改为:
.Range(″A1″).Value = 100
.Range(″A2″).Value = 200
End With
2、尽量减少使用对象引用,即减少“.”的使用,尤其在循环中
每一个Excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用,这些OLE调用都是需要时间的,减少使用对象引用能加快VBA代码的运行。例如
(1)使用With语句。
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.FontStyle=″Bold″则以下语句比上面的快:
.Name = ″Pay″
.FontStyle = ″Bold″
End With
(2)使用对象变量。
如果你发现一个对象引用被多次使用,则你可以将此对象用Set 设置为对象变量,以减少对对象的访问。如:
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)在循环中要尽量减少对象的访问。
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)在循环中要尽量减少对象的访问。
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、有效地使用数组与变量,尽量少使用单元格直接参与计算
通常单元格的操作都比较慢,可以先将单元格的值读入变量或数组变量,对变量进行运算,这样可以提高处理的速度。处理结束以后,只要用一个语句就可以将数组中的数据传递回单元格区域中。
在创建已知元素的确定数组时,使用Array函数对于节约空间和时间以及写出更具效率的代码是非常理想的。例如:
Dim Names As Variant
Names=Array(“Fan”,“Yang”,“Wu”,“Shen”) 此外,应该尽量使用固定大小的数组。如果确实选择使用了动态数组,应该避免数组每增加一个元素就改变一次数组的大小,最好是每次增加一定数量的元素。
http://wenku.baidu.com/view/7ec7c74e2e3f5727a5e962f1.html