有一次交流群一位朋友问我,为什么我的代码运行了20分钟还没运行完?!怎么优化代码?
我首先问了下数据量,也就几千行,但是一运行就是卡着不动了。最后我检查了代码之后,发现他里面写了个死循环。并不是程序运行的慢,而是程序卡主了。
他静静的等待了20多分钟,最后强退了。
一般程序超过两三分钟没响应,就要检查下代码了,极有可能是死循环。这个时候需要优化代码,或者直接使用更高级的武器--数组。
也有朋友说数组太抽象,还没有学数组,那该如何优化代码速度呢?
下面我就列举几个优化代码速度的常用方法,也是几个VBA编程的好习惯。
刚开始学VBA,很多都是录制宏得到的语句, VBA 程序里满屏幕的对象的激活和选择。
例如:
Workbooks("案例工作簿").Activate、WorkSheets("案例").Select、Range("A1").Select
这就好比明明打电话一句话就能解决的事,非要先跑过去,见了本人当面说。
事实上大多数情况下这些激活操作不是必需的。例如:
WorkSheets(″案例″).Select
Range(″A1″).Select
Range(″A1″).Value= "VBA说"
完全可以简化成一句
WorkSheets(″案例″).Range("A1").Value="VBA说"
当然,.Value这个默认属性也可以省略。
WorkSheets(″案例″).Range("A1")="VBA说"
这么一番简化之后,不仅代码更简洁,运行速度也会提高。
➜关键的关键
对隐藏的工作表使用select方法的时候,会报错。所以我们读取数据、写入数据尽量避免使用Select。
每一个 Excel 对象的属性、方法的调用都需要通过 OLE 接口的一个或多个调用,这些OLE 调用都是需要时间的,减少使用对象引用能加快 VBA 代码的运行。
说这么官方你一定听不懂。直接拿例子来说一下:
ThisWorkbook.Worksheets("案例").Range ("a1")="VBA说"
一定没有Range ("a1")="VBA说"效率高,尤其放在循环内部的时候。
那我们怎么解决这个问题,减少对象的引用次数呢?
➜使用With...EndWith结构简化
既能精简代码又能一定程度加快速度。
联系客服