分享

养成好习惯,让代码跑得更快一些

 hercules028 2022-04-13

要解决一个问题,能使用的代码可能有多种。但不同的代码执行所需的时间也不完全相同。既然效率不同,当然选择耗时短的,一分钟能完成的事,谁愿意花十分钟?如果想让自己写的过程尽量跑得快一些,得养成下面的这些编程的习惯。

在过程中合理使用变量和常量

尽量避免使用 Variant 类型的变量:

不同的数据类型占用的内存空间也不相同,可用内存空间的大小直接影响计算机处理数据的速度。 

VBA中所有没有声明数据类型的变量默认都是Variant类型,Variant类型占用的存储空间远远大于其他数据类型,占用内存空间的大小直接影响计算机处理数据的速度。所以,除非必须需要,否则应尽量避免将变量声明为Variant类型。 

让我们通过一个简单的例子,来看看不同数据类型的变量,执行相同的计算所需时间的差别,如下图所示: 

图片

执行这个过程,看看需要花多少时间,结果如图 9 -30 所示。

图片

图9-30 执行过程需要的时间

将这个过程中的a、b、c三个变量设置为Integer类型,其他计算的代码不变,如下图所示:

图片
图片

同样的代码,只改变了过程中三个变量的类型,再看看在同一台计算机上执行这个过程 需要多少时间,结果如图 9 - 31 所示。

图片

图 9-31 执行过程需要的时间

同样的代码,只是变量的数据类型不同,执行代码所需要的时间相差 3 倍左右。如果写的过程较短,执行的计算也不多,将变量声明为哪种类型也许感觉不到差别,但如果是写一个较大的项目,则时间的差别就很明显了。

使用变量引用需要反复引用的对象:

如果在一个过程中需要多次对同一个对象进行操作或设置,可能会使用一些重复的代码来引用对象,如下图所示:

图片

这个过程中的 6 行代码都引用了同一个对象:

图片

为了降低编写代码的工作量,同时减少过程中点运算符“.”的数量,可以使用变量来引用对象,将这个过程改为:

图片

这样编写代码还有一个好处:当要更改过程中操作或设置的对象时,只要更改给对象变量赋值的代码即可。

尽量用常量存储需多次使用的某个数据:

同使用对象变量一样,当在过程中需要多次让某个常数参与计算时,可以声明一个常量来存储该数据,在需要使用该数据的位置,使用常量代替它。

尽量减小变量和常量的作用域:

如果过程中的某个变量或常量不会在其他过程中使用,就应将其声明为本地变量或本地常量。尽量减小变量和常量的作用域,这也是在编程时需要养成的一个好习惯。

及时释放内存中的对象变量:

如果过程使用了对象变量,当不需要再使用这些变量了,请记得释放它,代码结构为:

图片

例如:

图片

尽量使用内置函数解决计算问题

对某个问题,如果Excel或VBA已经有现成的函数可以解决,那就尽量使用函数来解决。使用内置函数解决计算问题,不但可以减小编写代码的工作量,而且多数情况下,比自己写代码来解决问题的效率更高。

不要让过程中的代码执行多余的操作

如果过程中的代码是通过录制宏得到的,那么里面可能会包含一些多余操作对应的代码,如下图所示:

图片

这是一个复制单元格的宏,其中的代码调用了 4 次 Range对象或 Worksheet对象的 Select方法。但并不需要激活工作表或选中单元格后才能执行复制、粘贴的操作,所以这些选中工作表和单元格的操作都是多余的,这个过程可以简化为:

图片

去掉多余的代码,过程执行的操作就减少了,执行的时间自然也就缩短了。

如果不需和程序互动,

就关闭屏幕更新

在执行过程时,如果不需要和程序互动,待过程执行结束后直接输出最后的结果,就可以关闭屏幕更新。 

关闭屏幕更新,就是设置Application对象的ScreenUpdate属性为False,让过程在执行 时不将中间代码操作或计算的结果输出到屏幕上,这样可以在一定程度上减少过程执行所需的时间。

千万不要觉得 0.1 秒和 0.2 秒的差距不大。

如果你的过程很短,需要执行的操作或计算不多,那么代码是否优化也许差别不大。但如果要处理的数据很多,要执行的操作很复杂,哪怕一小串操作只能节约 0.1 秒,在一个执行大批量操作和计算的过程中,千万个 0.1 秒累积起来的时间也是很明显的。 

无论大家现在是否接触过这些复杂的问题,但请相信,从一开始就养成良好的编程习惯,一定会给你学习和使用VBA带来很大的帮助。

关于VBA的小窍门,你学会了吗?

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多