随着微软Office的广泛应用,基于该平台开发的VBA应用程序也随之越来越多,这些应用大大地提高了我们的办公效率。可我们经常听到有朋友抱怨用VBA开发的应用程序运行速度慢,的确,由于VBA是一种宏语言,在运行速度上受到许多条件的限制,这在某种程度上制约了它的应用,但也有时候是由于人为的编程习惯造成的,因此用户编程的方法直接影响到VBA程序的运行效率。本文列举了一些提高VBA程序运行效率的方法供大家参考。
尽量使用VBA原有的属性和方法
由于Excel对象多达数百个,对象的属性、方法、事件更是多不胜数,对于初学者来说可能对它们不全部了解,这就产生了编程者经常编写与Excel对象的属性、方法相同功能的VBA代码,这些代码段的运行效率显然与Excel对象的属性、方法完成任务的速度相差甚大。例如Range对象的CurrentRegion属性可用来返回Range对象所在的单元格区域即活动单元格所在的矩形区域,同样功能的VBA代码可能由于单元格区域的不断变化,不是一两句代码所能描述清楚的了。因此编程前应尽可能多地了解Excel对象的属性和方法。
充分利用工作表函数
充分利用工作表函数是提高程序运行速度的非常有效的方法。如求平均工资的例子:
For Each rng In Range("C2:C300")
TotalValue = TotalValue +rng.Value
Next
AverageValue = TotalValue / Range("C2:C300").Rows.Count
相比之下,用下面的代码在运行时速度会快得多:
AverageValue=Application.WorksheetFunction.Average(Range("C2:C300"))
其中的Average方法就是求平均值的函数。其它函数也可以在VBA代码中直接使用,只需在函数名称前加上对象名称“Application.WorksheetFunction”就可以了。
尽量减少对象引用
使用With和End With语句可以对指定的对象进行一系列的操作,而不用重复引用被操作的对象,这样可以大大 地提高程序代码的效率。如:
Workbooks(1).Sheets(1).Range("C2:C300").Font.Name="黑体"
Workbooks(1).Sheets(1).Range("C2:C300").Font.FontStyle="Bold"
而以下语句会比上面的语句运行速度要快一些:
With Workbooks(1).Sheets(1).Range("C2:C300").Font
.Name = "黑体"
.FontStyle = "Bold
End With
尽可能减少“.”的使用
VBA语句中所调用的方法和属性越多,执行语句所用的时间就越长。如果某个对象被多次引用,此时可以将此对象用Set关键字设置为对象变量,把对象模型中较高层次对象的引用保存到局部对象变量中以减少对对象的访问。如在引用某单元格数据时,可选用下面代码:
Dim i As Long
For i=1 to 10
Workbooks(" Book1.xls").Worksheets(" Sheet1").Cells(1,i).Value=i
Next i
但这段代码对对象的引用需要重复执行10次,而下面的代码运行效率则会高一些,因为代码中Workbook对象和Worksheet对象的引用只执行一次。
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
尽量简化代码
公用的过程在代码中应编写为子程序以方便其它过程的调用。假设有一个应用程序需要在不同的地方实现查找一定范围内的某些特殊的记录,在一个没有简化代码的应用程序中,不同的过程可能需要应用各自的算法以实现在某个范围内记录的查找,这样的代码不仅冗长,如果要在所有的子过程中修改查询的代码可不是件容易的事件。
另外,在编写代码的过程中我们经常会录制一些宏代码或借鉴别人的代码。这其中肯定会有与所实现的操作无关的代码,我们可以将这些代码删除以使得代码最简化。
强制声明变量
在VBE 编辑器中始终保持“要求变量声明”复选框被选中(在“工具”菜单的“选项”对话框设置),这样将在模块代码顶部出现“Option Explicit”语句,这就要求用户在编写代码时要对所有变量进行声明,按所需数据类型声明变量可以节省系统的内存资源。创建的对象变量使用完毕后要及时释放,如:
Dim TempObj As AnyObject
Set TempObj=New AnyObject
……
Set TempObj=Nothing
关闭屏幕刷新
关闭屏幕更新是提高VBA程序运行速度的最有效的方法,它可以有效地减少程序运行过程中的屏幕“闪烁”,直接把程序运行的最终结果展现给用户。
关闭和恢复关闭屏幕更新的方法如下:
Application.ScreenUpdate = False
Application.ScreenUpdate = True
设置计算模式为手动
如果您的工作表中含有多个公式,每次单元格中的值发生变化时,公式都将会重新计算,这会影响程序运行的速度。你可以在进入主程序运行前将计算模式设置为手动,即使用语句“Application.Calculation = xlCalculationManual”以避免不必要的计算,或者只重新计算表格中受到影响的单元格“Application.Calculation = xlCalculationSemiautomatic”。当程序运行结束前还应恢复Excel的默认计算模式设置,即设置为自动重算“Application.Calculation = xlCalculationAutomatic”。
合理地使用消息框和窗体
尽管窗体提供了许多功能,但它们能够导致文件大小迅速增加。因此在程序代码中如果要显示程序运行的结果,能不用窗体的可尽量不使用,如果需要可用消息框获取和输出用户的信息。此外在工作表窗体中尽量避免将工作表中的单元格链接到用户创建窗体控件中,因为这样将会导致链接的更新操作,影响程序运行速度。
有效地使用数组
用数组取代单元格区域来处理数据可以大大地提高程序运行的效率,即先将数据写入到某个数组中,然后用一个语句就可以将数组中的数据传递到单元格区域中。
在创建已知元素个数的静态数组时,使用Array函数对于节约空间和时间以及写出更具效率的代码是非常理想的。 例如:
Dim Names As string
Names=Array("一级","二级","初级","高级")
此外,应该尽量使用固定大小的数组。如果确实选择使用了动态数组,应该避免数组每增加一个元素就改变一次数组的大小,最好是每次增加一定数量的数组元素。
执行循环时尽可能地节省资源
在循环语句中去掉不必要的执行消耗内存的重复操作。例如是否可以在循环体外(而不是在循环体中)设置某些变量?每次都通过循环执行的转换过程是否可以放在循环之外执行等等。另外,如果必须在循环中引用数组元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值,因为从数组中检索值比从相同类型的变量读取值要慢。
对于初学VBA的用户来说,今天给大家介绍的这些“大道理”可能暂时还用不上,但随着对VBA研究的逐步深入,开发的应用程序功能越来越复杂,你就会体会到这些技巧的妙处了。
呵呵,终于找到原因了,要学的东西看样子还很多 |