Monday, 22 May 2006

Speed Up VBA

这两天在修改其他人的VBA程序。Group里的人,一直抱怨MS Office的VBA速度太慢。看了看Online Help,简单地加了两行代码,现在的运行速度比以前快了四倍。

这中间的关键,只是应用了VBA中Application.ScreenUpdating这个选项。在开始运行VBA的时候,设置ScreenUpdating=False,关闭屏幕更新;在程序结束前,再设置ScreenUpdating=False。这样在VBA执行的时候,就不必浪费CPU在屏幕更新上了,运行速度得以大大提高。

结合我前面的一篇,在VBA中直接将结果输出到MDI文件中。在最初的测试中,设置了ScreenUpdating=False,虽然产生结果文档的速度提高了,但PrintOut这一步花费了不少时间。我尝试着在PrintOut之前恢复设置ScreenUpdating,之后再关闭设置ScreenUpdating以进行后续文档的产生。这样处理之后,PrintOut的速度也得到很大的提高。

为什么要这样处理呢?我的理解,关闭ScreenUpdating,自然提高文档计算和生成速度,但在PrintOut的时候,需要知道完整的文档内容,而MDI Writer似乎在等待ScreenUpdating之后的完整的文档,才开始干活。这时候,需要打开ScreenUpdating,让文档Update一下,才能比较快地PrintOut。或许MDI真的是Image文件吧。

如此看来,只有灵活使用ScreenUpdating,才能Speed Up VBA。

其实不仅仅是VBA,其它的一些程序,比如字处理、GIS、图形图像处理等等,UI上的每一步操作,当然是需要立即Update的,但在内部的API上通常会提供类似ScreenUpdating这样的选项,这样在程序化、批量处理的时候,能够加快运行速度。

0 Comments:

Post a Comment

<< Home