[转帖] VBA编程时常用的提速方法 转载 [复制链接]
速度是程序设计永恒的热门话题,使用VBA编程当然也不例外,这里就将在网上收集到的VBA编程常用提速的方法与自己在VBA编程时的心得整理一下,上传到这里.

一、让代码"专注"运行
1.将Application.ScreenUpdating设定为False,关闭屏幕更新.这个是最基本的加速方法,在程序结束设还原时设定为True.
2.将Application.EnableEvents设定为False,禁止触发事件.这个在有其它自定义事件时,如定义了Worksheet_Change,就有需要设定,还原时设定为True.
3.将Application.Interactive设定为False,禁止交互模式.当我们运行程序时,如删除有数据的工作表而不需要提示,这时就可以使用,见意这段代码只加在需要的地方,之后就立即开启.
4.将Application.Calculation设定为xlCalculationManual,将计算模式设定为手动.当工作簿中有大量公式时,这样的设定提速特别明显,还原时设定为xlCalculationAutomatic.

二、单元格(区域)写法的选择
单元格(区域)写法有3,A1单元格为例,vba编程技巧可以使用
1Cell对象写法:cells(1,1)
2Range对象写法:Range("A1")
3.名称写法:[A1]

三种写法各有优缺点,但以取值速度论,cells(1,1)最快,[A1]写法最慢,Range("A1")cells(1,1)稍慢,但优点是在VBE中输入可以显示属性方法等快速输入信息.此外,要明示对象属性而不要依赖于对象的默认属性,这是一种好的编程习惯.下面两句,第二句要比第一句快得多:
x= cells(1,1)
x= cells(1,1).value

三、比较语句

1.分解IF语句
:
IF A THEN
IF B THEN

优于

IF A AND B THEN


IF A THEN
...
ELSE IF B THEN
优于
IF A OR B then

2.并列的条件使用elseifselect,elseif写起来麻烦,但速度优于select

3.将最可能的条件及容易计算的条件放在前面

上面分解后的A应当比B出现的机会更大,或者需要进行计算更容易计算出结果,select语句放在前面的case也应这样

4Iif速度慢于if/else

四、循环语句

1For 语句快于DO/WHILE,这是因为FOR语句的增量部分是VBA自带的,特别是步长为1的更明显

2For/each快于for/to

五、使用With语句

with语句不仅仅是简化了写法,速度也大大提升了。

六、尽量不用Variant类型

这不用多说吧,使用Option Explicit是一个好习惯。

给返回值一个明确的类型,会对提速有好处。虽然有时候我们觉得不明显,这是很多人使用left$,而不用left,使用int%,而不用int的原因(你是否对这种写法好奇过?)。但如果你一开始你就没有DIM,这就很有必要了。

七、关注内存

对占用内存较多的对象变量,不要时要记住set=nothing,如果你对你的机器内存的容量没有信心,应避免使用递归程序,递归的过程会吃掉大量的内存。

八、使用工作表函数(方法)

有些工作表函数(方法)速度是很快的,比如FIND,VLOOKUP,要记得使用它们,不要花力气去做不讨好的事。当使用工作表函数时,操作对象应避免使用内存变量,那样反而慢。

九、划零为整
当需要对较大区域进行相同的操作时,可以先使用union等方法收集,一次进行。在Range对象上尤其明显,内容、格式变更,删除等等一个一个的处理要比把这些选定后一起处理慢得多的多。

十、使用内存数组

1.内存变量的运算速度大大快于RANGE对象。
1)将RANGE数据写入内存数组。下面两句将生成一个65536,6列的数组。用这种方法产生的数组都是两维数组,即使引用的RANGE只有一行或一列。下标始于1,不受option base设置的影响。arr必需声明为Variant类型。

Dim arr()
arr=range(A1:F65536)

2)将内存数组数据写入RANGE。在内存数组经过计算处理后,写回时只需下句就可以了。

range(A1:F65536)= arr

2.非数组变量快于数组变量。当数组很大时,根据下标提取数值会比从单个变量慢得多,这时可以把需要多

次使用的数组值先赋给内存变量。

3.减少使用REDIM的次数。REDIM是对数组操作中最费时的动作。可以先预算大小,不够或多余时再进行调整。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。