本帖最后由 sunjing-zxl 于 2011-4-19 09:15 编辑
- 尽量减少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%以上。 |