添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
俊逸的长颈鹿  ·  python ...·  4 月前    · 
朝气蓬勃的煎鸡蛋  ·  Python: keep open ...·  1 年前    · 
强悍的钥匙  ·  Numpy中出现“ValueError: ...·  1 年前    · 

有一次交流群一位朋友问我,为什么我的代码运行了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        ...