有一次交流群一位朋友问我,为什么我的代码运行了20分钟还没运行完?!怎么优化代码?
我首先问了下数据量,也就几千行,但是一运行就是卡着不动了。最后我检查了代码之后,发现他里面写了个
死循环
。并不是程序运行的慢,而是程序卡主了。
他静静的等待了20多分钟,最后强退了。
一般程序超过两三分钟没响应,就要检查下代码了,极有可能是死循环。这个时候需要优化代码,或者直接使用更高级的武器--
数组
。
也有朋友说数组太抽象,还没有学数组,那该如何优化代码速度呢?
下面我就列举几个优化代码速度的常用方法,也是几个VBA编程的好习惯。
方法❶:少用Select和Activate
刚开始学VBA,很多都是录制宏得到的语句, VBA 程序里满屏幕的对象的激活和选择。
Workbooks("案例工作簿").Activate、WorkSheets("案例").Select、Range("A1").Select
这就好比明明打电话一句话就能解决的事,非要先跑过去,见了本人当面说。
事实上大多数情况下这些激活操作不是必需的。例如:
WorkSheets(″案例″).SelectRange(″A1″).SelectRange(″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结构简化
既能精简代码又能一定程度加快速度。
Sub 不使用With结构() Dim tim1 As Date, tim2 As Date: tim1 = Timer For i = 1 To 10000 Workbooks(1).Sheets(1).Range("A" & i).Value = "欢迎关注VBA说" Workbooks(1).Sheets(1).Range("B" & i).Value = "ID:todayvba" Next tim2 = Timer MsgBox Format(tim2 - tim1, "程序执行时间为:0.00秒"), 64, "时间统计"End Sub
Sub 使用With结构() Dim tim1 As Date, tim2 As Date: tim1 = Timer With Workbooks(1).Sheets(1) For i = 1 To 10000 .Range("A" & i).Value = "欢迎关注VBA说" .Range("B" & i).Value = "ID:todayvba" Next End With tim2 = Timer MsgBox Format(tim2 - tim1, "程序执行时间为:0.00秒"), 64, "时间统计"End Sub
➜使用对象变量
如果一个对象引用被多次使用,则你可以将此对象存储到
对象变量
中,代码直接从内存中读取对象变量的信息,以减少对对象的访问。
ThisWorkbook.Worksheets("案例").Range ("a1")="VBA说"
可简化为:
set sht = ThisWorkbook.Worksheets("案例")sht.Range ("a1")="VBA说"
方法❸:关闭屏幕刷新
VBA代码在运行过程中,不断更单元格中的值。如果不关闭刷新,每更新一次,屏幕就会自动刷新为最新结果。
不过有的人就喜欢把屏幕刷新打开,他感觉点按钮运行代码,屏幕不断闪动,更能体现出来
自动化的乐趣
。
对于这种朋友,我送给他两个字。
关闭开启屏幕刷新的语句如下,注意不要弄反了,
先关闭在再开启。
Application.ScreenUpdate = False
请不要忘记 VBA 程序运行结束时再将该值设回来:
Application.ScreenUpdate = True
这两句代码记不下来不用背,当出现你想输入的语句之后,直接【按空格】或者【鼠标点击】直接输入。
原贴地址:https://www.jianshu.com/p/9766dfdf45d5
1.尽量调用内置功能,即,使用系统提供的属性、方法和函数
很多时候我们要实现某些功能,如果本身对excel不熟悉的话,可能会想办法去实现某些看上去很复杂的功能,殊不知,其实excel本身已经提供了类似的功能,有的时候可能仅仅是一个函数就解决了的事情,结果你搞半天,说不定辛苦弄出来,结果效率和效果还没内置的好。
Application.ScreenUpdating = False
Name = "安智-送货单12.18"
MP = "E:\杭实\运营数据\开单电子台账\" & Name & ".xlsx" '工作簿路径
Set Wb =
Work
book
s.Open(MP)
'清空数据
last_row_clear = This
Work
book
.Sheets("送货单").Cel
VBA
学习笔记3-数据结构类型SortedList一、SortedList是干什么的?二、创建方法1,前期绑定2,后期绑定三、常用方法和属性1,Add添加方法2,item的添加办法3,得到集合的大小4,判断key键和Item是否存在4.1,Contains属性4.2,ContainsKey属性4.3,ContainsValue属性5,通过key和item返回索引号5.1 通过key返回索引5.2 ...
On Error Resume NextFor i = 2 To 235 bugid1 = This
Work
book
.Sheets(2).Cells(i, 2).Value' MsgBox bugid1 For j = 2 To 135 bugid2 = This
Work
book
.Sheets(1).Cells(j, 7).Value' MsgBox bugid2 If bugid1 = bugid2 Then uname =
(1) Option Explicit '强制对模块内所有变量进行声明
(2) Option Base 1 '指定
数组
的第一个下标为1
(3) On Error Resume Next '忽略错误继续
执行
VBA
代码,避免出现错误消息
(4) On Error GoTo 100 '当错误发生时跳转到过程中的某个位置
(5) On Error GoTo 0 '恢复正常的错误提示
(6) Application.DisplayAlerts=False '在程序
执行
过程中使出现的警告框不显示
(7) Applica
【关键步骤】从开发工具里打开Visual Basic, 新建模块1,将以下代码复制到里面,保存,关闭代码窗口。Public Sub 一键获取本文件夹工作
表
()Application.ScreenUpdating = False
Dim
f As String, i As Integer
Dim
wb As Excel.
Work
book
Dim
sh, sh1 As Excel.
Work
sheetSet ...
VBA
中的变量区分对象变量与非对象变量,采用不同的赋值方式。同时,对于对象变量,又区分内置对象与非内置对象,在语法上有所区别。对于非内置对象的引用,可以使用前期绑定或后期绑定的方式。1 非对象变量的声明和赋值对于非对象变量,一般使用关键字let来赋值:Sub 非对象变量赋值()
Dim
i As Integer Let i = 23 'Let可省略 i = 45 '省略Let形式的非对象变量赋值 ...
作者:iamlaosong1、一般延时一个应用接口需要限制运行
速度
,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用
Tim
er函数编写,
Tim
er是
VBA
自带的函数,用起来比较方便,一般程序如下:'延时程序Sub delay(T As Single)
Dim
tim
e1 As Single
tim
e1 =
Tim
er Do ...