VBA提速總結
1.强制声明变量
保証在代码顶部有Option Explicit语句,這將要求您在编写代码时对所有出现的变量均进行声明,这样,在使用变量时减少内存需求并加速性能。
2.停止相關屬性
(1)关闭屏幕刷新,在Excel中,其ScreenUpdating属性值的默认值为True,这样当写数据到工作表或者执行任何导致其显示属性变化的动作时,Excel的屏幕界面将会不断的刷新,不仅影响显示,而且影响程序运行的速度。您可以在进入主程序运行前将屏幕刷新属性关闭,即用Application.ScreenUpdating = False语句关闭屏幕刷新,这样将大大改善程序的运行速度。
但在程序运行完成前,要确保将其恢复为原来的设置,即将ScreenUpdating属性的值设置为True。因为您对该属性的修改是永久性的修改,Excel不会为您自动恢复其默认值,您必须用语句Application.ScreenUpdating = True恢复设置。
(2)将Application.EnableEvents设定为False,禁止触发事件.这个在有其它自定义事件时,如定义了Worksheet_Change时,就有需要设定,还原时设定为True.
(3)将Application.Interactive设定为False,禁止交互模式.当我们运行程序时,如删除有数据的工作表而不需要提示,这时就可以使用,见意这段代码只加在需要的地方,之后就立即开启.
(4)在进入主程序运行前,将计算模式设置为手动,即使用如下语句Application.Calculation = xlCalculationManual,以避免不必要的计算。 当程序运行结束前,设置为自动重算,可使用下面的语句Application.Calculation = xlCalculationAutomatic,这同ScreenUpdating属性一样,Excel不会自动恢复其为默认值。Calculation 属性是对所有工作簿进行的设置,您也可以用工作表的EnableCalculation属性来设置对某个工作表是否进行重新计算。
2.對象引用
(1).单元格(区域)写法的选择
单元格(区域)写法有3种,以A1单元格为例,可以使用
最快:Cell对象写法:cells(1,1)
稍慢:Range对象写法:Range("A1")
最慢:名称写法:[A1]
此外,要明示对象属性而不要依赖于对象的默认属性.
例1:
x= cells(1,1)
优化后:
x= cells(1,1).value
(2).盡可能少使用對象引用,可以在局部进行缓存对象引用
如:
Dim i As Long
For i=1 to 10
Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Cells(1,i).Value=i
Next i
优化后的:
Dim ws As Worksheet
Dim i As Long
Set ws= Workbooks(“Book1.xls”).Worksheets(“Sheet1”)
For i=1 to 10
ws.Cells(1,i).Value=i
Next i
3.語句選擇
(1)條件語句
分解IF语句
例1:
IF A AND B THEN
优化后:
IF A THEN
IF B THEN
例2:
IF A OR B then
优化后:
IF A THEN
...
ELSE IF B THEN
(2)case語句
并列的条件使用elseif或select,elseif写起来麻烦,但速度优于select
(3)循环语句
For 语句快于DO/WHILE,特别是步长为1時更明显
For/each快于for/to
盡量不要使用遞歸
(4)使用With…End With语句
可以使用With…End With语句来尽量减少对象引用。使用With语句对指定的对象完成一系列的任务,而不用重复引用对象。也可以使用嵌套的With语句进一步提高程序代码的效率。
如:
With Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)
.Formula=”=SQRT(20)”
With .Font
.Name=”Arial”
.Bold=True
.Size=10
End With
End With
4.函數選擇
(1).使用Len()检验空串
为了测试零长度的串,可以选择把串与””相比较,或者比较串的长度是否为0,但这些方法比用Len()函数要用更多的执行时间。当对字符串应用Len()函数并且函数返回0值时,说明该字符串是空的或者是零长度的字符串。
并且,因为在If语句内非零值被认为是True,所以直接使用Len()函数而不必与””或0比较,减少了处理时间,因此执行更快。
例1:
if str<>"" then
优化后:
if len(str) then
(2).使用工作表函数(方法)
有些工作表函数(方法)速度是很快的,比如FIND,VLOOKUP等,要记得使用它们,不要花力气去做不讨好的事。当使用工作表函数时,操作对象应避免使用内存变量,那样反而慢。
參考文獻:
http://fanjy.blog.excelhome.net/user1/fanjy/archives/2006/542.html
http://blog.excelhome.net/user1/fanjy/archives/2006/604.html