Excel VBA代码优化

计算机语言、软件、硬件
回复
peng
Site Admin
帖子: 199
注册时间: 周五 11月 01, 2019 9:06 am

Excel VBA代码优化

帖子 peng »

Excel VBA代码优化,别怕,这个功能只需要2分钟搞定

当你写的代码其中有改变工作表的显示内容或格式时,因为这个时候随着程序的执行,电脑的屏幕需要不断改变内容的显示,就是不停止的执行刷新页面,那么在这个时候关闭屏幕刷新可以明显加快运行速度,如下面的代码所示。

以上代码过程中使用两次For...Next语句给A1单元格填充数据,最后使用Msgobx显示两次运行的时间对比,如下所示。我们可以看到在第一次循环时关闭屏幕刷新(Application.ScreenUpdating = False),将看不到代码的执行过程,其实程序在不停的执行当中,只是我们看不到而已,但可以提升代码的执行速度。如下图所示的消息框显示两次代码的运行时间,可以看出关闭屏幕刷新后运行时间远远小于开启屏幕刷新时运行的时间,也就是说我们关闭屏幕刷新,可以明显提升速度。

相信有时候我们用VBA处理数据的时候,经常会遇到需要自己写函数,或者你有没有想过其实可以直接引用工作表函数,在VBA中使用工作表函数比仅仅使用VBA代码的运行时间要快得多,我们看看如下的例子吧!

这个代码的过程分别使用VBA代码进行累计加法和直接调用工作表Sum函数对单元格区域进行求和计算,最后使用消息显示运行时间对比。Cells(1, 2) = Cells(1, 2) + Cells(i, 1),这是利用循环和累加,也就是k=k+1进行累加求A1:A30000和;而Cells(2, 2) = Application.WorksheetFunction.Sum(Range("A1:A30000"))的意思就是直接利用工作表函数SUM进行求和。
程序执行的结果对比如下所示,其实您明显发现使用工作表函数的速度明显小于我们使用代码的速度。

在某些时候我们需要对单元格区域进行操作时,在这个时候也许你会选择使用Find、Replace、SpecialCells等方法可以比使用VBA代码获得更快的速度,如下面的代码所示:

在这个过程分别使用VBA代码和使用Replace、SpecialCells方法删除工作表A列内容为“Excel”的单元格所在的行,
MSgbox显示两种方法的运行时间,可以看出使用Replace方法和SpecialCells方法的运行时间要远远小于使用VBA代码运行的时间,如下图所示,所以说我们在选择某些操作表格的方法时候,需要注意一下使用的方法。

我们在上面的例子看到我们其实已经在使用这个语句结构了,也就是说我们在遇到需要重复引用同一个对象时可以使用With语句来获得较快的运行速度,如下面的代码所示:

在这个代码过程在数据填充的时候填充时使用With-End with语句来引用工作表对象,从而让代码获得较快的运行速度。
需要注意的是我们的With语句在一个单一对象或一个用户定义类型上执行一系列的语句,他的用法如下:
With Object
[statements]
End With
其中参数object是必需的,一个对象或用集合对象;参数statements是要执行的一条或多条语句。With语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。在运行时只需引用对象一次而不是在每个属性赋值时都要引用,从而获得较快的运行速度。如下显示两种方法的运行时间,可以看出使用With语句来引用工作表对象的运行速度和没有使用引用的速度相差几百倍,所以在能使用对象引用的就尽量使用,这样可以明显加快程序的执行速度。

为啥要是这个减少激活或者选择语句呢?因为我们在录制宏的时候,可以看到其实录制的代码中存在非常多的这样的语句,但是这些语句是可有可无的,因为他们的存在明显拖累了我们执行速度。请看如下代码所示:

在这代码的过程分别使用录制宏所得的代码,其中包含了激活、选择单元格、工作表,后面是我们修改后的代码给单元格填充,消息框显示两种方法的运行时间,可以看出后一种方法的运行时间要远远小于录制宏所得的代码的运行时间。

回复