Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2135|回复: 1

[分享] 编写高效Excel VBA代码的最佳实践(五)

[复制链接]
发表于 2012-1-12 10:16 | 显示全部楼层 |阅读模式
编写高效Excel VBA代码的最佳实践(四)
http://www.excelpx.com/thread-219360-1-1.html
编写高效Excel VBA代码的最佳实践(五)
使用With…End With语句
可以使用With…End With语句来尽量减少对象引用。使用With语句对指定的对象完成一系列的任务,而不用重复引用对象。也可以使用嵌套的With语句进一步提高程序代码的效率。例如,下面的使用With…End With语句是在同一个单元格中执行多个操作。
With Workbooks(“Book1.xls”).Worksheets(“Sheet1″).Range(“A1″)
.Formula=”=SQRT(20)”
With .Font
.Name=”Arial”
.Bold=True
.Size=10
End With
End With
同理,可使用With…End With语句在同一个单元格区域中执行多个操作。
尽量减少OLE引用
调用每个VBA方法或属性都需要一个或多个OLE引用,这样在代码中会有多个点运算符,而每次代码调用都需要对这些点运算符进行解析,这将花费更多的时间。因此,在调用方法或属性时减少引用长度将是使您的程序运行更快的一种好方法。
可以通过尽量减少在VBA程序代码中使用OLE(对象链接与嵌入自动识别)引用来优化程序代码。VBA语句中所调用的方法和属性越多,执行语句所用的时间就越多。例如下面的两个语句:
语句1:
Workbooks(1).Sheets(1).Range(“A1″).value=”10″
语句2:
ActiveWindow.Left=200
执行时,语句2比语句1快。
同样,上面所讲的对重复使用的对象引用指定一个变量,通过调用变量从而保证避免多次进行对象引用。
尽可能少使用“.”,使用对象变量
在前面已经介绍过的对长对象引用使用对象变量以及使用With…End With等都是简化”.”的方法。因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用,而这些过程调用必须在后台执行。真正好的做法是在局部进行缓存对象引用,例如,应该把对象模型中较高层次的对象引用保存到局部对象变量中,然后用这些对象引用创建其他较低层次的对象引用。例如,引用某单元格数据时,可用如下代码:
Dim i As Long
For i=1 to 10
Workbooks(“Book1.xls”).Worksheets(“Sheet1″).Cells(1,i).Value=i
Next i
但下面的代码运行效率更高,因为代码中引用Workbook对象和Worksheet对象的调用命令只执行一次,而上面的代码中却要执行10次。
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
当您一遍又一遍的使用相同对象引用时,您可以将该对象引用设置成一个变量,然后使用该变量代替对象引用。这样,您在代码中只需对该对象变量进行引用即可。
例如,下面的示例在每行中调用Workbook对象的Sheets属性、Range属性和Value属性三次,当您循环1000次时,总共要调用属性6000次。
Sub DoThis1()
Dim Start As Double, Finish As Double
Start = Timer
‘————————————–
Dim N As Long
For N = 1 To 1000
Workbooks(“Book1″).Sheets(1).Range(“c5″).Value = 10
Workbooks(“Book1″).Sheets(1).Range(“d10″).Value = 12
Next
‘————————————–
Finish = Timer
MsgBox “本次运行的时间是” & Finish – Start
End Sub
您能在循环开始前通过设置Workbooks(“Book1”).Sheets(1)作为一个对象变量来优化上面的例子,下面的示例在每行仅调用一个Range属性,当循环1000次时,总共只调用该属性2000次。
注意,“Value”是一个缺省属性,通常不需要明确指定它,它将被自动调用。因此,该属性在下面的代码中被忽略。然而,就养成良好的编程习惯而言,还是建议您最好写明该属性。
Sub DoThis2()
‘快约35%以上
Dim Start As Double, Finish As Double
Start = Timer
‘————————————–
Dim ThisBookSheet As Object, N As Long
Set ThisBookSheet = Workbooks(“Book1″).Sheets(1)
For N = 1 To 1000
ThisBookSheet.Range(“c5″) = 10
ThisBookSheet.Range(“d10″) = 12
Next
‘————————————–
Finish = Timer
MsgBox “本次运行的时间是” & Finish – Start
End Sub
您可以比较这两个示例的运行速度,它们都得到同样的结果,但在我的机子上运行时,第二个示例比第一个快60%。当然,您还能使用With…End With语句获得相同的结果。
您也能不设置明确的对象变量,而是使用With语句减少对象的重复引用。上面的示例也能使用下面的代码,该代码仅调用Workbooks属性和Sheets属性一次,当循环1000次时,总共调用1000次属性。
Sub DoThis3()
‘快约35%以上
Dim Start As Double, Finish As Double
Start = Timer
‘————————————–
Dim N As Long
With Workbooks(“Book1″).Sheets(1)
For N = 1 To 1000
.Range(“c5″) = 10
.Range(“d10″) = 12
Next
End With
‘————————————–
Finish = Timer
MsgBox “本次运行的时间是” & Finish – Start
End Sub
上述三个示例均得到相同的结果,但在我的机子上运行时,本示例比第一个示例快50%以上。
发表于 2012-1-12 14:08 | 显示全部楼层
编写高效Excel VBA代码的最佳实践很不错哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-12 14:20 , Processed in 0.223641 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表