




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
提高VBA运行效率方法
速度问题一直是VBA程序值得关注的一个方面。当您编写了一个对大量数据进行操作的程序后,在运行时可能会发现程序运行得很慢,有的甚至达好几分钟,就像Excel应用程序已崩溃了一样。但当您发现程序确实在运行,并得到正确的结果后,您可能就会想到如何使程序更快的运行了。当然,代码运行速度慢可能是VBA程序的一个缺点,这也可能是程序语言本身的一个原因,但我们也可以找到一些方法优化VBA代码并使程序尽可能快的运行。
下面是我整理的一些优化VBA代码或提高程序运行速度的方法,有些方法是我们在编程中好的做法和应该养成的好习惯,希望能带给您一些有益的参考。高质量的程序和运行效率是需要不断实践,并在实践中不断总结和积累经验的,也希望您能将在编写程序过程中发现的一些优化方法介绍给大家共享。
1、尽量简化代码
通过简化代码,可以提高程序的性能。您可以将通用过程编写为子过程来调用。例如,假设有一个应用程序需要在不同的地方实现查找一定范围内的某个特殊条目,在一个没有简化代码的应用程序中,不同的过程可能需要应用各自的算法以实现在某个范围内查找某一条目,修改每个过程使其采用一个更有效的算法并不是一件很容易的事。而一个简化的程序则只有一个查找算法,即将该查找算法编写成通用的子程序,需要查找某个范围的过程都调用该子程序,通过在查找方法的子程序中优化查找算法,使得调用该方法的所有过程都享受性能提高所带来的好处。
另外,删除所有无关的代码,这在所录制宏中表现得尤为明显。在录制宏时,经常会产生一些与所实现的功能无关的代码,您可以将这些代码删除,以使得代码得以简化。
在下面将要讲到的设置对象变量代替长对象引用,使用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
EndWith
同理,可使用With…EndWith语句在同一个单元格区域中执行多个操作。
9、在执行循环时考虑如何能够尽可能地节省资源(1)分析循环以查看是否正在不必要地执行一些消耗内存的重复操作。例如,是否可以在循环外(而不是在循环中)设置某些变量?每次都通过循环执行的转换过程是否可以在循环之外执行?
的。例如,
DimNamesAsVariant
Names=Array(“Fan”,“Yang”,“Wu”,“Shen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师结对对帮扶协议书
- 环评意向协议书
- 电脑版权协议书
- 荒地买卖协议书
- 外部合伙人合同协议书
- 签订主仆协议书
- 聘请销售协议书
- 配件质保协议书
- 退造林押协议书
- 贷款联保协议书
- GB/T 6322-1986光滑极限量规型式和尺寸
- GB/T 3741.1-1983卡套式端三通管接头
- GB/T 13738.2-2017红茶第2部分:工夫红茶
- 致敬最美逆行者抗击疫情主题班会课件
- 2015年高考英语听力真题(全国卷)+听力原文
- 消防控制室值班记录1
- 离子交换层析进阶与优化
- 2022-2023学年高中政治统编版选择性必修二:第9课 纠纷的多元解决方式 教案
- 术前停用抗凝药物
- 法学本科毕业论文
- 爆破安全安全规程
评论
0/150
提交评论