


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、提高VBA运行效率方法速度问题一直是 VBA程序值得关注的一个方面。当您编写了一个对大量数据进行操作的程序后,在运行时可能会发现程序运行得很慢,有的甚至达好几分钟,就像Excel使用程序已崩溃了一样。但当您发现程序确实在运行,并得到正确的结果后,您可能就会想到如何使程序更快的运行了。当然,代码运行速 度慢可能是VBA程序的一个缺点,这也可能是程序语言本身的一个原因,但我们也可以找到一些方法优化VBA代码并使程序尽可能快的运行。下面是我整理的一些优化 VBA代码或提高程序运行速度的方法,有些方法是我们在编程中好的做法和应该 养成的好习惯,希望能带给您一些有益的参考。高质量的程序和运行效率是需要不
2、断实践,并在实践中不 断总结和积累经验的,也希望您能将在编写程序过程中发现的一些优化方法介绍给大家共享。1、尽量简化代码通过简化代码,可以提高程序的性能。您可以将通用过程编写为子过程来调用。例如,假设有一个使用程 序需要在不同的地方实现查找一定范围内的某个特殊条目,在一个没有简化代码的使用程序中,不同的过 程可能需要使用各自的算法以实现在某个范围内查找某一条目,修改每个过程使其采用一个更有效的算法 并不是一件很容易的事。而一个简化的程序则只有一个查找算法,即将该查找算法编写成通用的子程序, 需要查找某个范围的过程都调用该子程序,通过在查找方法的子程序中优化查找算法,使得调用该方法的 所有过程都
3、享受性能提高所带来的好处。另外,删除所有无关的代码,这在所录制宏中表现得尤为明显。在录制宏时,经常会产生一些和所实现的 功能无关的代码,您可以将这些代码删除,以使得代码得以简化。在下面将要讲到的设置对象变量代替长对象引用,使用WithEnd With语句、执行For EachNext循环语句,根据程序环境尽量减少OLE引用,等等,均是简化代码的好方法。2、强制声明变量在VBE编辑器中的菜单 工具一一选项”寸话框中 编辑器”选项卡中,您应该始终保持 要求变量声明”复选框 被选中,这样将在模块代码顶部出现Option Explicit语句,要求您在编写代码时对所有出现的变量均进行声明,这样,在使用
4、变量时减少内存需求并加速性能。(1) 要节省内存资源,必须始终用特定的数据类型声明所有变量。如果不使用特定的数据类型声明变量,VBA会创建Variant类型的变量,这将比任何其他数据类型要求更多的内存。(2) 清楚每种数据类型需要多少内存以及它可以存储的值的范围。除使用较小的数据类型会导致隐性转换的情况外,应始终使用尽可能小的数据类型。例如,因为Integer类型的变量将被转换成Long类型的变量,应该将那些存储整型值的变量声明为Long类型,而不是Integer类型。(3) 除非确实需要,应避免使用浮点数据类型。尽管Currency数据类型更大,但它比Single数据类型快,因为Curren
5、cy数据类型不使用浮点处理器。(4) 如果在一个过程中多次引用一个对象,可以创建对象变量,并将对该对象的引用指派给它。因为对象变 量存储对象在内存中的位置, VBA将不必再次查找其位置。(5) 将对象变量声明为特定的类型(不是Object类型),以便利用早期绑定。3、减少变量的作用范围并及时释放变量主要是对象变量,在其使用完后,及时释放。例如,Dim TempObj As AnyObject,AnObj As AnyObjectSet TempObj=New AnyObjectSet AnObj=TempObjSet TempObj=Nothing 释放对象变量4、尽可能使用早期绑定绑定是指将
6、程序调用和实际代码相匹配。为了实现早期绑定,先应创建对对象库的引用。早期绑定可以在 代码中使用定义在对象库中的常量,可以自动列岀对象的方法和属性,但早期绑定只有在所控制的对象拥 有独立的类型库或对象库文件才适用且还需要已安装了特定的库。而后期绑定则只是在运行时才知道对象 的类型并对对象进行引用,因此不具备上述特点。使用早期绑定创建对象通常更有效率,使代码能获得更好的性能。因为对象的早期绑定引用在编译时可以通过VBE的分析,而不是通过运行时模块分析,因此早期绑定的性能要好得多。虽然在程序设计时不可能总是使用早期绑定,但应该尽可能使用它。5、关闭屏幕刷新在Excel中,其ScreenUpdatin
7、g属性值的默认值为 True,这样当写数据到工作表或者执行任何导致其显 示属性变化的动作时,Excel的屏幕界面将会不断的刷新,不仅影响显示,而且影响程序运行的速度。您可以在进入主程序运行前将屏幕刷新属性关闭,即用Application.ScreenUpdating = False语句关闭屏幕刷新,这样将大大改善程序的运行速度。但在程序运行完成前,要确保将其恢复为原来的设置,即将ScreenUpdating属性的值设置为 True。因为您对该属性的修改是永久性的修改,Excel不会为您自动恢复其默认值,您必须用语句Application.ScreenUpdating = True恢复设置。6、
8、设置计算模式为手动如果您的工作表中含有多个公式,在每次单元格中的值发生变化时,公式都将会重新计算,这会影响程序运行速度。您可以在进入主程序运行前,将计算模式设置为手动,即使用如下语句Application.Calculation=xlCalculationManual ,以避免不必要的计算。当程序运行结束前,您要恢复Excel的默认计算模式设置,即设置为自动重算,可使用下面的语句Application.Calculation = xlCalculationAutomatic ,这同 ScreenUpdating 属性一样,Excel 不会自动恢复 其为默认值。Calculation属性是对所有
9、工作簿进行的设置,您也可以用工作表的EnableCalculation 属性来设置对某个工作表是否进行重新计算。7、使用For EachNext循环可以使用For EachNext循环来保证程序代码更快地执行。在使用 For EachNext循环时,对于存储在 集合或数组中的每个对象执行一组语句,程序更简洁,也更容易阅读、调试和维护。当For EachNext语句迭代集合时,自动指定一个对集合当前成员的引用,然后在到达集合的尾部时跳岀循环语句。8、使用WithEnd With 语句可以使用 WithEnd With语句来尽量减少对象引用。使用With语句对指定的对象完成一系列的任务,而不用重复
10、引用对象。也可以使用嵌套的 With语句进一步提高程序代码的效率。例如,下面的使用 WithEndWith语句是在同一个单元格中执行多个操作。With Workbooks( “Book1.xls ”).Worksheets( “Sheet1 ”).Range( “A1”).Formula= ” =SQRT(20)”With .Font.Name=” Arial ”.Bold=True.Size=10End WithEnd With同理,可使用WithEnd With语句在同一个单元格区域中执行多个操作。9、 在执行循环时考虑如何能够尽可能地节省资源(1)分析循环以查看是否正在不必要地执行一些消
11、耗内存 的重复操作。例如,是否可以在循环外 (而不是在循环中)设置某些变量?每次都通过循环执行的转换过程 是否可以在循环之外执行?(2) 考虑是否必须在满足特定的条件时才执行循环。如果是,也许可以更早地退出循环。例如,假设正在对 一个不应该包含数字字符的字符串进行数据验证。如果循环要检查字符串中的每个字符以确定其中是否包 含数字字符,那么您可以在找到第一个数字字符时立即退岀循环。(3) 如果必须在循环中引用数组的元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值。 从数组中检索值比从相同类型的变量读取值要慢。10、尽量减少OLE引用可以通过尽量减少在 VBA程序代码中使用OLE(对
12、象链接和嵌入自动识别)引用来优化程序代码。VBA语 句中所调用的方法和属性越多,执行语句所用的时间就越多。例如下面的两个语句:语句 1 : Workbooks(1).Sheets(1).Range(“A1”).value="/10语句 2 : ActiveWindow.Left=200执行时,语句2比语句1快。同样,上面所讲的对重复使用的对象引用指定一个变量,通过调用变量从而保证避免多次进行对象引用。11、避免对象激活或者不需要先进行先择在使用宏录制器时,所生成的程序代码在使用任何方法或属性之前都会激活或者选择对象。但是,并不是 在所有的情况下都需要这样做。所以,在您编写VBA程序代
13、码时,不需要在对对象执行任何任务之前都激活或者选择每个对象。例如,在Excel中,我们如果要使第一行变成粗体就必须先选项中它。但在VBA中(除在图表操作时需要选中图表对象外),很少需要这样做,即VBA可以在不选中第一行的情况下,将它变成粗体。宏录制器的代码:Rows("1:1").SelectSelection.Font.Bold = True改编后的代码为:Row( “1:1 ”).Font.Bold=True这样做还可以使程序代码更简洁,并且程序可以运行得更快。12、在一个语句中进行复制或者粘贴在用宏录制代码时,首先是选择一个区域,然后再执行ActiveSheet.Pa
14、ste 。在使用Copy方法时,可以在一个语句中指定复制的内容及要复制到的目的地。例如,将B5:C6区域的内容复制到以单元格B8开始的区域中,使用宏录制器的代码为:Range("B5:C6").SelectSelection.Copy Range("B8").Select ActiveSheet.Paste 经修改后的最佳代码是:Range("B5:C6").Copy Destination:=Range("B8")13、 尽可能少使用”在前面已经介绍过的对长对象引用使用对象变量以及使用WithEnd With等都
15、是简化”的方法。因为在代码中的每个句点都表示至少一个(而且可能是多个)过程调用,而这些过程调用必须在后台执行。真正好的做法是在局部进行缓存对象引用,例如,应该把对象模型中较高层次的对象引用保存到局部对象变量中, 然后用这些对象引用创建其他较低层次的对象引用。例如,引用某单元格数据时,可用如下代码:Dim i As LongFor i=1 to 10Workbooks( “ Book1.xls ” ).Worksheets( “Sheet1 ”).Cells(1,i).Value=iNext i但下面的代码运行效率更高,因为代码中引用Workbook对象和 Worksheet对象的调用命令只执行
16、一次,而上面的代码中却要执行10次。Dim ws As WorksheetDim i As LongSet ws= Workbooks( “ Book1.xls ”).Worksheets( “Sheetl ”)For i=1 to 10ws.Cells(1,i).Value=iNext i14、合理地使用消息框和窗体在一个很长的程序中,偿试着将消息框或者窗体安排显示在程序的最开始或最后面,避免干扰用户。此外,尽管窗体提供了许多功能,但它们能够导致文件大小迅速增加。还有就是尽量避免给工作表单元格链接用 户窗体控件,因为这样将会导致链接更新操作,影响程序运行速度。15、 尽可能加速对数字的运算(
17、1)当对整数进行除法时,您可以使用整型除法运算符()而不是浮点除法运算符(/),因为无论参和除法运算的数值类型如何,浮点除法运算符总会返回Double类型的值。在任何具有整数值的算术表达式中使用Single或Double值时,整数均将被转换成 Single或Double值,最后的结果将是Single或Double值。如果要对作为算术运算结果的数字执行多次操作,可能需要明确地将该数字转换为较小的数据类型。16、提高字符串操作的性能(1)尽可能少使用连接操作。可以在等号左边使用Mid函数替换字符串中的字符,而不是将它们连接在一起。 使用Mid函数的缺点是替换字符串必须和要替换的子字符串的长度相同。
18、例如,Dim strText As StringstrText = "this is a test"Mid(strText, 11,4) = "tent"VBA提供许多可用来替换函数调用的内部字符串常量。例如,可以使用vbCrLf常量来表示字符串中的回车/换行组合,而不是使用 Chr(13) & Chr(10)。(3)字符串比较操作的执行速度很慢。有时,可以通过将字符串中的字符转换为ANSI值来避免这些操作。例如,下列代码会检查字符串中的第一个字符是否为空格:If Asc(strText) = 32 Then上面的代码会比以下代码更快:If Left(strText, 1) = " " Then17、使用Asc()检验ANSI的值在VBA中,可以使用Chr$()函数把数转换成字符,并确定ANSI的值,但是更好的是使用Asc()函数把字符串转换成数值,然后确定它的ANSI值。如果需要进行有限次数的这种检验,对程序代码的效率可能不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园创意毕业典礼方案2025年
- 中秋节活动策划方案设计12025年
- 工程项目管理复盘
- 家庭教育促进法课件教案宣传资料
- 贵州职业技术学院《数据分析与统计软件应用B》2023-2024学年第二学期期末试卷
- 道路房建知识培训课件
- 内蒙古丰州职业学院《互动媒体策划》2023-2024学年第一学期期末试卷
- 信阳市潢川县2025届六年级下学期小升初数学试卷含解析
- 江苏省金陵中学2024-2025学年高三下第三次调研考试英语试题含解析
- 中山大学《过程装备测试技术》2023-2024学年第二学期期末试卷
- WD-PSO-LSTM模型在光伏出力预测中的应用
- 期中测试卷(试题)-2023-2024学年六年级下册数学苏教版
- 广东省深圳市2023-2024学年六年级下册(全册)期中模拟测试数学试卷(北师大版)
- 《黑人非洲音乐》
- 安全教育普法
- 分层过程审核培训-课后测试附有答案
- 急性肾损伤护理查房
- 江苏省南京市鼓楼区2022-2023学年五年级下学期期中语文试卷
- 第1课+古代亚非【中职专用】《世界历史》(高教版2023基础模块)
- 胶原蛋白注射知情同意书
- 幼儿园优质公开课:小班综合《小鸡过生日》课件
评论
0/150
提交评论