Excel VBA编程  代码优化
代码运行速度慢是VBA程序的一个缺点,这也可能是程序语言本身的一个原因,但也可以到一些方法优化VBA代码,并使程序尽可能快的运行。在Excel中,可从如下几个方面来优化VBA代码:
1.优化变量
变量定义后,就会在内存中开辟一块空间来存放变量的值,根据变量类型和不同,所占用的内存空间也不相同,所以变量类型的定义一定要准确。可采用下面的方法来优化变量:
要节省内存资源,必须始终用特定的数据类型声明所有变量。如果不使用特定的数据类型声明变量,VBA会创建Variant类型的变量,这将比任何其他数据类型要求更多的内存。
清楚每种数据类型需要多少内存以及它可以存储的值的范围。除使用较小的数据类型会导致隐性转换的情况外,应始终使用尽可能小的数据类型。例如,因为Integer类型的变量将被转换成Long类型的变量,应该将那些存储整型值的变量声明为Long类型,而不是Integer类型。
除非确实需要,应避免使用浮点数据类型。尽管Currency数据类型更大,但它比 Single 数据类型快,因为Currency数据类型不使用浮点处理器。
如果在一个过程中多次引用一个对象,可以创建对象变量,并将对给对象的引用指派给它。因为对象变量存储对象在内存中的位置,VBA将不必再次查其位置。
2.优化程序结构
vba编程免费教程程序的结构也就是程序流程的控制,一般分为顺序结构、分支结构和循环结构三种,合理的设计程序的结构也会减少系统资源的占用,加快程序执行的速度。
顺序结构是最常见的程序结构。应当注意,要以最优的方式组织语句出现的先后次序。
选择结构用于根据对条件进行判断,以执行不同的分支。分支语句一定要符合程序的逻辑,还应避免多层(嵌套)分支中无效的条件,即永远执行不到的语句块,且程序的流程要清晰、易读。
循环语句结构最难控制,要优化循环结构的程序代码,可以采取下面的方法:
分析循环以查看是否正在不必要地执行一些消耗内存的重复操作。例如,是否可以在循环外(而不是在循环中)设置某些变量,每次都通过循环执行的转换过程是否可以在循环之外执行。
考虑是否必须在满足特定的条件时才执行循环。如果是,也许可以更早地退出循环。例如,假设正在对一个不应该包含数字字符的字符串进行数据验证。如果循环要检查字符串中的每个字符以确定其中是否包含数字字符,那么您可以在到第一个数字字符时立即退出循环。
如果必须在循环中引用数组的元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值。从数组中检索值比从相同类型的变量读取值要慢。
最后,将有可能在多个地方执行的相同代码,封装到过程或者函数中,采用过程调用的方式运行这些代码,就会起到简化代码的作用。另外,删除所有无关的代码,这在所录制宏中表现得尤为明显。在录制宏时,经常会产生一些与所实现的功能无关的代码,可以将这些代码删除,以使得代码得以简化。
3.优化对象
在VBA程序中,很多情况下会使用到对象,如WorkBook、Sheet、Range等。对象的引用所浪费的时间在程序中是最长的,所以优化对象是很重要的。可以使用如下几种情况来优化对象:
尽可能的避免长对象的引用
将长对象的引用赋值给对象变量,通过对象变量来调用对象,可减少对多个对象的引用。
对象属性最好不要出现在循环中
在循环中使用对象属性,将浪费大量的时间用户读取属性的值。应在循环的外部将对象属性值赋值给变量,然后,在循环中使用变量进行操作。
尽量使用数组,避免使用集合
除非必须使用集合,否则应尽量使用数组来代替集合。因为集合也是一个对象,而数组的读取速度要比对象快许多倍。
尽可能少使用“.”
在对对象操作时,有可以要引用多个对象,如:
Worksheet("Book1").Sheets("Sheet1").Range("A1").Value = 20
简化后的代码为:
Sheet1.Range("A1").Value=20 或 Sheet1.Cells(1, 1) = 30
4.其它的优化
在VBA语句中,除了上述的常用的优化方法外,还有很多其它的优化方法:
展开小的循环体
编码的时候,有可能遇到这种情况:一个循环体只会循环2到3次,而且循环体由几行代码组成。在这种情况下,可以把循环展开,来减少循环占用额外的CPU时间。
避免很小的函数
调用只有几行代码的函数也是不划算的。因为,调用函数所花费的时间或许比执行函数中
的代码需要更长的时间。在这种情况下,你可以把函数中的代码拷贝到原来调用函数的地方。
使用Len()检验空串
尽管有多种方法可检验空串,但首选的是使用Len()函数。为了测试零长度的串,可以选择把字符串与””相比较,或者比较串的长度是否为0,但这些方法比用Len()函数要用更多的执行时间。

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