提高VBA运行效率方法Word文档下载推荐.docx
《提高VBA运行效率方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《提高VBA运行效率方法Word文档下载推荐.docx(5页珍藏版)》请在冰豆网上搜索。
![提高VBA运行效率方法Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/7/c5a1df86-23d6-4bb3-be49-a5ee49a2b0ef/c5a1df86-23d6-4bb3-be49-a5ee49a2b0ef1.gif)
在录制宏时,经常会产生一些与所实现的功能无关的代码,您可以将这些代码删除,以使得代码得以简化。
在下面将要讲到的设置对象变量代替长对象引用,使用With…EndWith语句、执行ForEach…Next循环语句,根据程序环境尽量减少OLE引用,等等,均是简化代码的好方法。
2、强制声明变量
在VBE编辑器中的菜单“工具——选项”对话框中“编辑器”选项卡中,您应该始终保持“要求变量声明”复选框被选中,这样将在模块代码顶部出现OptionExplicit语句,要求您在编写代码时对所有出现的变量均进行声明,这样,在使用变量时减少内存需求并加速性能。
(1)要节省内存资源,必须始终用特定的数据类型声明所有变量。
如果不使用特定的数据类型声明变量,VBA会创建Variant类型的变量,这将比任何其他数据类型要求更多的内存。
(2)清楚每种数据类型需要多少内存以及它可以存储的值的范围。
除使用较小的数据类型会导致隐性转换的情况外,应始终使用尽可能小的数据类型。
例如,因为Integer类型的变量将被转换成Long类型的变量,应该将那些存储整型值的变量声明为Long类型,而不是Integer类型。
(3)除非确实需要,应避免使用浮点数据类型。
尽管Currency数据类型更大,但它比Single数据类型快,因为Currency数据类型不使用浮点处理器。
(4)如果在一个过程中多次引用一个对象,可以创建对象变量,并将对该对象的引用指派给它。
因为对象变量存储对象在内存中的位置,VBA将不必再次查找其位置。
(5)将对象变量声明为特定的类型(不是Object类型),以便利用早期绑定。
3、减少变量的作用范围并及时释放变量
主要是对象变量,在其使用完后,及时释放。
例如,
DimTempObjAsAnyObject,AnObjAsAnyObject
SetTempObj=NewAnyObject
SetAnObj=TempObj
SetTempObj=Nothing‘释放对象变量
4、尽可能使用早期绑定
绑定是指将程序调用与实际代码相匹配。
为了实现早期绑定,先应创建对对象库的引用。
早期绑定可以在代码中使用定义在对象库中的常量,可以自动列出对象的方法和属性,但早期绑定只有在所控制的对象拥有独立的类型库或对象库文件才适用且还需要已安装了特定的库。
而后期绑定则只是在运行时才知道对象的类型并对对象进行引用,因此不具备上述特点。
使用早期绑定创建对象通常更有效率,使代码能获得更好的性能。
因为对象的早期绑定引用在编译时可以通过VBE的解析,而不是通过运行时模块解析,因此早期绑定的性能要好得多。
虽然在程序设计时不可能总是使用早期绑定,但应该尽可能使用它。
5、关闭屏幕刷新
在Excel中,其ScreenUpdating属性值的默认值为True,这样当写数据到工作表或者执行任何导致其显示属性变化的动作时,Excel的屏幕界面将会不断的刷新,不仅影响显示,而且影响程序运行的速度。
您可以在进入主程序运行前将屏幕刷新属性关闭,即用Application.ScreenUpdating=False语句关闭屏幕刷新,这样将大大改善程序的运行速度。
但在程序运行完成前,要确保将其恢复为原来的设置,即将ScreenUpdating属性的值设置为True。
因为您对该属性的修改是永久性的修改,Excel不会为您自动恢复其默认值,您必须用语句Application.ScreenUpdating=True恢复设置。
6、设置计算模式为手动
如果您的工作表中含有多个公式,在每次单元格中的值发生变化时,公式都将会重新计算,这会影响程序运行速度。
您可以在进入主程序运行前,将计算模式设置为手动,即使用如下语句Application.Calculation=xlCalculationManual,以避免不必要的计算。
当程序运行结束前,您要恢复Excel的默认计算模式设置,即设置为自动重算,可使用下面的语句Application.Calculation=xlCalculationAutomatic,这同ScreenUpdating属性一样,Excel不会自动恢复其为默认值。
Calculation属性是对所有工作簿进行的设置,您也可以用工作表的EnableCalculation属性来设置对某个工作表是否进行重新计算。
7、使用ForEach…Next循环
可以使用ForEach…Next循环来保证程序代码更快地执行。
在使用ForEach…Next循环时,对于存储在集合或数组中的每个对象执行一组语句,程序更简洁,也更容易阅读、调试和维护。
当ForEach…Next语句迭代集合时,自动指定一个对集合当前成员的引用,然后在到达集合的尾部时跳出循环语句。
8、使用With…EndWith语句
可以使用With…EndWith语句来尽量减少对象引用。
使用With语句对指定的对象完成一系列的任务,而不用重复引用对象。
也可以使用嵌套的With语句进一步提高程序代码的效率。
例如,下面的使用With…EndWith语句是在同一个单元格中执行多个操作。
WithWorkbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)
.Formula=”=SQRT(20)”
With.Font
.Name=”Arial”
.Bold=True
.Size=10
EndWith
同理,可使用With…EndWith语句在同一个单元格区域中执行多个操作。
9、在执行循环时考虑如何能够尽可能地节省资源
(1)分析循环以查看是否正在不必要地执行一些消耗内存的重复操作。
例如,是否可以在循环外(而不是在循环中)设置某些变量?
每次都通过循环执行的转换过程是否可以在循环之外执行?
(2)考虑是否必须在满足特定的条件时才执行循环。
如果是,也许可以更早地退出循环。
例如,假设正在对一个不应该包含数字字符的字符串进行数据验证。
如果循环要检查字符串中的每个字符以确定其中是否包含数字字符,那么您可以在找到第一个数字字符时立即退出循环。
(3)如果必须在循环中引用数组的元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值。
从数组中检索值比从相同类型的变量读取值要慢。
10、尽量减少OLE引用
可以通过尽量减少在VBA程序代码中使用OLE(对象链接与嵌入自动识别)引用来优化程序代码。
VBA语句中所调用的方法和属性越多,执行语句所用的时间就越多。
例如下面的两个语句:
语句1:
Workbooks
(1).Sheets
(1).Range(“A1”).value="
/10
语句2:
ActiveWindow.Left=200
执行时,语句2比语句1快。
同样,上面所讲的对重复使用的对象引用指定一个变量,通过调用变量从而保证避免多次进行对象引用。
11、避免对象激活或者不需要先进行先择
在使用宏录制器时,所生成的程序代码在应用任何方法或属性之前都会激活或者选择对象。
但是,并不是在所有的情况下都需要这样做。
所以,在您编写VBA程序代码时,不需要在对对象执行任何任务之前都激活或者选择每个对象。
例如,在Excel中,我们如果要使第一行变成粗体就必须先选项中它。
但在VBA中(除在图表操作时需要选中图表对象外),很少需要这样做,即VBA可以在不选中第一行的情况下,将它变成粗体。
宏录制器的代码:
Rows("
1:
1"
).Select
Selection.Font.Bold=True
改编后的代码为:
Row(“1:
1”).Font.Bold=True
这样做还可以使程序代码更简洁,并且程序可以运行得更快。
12、在一个语句中进行复制或者粘贴
在用宏录制代码时,首先是选择一个区域,然后再执行ActiveSheet.Paste。
在使用Copy方法时,可以在一个语句中指定复制的内容及要复制到的目的地。
例如,将B5:
C6区域的内容复制到以单元格B8开始的区域中,使用宏录制器的代码为:
Range("
B5:
C6"
Selection.Copy
B8"
ActiveSheet.Paste
经修改后的最佳代码是:
).CopyDestination:
=Range("
)
13、尽可能少使用“.”
在前面已经介绍过的对长对象引用使用对象变量以及使用With…EndWith等都是简化”.”的方法。
因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用,而这些过程调用必须在后台执行。
真正好的做法是在局部进行缓存对象引用,例如,应该把对象模型中较高层次的对象引用保存到局部对象变量中,然后用这些对象引用创建其他较低层次的对象引用。
例如,引用某单元格数据时,可用如下代码:
DimiAsLong
Fori=1to10
Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Cells(1,i).Value=i
Nexti
但下面的代码运行效率更高,因为代码中引用Workbook对象和Worksheet对象的调用命令只执行一次,而上面的代码中却要执行10次。
DimwsAsWorksheet
Setws=Workbooks(“Book1.xls”).Worksheets(“Sheet1”)
ws.Cells(1,i).Value=i
14、合理地使用消息框和窗体
在一个很长的程序中,偿试着将消息框或者窗体安排显示在程序的最开始或最后面,避免干扰用户。
此外,尽管窗体提供了许多功能,但它们能够导致文件大小迅速增加。
还有就是尽量避免给工作表单元格链接用户窗体控件,因为这样将会导致链接更新操作,影响程序运行速度。
15、尽可能加速对数字的运算
(1)当对整数进行除法时,您可以使用整型除法运算符(\)而不是浮点除法运算符(/),因为无论参与除法运算的数值类型如何,浮点除法运算符总会返回Double类型的值。
(2)在任何具有整数值的算术表达式中使用Single或Doub