7.5.1 合理地使用变量
声明变量为合适的数据类型
不同的数据类型占据不同大小的内存空间,如表3-1所示,数据所占内存空间的大小直接影响计算机处理数据的速度。因此,为了提高程序的效率,在声明变量时,在满足需求的前提下,应该尽量选择占用字节少的数据类型。
尽量不使用Variant型数据
Variant是VBA中一种特殊的数据类型,所有没有声明数据类型的变量都默认为Variant型。但Variant型所占据的存储空间远远大于其他数据类型,所以除非必须需要,否则应避免声明变量为Variant型。
不要让变量一直待在内存里
如果一个变量只在一个过程里使用,请不要声明它为公共变量,尽量减少变量的作用域,这是一个好习惯。
如果你不再需要使用某个变量(尤其是对象变量)了,请记得释放它,不要让它一直呆在内存里。
7.5.2 避免反复引用相同的对象
无论是引用对象,还是调用对象的方法或属性,都会用到点(.)运算符,每次运行程序,计算机都会对这些点(.)运算符进行解析,当点(.)运算符过多时,会花去不少的时间。
在这个程序中,ThisWorkbook.Worksheets(1).Range(“A1”)是每一句代码都反复引用的对象。
引用对象不可避免,但当反复引用同一个对象时,可以用一些方法来简化它,从而减少点(.)运算符。
使用With语句简化引用对象
还可以使用嵌套的With语句进一步简化程序:
关于With语句,请参阅3.7.7小节的内容。
使用变量简化引用对象
除了With语句,还可以使用变量来简化对相同对象的引用。如:
还可以借助With语句进一步简化输入:
7.5.3 尽量使用函数完成计算
Excel已经准备了很多现成的函数(工作表函数和VBA内置函数),尽管你可以通过编写程序去实现相同的目的,但对于相同的计算,使用函数比编写程序解决效率要高很多。
7.5.4 去掉多余的激活和选择
如果你的程序是通过录制宏得到的,那里面一定有很多的激活和选择操作,即Activate方法和Select方法。如:
这是一个复制单元格的程序,调用了4次Select方法。但事实上并不需要激活工作表,选中单元格后才能执行复制、粘贴操作,所以这些选中工作表和单元格的代码都是多余的,程序可以简化为:
去掉多余的操作,不仅可以让程序更简洁,降低阅读和调试的难度,还能提高程序运行的速度。
7.5.5 合理使用数组
下面的程序把1到65536的自然数写入A1:A65536中。
逐个将数据写入单元格,在笔者的电脑上,程序运行的时间是2.52秒,如图7-23所示。
图7-23 逐个将数据写入单元格需要的时间
很明显,这样的操作是比较费时的。
如果想提高运行速度,可以先把数据写入数组,再通过数组批量写入单元格,如:
使用数组后的程序只需要0.09秒的时间,速度提高了28.1倍,如图7-24所示,差距显而易见。
图7-24 数组批量写入单元格所需的时间
将一维数组写入A列单元格前,必须先使用工作表的TRANSPOSE函数将数组进行转置。如果想省去转置的计算步骤,可以直接将数组定义为一个多行一列的二维数组,如:
7.5.6 关闭屏幕更新
设置Application对象的ScreenUpdate属性为False(参阅4.2.1小节),在程序运行过程中关闭屏幕更新,可以在一定程度上缩短程序运行的时间。
如果你的程序很短,需要做的操作很少,那代码是否优化,也许差别并不大。但如果要处理的数据很多,进行的操作很复杂,编写的程序很长时,优化程序代码是很有必要的。
无论你现在是否接触到这些复杂的问题,但请相信我,养成一个良好的习惯,编写简洁、高效的代码会给你学习和使用VBA,最终成为一个VBA高手带来很大的帮助。