第47集 程序优化与提速
205、 减少对象的调用
调用对象是非常非常的耗费资源的,所以一定要尽可能的少调用对象。包括:
工作簿、工作表、单元格以及外引用对象。

Sub 在循环中调用单元格()
Dim x As Integer, k
Dim t
t = Timer
For x = 1 To 20000
k = [a1]
Next x
Debug.Print Timer - t
End Sub

Sub 在循环外调用单元格()
Dim x As Long, k, m
Dim t
t = Timer
m = [a1]
For x = 1 To 2000000
k = m
Next x
Debug.Print Timer - t
End Sub

'上面两个程序运行的结果一样,但速度却差了 28.12/0.03=937倍
206、 减少计算次数
'程序的运算速度和计算次数有着很大的关系,所以要尽可能的减少计算的次数
'能在循环外计算出结果的,就不要在循环内计算。
Sub 在循环中计算()
Dim a, b, c, x, t, k
t = Timer
a = 100: b = 2: c = 3
For x = 1 To 1000000
k = a ^ b + c
Next x
Debug.Print Timer - t
End Sub
Sub 在循环外计算()
Dim a, b, c, x, t, k, m
t = Timer
a = 100: b = 2: c = 3
m = a ^ b + c
For x = 1 To 1000000
k = m
Next x
Debug.Print Timer - t
End Sub
207、 禁止闪屏
Application.ScreenUpdating当设置属性值为false时,可以禁止程序运行过程中的屏幕闪动
进而提高运行速度
注意:只有对会引起闲屏操作的代码才有效,否则可能还会拖慢程序的速度
Sub 没有禁闪屏()
Dim x, t
t = Timer
For x = 1 To 100
Sheets(2).Select
Next x
[a1] = Timer - t
End Sub
Sub 禁闪屏()
Dim x, t
t = Timer
Application.ScreenUpdating = False
For x = 1 To 100
Sheets(2).Select
Next x
[b1] = Timer - t
Application.ScreenUpdating = True
End Sub
208、 增加变量的声明类型
Sub 没声明变量类型()
Dim arr, brr(1 To 6800, 1 To 3), i, s, x
Dim t
t = Timer
arr = Range(“a1”).CurrentRegion
For i = 1 To UBound(arr)
s = Replace(Replace(arr(i, 1), “(”, “’"), “)”, “”)
brr(i, 1) = Split(s, "
”)(0)
brr(i, 2) = Split(s, “")(1)
brr(i, 3) = Split(s, "
”)(2)
Next
[c1].Resize(UBound(arr), 3) = “”
[c1].Resize(UBound(arr), 3) = brr
MsgBox Timer - t
End Sub
Sub 变量声明后()
Dim arr, brr(1 To 6800, 1 To 3) As String, i%, s,xAsIntegerDimtt=Timerarr=Range("a1").CurrentRegionFori=1ToUBound(arr)s=Replace(Replace(arr(i,1),"(","∗′"),")","")brr(i,1)=Split(s,"∗")(0)brr(i,2)=Split(s,"∗")(1)brr(i,3)=Split(s,"∗")(2)Next[c1].Resize(UBound(arr),3)=""[c1].Resize(UBound(arr),3)=brrMsgBoxTimer−tEndSubSub拆分数组()Dimarr,brr1(1To6800,1To1)AsString,brr2(1To6800,1To1)AsInteger,brr3(1To6800,1To1)AsString,i, x As Integer Dim t t = Timer arr = Range("a1").CurrentRegion For i = 1 To UBound(arr) s = Replace(Replace(arr(i, 1), "(", "*'"), ")", "") brr(i, 1) = Split(s, "*")(0) brr(i, 2) = Split(s, "*")(1) brr(i, 3) = Split(s, "*")(2) Next [c1].Resize(UBound(arr), 3) = "" [c1].Resize(UBound(arr), 3) = brr MsgBox Timer - t End Sub Sub 拆分数组() Dim arr, brr1(1 To 6800, 1 To 1) As String, brr2(1 To 6800, 1 To 1) As Integer, brr3(1 To 6800, 1 To 1) As String, i%, s,xAsIntegerDimtt=Timerarr=Range("a1").CurrentRegionFori=1ToUBound(arr)s=Replace(Replace(arr(i,1),"(","∗′"),")","")brr(i,1)=Split(s,"∗")(0)brr(i,2)=Split(s,"∗")(1)brr(i,3)=Split(s,"∗")(2)Next[c1].Resize(UBound(arr),3)=""[c1].Resize(UBound(arr),3)=brrMsgBoxTimer−tEndSubSub拆分数组()Dimarr,brr1(1To6800,1To1)AsString,brr2(1To6800,1To1)AsInteger,brr3(1To6800,1To1)AsString,i, x As Integer
Dim t
t = Timer
arr = Range(“a1”).CurrentRegion
For i = 1 To UBound(arr)
s = Replace(Replace(arr(i, 1), “(”, “’"), “)”, “”)
brr1(i, 1) = Split(s, "
”)(0)
brr2(i, 1) = Split(s, “")(1)
brr3(i, 1) = Split(s, "
”)(2)
Next
[c1].Resize(UBound(arr), 3) = “”
[c1].Resize(UBound(arr), 1) = brr1
[d1].Resize(UBound(arr), 1) = brr2
[E1].Resize(UBound(arr), 1) = brr3
MsgBox Timer - t
End Sub
209、 减少工作表函数的使用
调用工作表函数可以让代码更简捷,但速度却不理想…减少对工作表函数的调用也是提升程序速度的方法之一
Sub 统计次数()
Dim x, arr, k, t, Y
t = Timer
For Y = 1 To 10
arr = Range(“a1:a6800”)
For x = 1 To UBound(arr)
If InStr(arr(x, 1), “加10分”) > 0 Then
k = k + 1
End If
Next x
Next Y
Debug.Print Timer - t & “秒”
End Sub
Sub 使用函数变慢()
Dim x, arr, k, t, Y
t = Timer
For Y = 1 To 10
arr = Range(“a1:a6800”)
k = Application.CountIf([a:a], “加10分”)
Next Y
Debug.Print Timer - t & “秒”
End Sub
210、 减少VBA函数的使用
Sub 用VBA函数算整除()
Dim x, t, k
t = Timer
For x = 1 To 1000000
k = Int(10000 / 3)
Next x
Debug.Print Timer - t
End Sub
Sub 用整除运算符()
Dim x, t, k
t = Timer
For x = 1 To 1000000
k = 10000 \ 3
Next x
Debug.Print Timer - t
End Sub
211、 用静态数组替换动态
Sub 动态数组()
Dim arr, brr(), t, k As Integer, x As Long
t = Timer
ReDim brr(1 To 1)
arr = Range(“A1:A13000”)
For x = 1 To UBound(arr)
If arr(x, 1) Like “64-10” Then
k = k + 1
ReDim Preserve brr(1 To k)
brr(k) = arr(x, 1)
End If
Next x
Range(“f1”).Resize(k) = Application.Transpose(brr)
Debug.Print Timer - t
End Sub

Sub 静态数组()
Dim arr, brr(1 To 10000, 1 To 1) As String, t, k As Integer, x As Long, Y
t = Timer
arr = Range(“A1:A13000”)
For x = 1 To UBound(arr)
If arr(x, 1) Like “64-10” Then
k = k + 1
brr(k, 1) = arr(x, 1)
End If
Next x
Range(“D1”).Resize(k) = brr
Debug.Print Timer - t
End Sub
212、 填充前先清空
Sub 变量声明后()
Dim arr, brr(1 To 20400, 1 To 3) As String, i%, s$, x As Integer
Dim t
t = Timer
arr = Range(“a1”).CurrentRegion
For i = 1 To UBound(arr)
s = Replace(Replace(arr(i, 1), “(”, “’"), “)”, “”)
brr(i, 1) = Split(s, "
”)(0)
brr(i, 2) = Split(s, “")(1)
brr(i, 3) = Split(s, "
”)(2)
Next
[c1].Resize(UBound(arr), 3) = “”
[c1].Resize(UBound(arr), 3) = brr
Debug.Print Timer - t
End Sub
213、 批量替代个体
Sub 隐藏工作表()
Dim x As Integer, t
显示工作表
t = Timer
For x = 1 To Sheets.Count
If Sheets(x).Name Like “Sh*” Then
Sheets(x).Visible = False
End If
Next x
Debug.Print Timer - t
End Sub
Sub 隐藏工作表2()
Dim x As Integer, t, arr(), k
显示工作表
t = Timer
For x = 1 To Sheets.Count
If Sheets(x).Name Like “Sh*” Then
k = k + 1
ReDim Preserve arr(1 To k)
arr(k) = Sheets(x).Name
End If
Next x
Sheets(arr).Visible = False
Debug.Print Timer - t
End Sub

Sub 显示工作表()
Dim x
For x = 1 To Sheets.Count
If Sheets(x).Name Like “Sh*” Then
Sheets(x).Visible = True
End If
Next x
End Sub
214、 减少循环次数
减少循环次数是最直接的优化速度方法,但操作起来有难度,需要学习相关的知识.如:

1 利用VBA字典.在查找时替代循环查找.相关方法参见VBA80集字典部分
2 学习VBA算法,减少不必要的循环和运算.如:第45集的换位算法,和29集下棋法,
另外,象26集的排序算法,也是通过排除不必要的运算和循环来加快程序运行速度
215、 巧妙填充公式
向单元格输入公式,如果是连续的,就可以用填充的方法来完成.
Sub 填充公式方法1()
Dim x, t
t = Timer
Range(“e2:e1000”) = “”
For x = 2 To 1000
Cells(x, “e”) = “=C” & x & “D" & x
Next x
Debug.Print Timer - t
End Sub
Sub 填充公式方法2()
Dim x, t
Range(“e2:e2000”) = “”
t = Timer
Cells(2, “e”) = "=C2
D2”
Range(“e2:e2000”).FillDown
Debug.Print Timer - t
End Sub

VBA入门到进阶常用知识代码总结47相关推荐

  1. VBA入门到进阶常用知识代码总结77

    第77集 API基础 367. API概述 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或 ...

  2. VBA入门到进阶常用知识代码总结43

    第43集 日期与时间专辑 189. 返回当前日期.时间(指本机系统设置的日期和时间) Sub t1() Debug.Print Date '返回当前日期 Debug.Print Time '返回当前时 ...

  3. VBA入门到进阶常用知识代码总结40

    第40集 正则表达式4 175. () 可以让括号内作为一个整体,取匹配结果的时候,括号中的表达式可以用 \数字引用,\后数字按照从左往右,从外向里的顺序. Sub t29() Dim regx As ...

  4. Vue3+TypeScript从入门到进阶(六)——TypeScript知识点——附沿途学习案例及项目实战代码

    文章目录 一.简介 二.Vue2和Vue3区别 三.Vue知识点学习 四.TypeScript知识点 一.JavaScript和TypeScript 二.TypeScript的安装和使用 1.Type ...

  5. Webpack从入门到进阶(二)---附沿路学习案例代码

    文章目录 Webpack从入门到进阶(一)---附沿路学习案例代码 一.Webpack简介 1.前端发展的几个阶段 2.前端三个框架的脚手架 3.Webpack是什么? 4.webpack和vite ...

  6. HBase入门至进阶以及开发等知识梳理

    HBase入门至进阶以及开发等知识梳理 HBase简介 hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分 ...

  7. Vue3+TypeScript从入门到进阶(八)——项目打包和自动化部署——附沿途学习案例及项目实战代码

    文章目录 一.简介 二.Vue2和Vue3区别 三.Vue知识点学习 四.TypeScript知识点 五.项目实战 六.项目打包和自动化部署 一. 项目部署和DevOps 1.1. 传统的开发模式 1 ...

  8. 100例Python代码带你从入门到进阶!

    以下所有代码全都至少运行一遍,确保可复现.易于理解.逐步完成入门到进阶的学习. 此教程经过我 反复打磨多遍 ,经常为此熬夜,真心不易,文章比较长,看完有用,帮我点个在看或分享支持. 教程包括 62 个 ...

  9. VBA编程中常用过程代码

    VBA编程常用过程代码方案,供大家写代码参考,陆续发表: VBA过程代码6:返回当前单元格的位移 Sub MyNZ() on error resume next ActiveCell.Offset(0 ...

最新文章

  1. swift中字符串截取方法(substring)
  2. oracle解除表锁死1,解除Oracle被锁的表
  3. VS2015安装简单的C#单元测试
  4. c语言全排列算法_一文学会回溯搜索算法解题技巧
  5. layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...
  6. mmap函数_分析由 mmap 导致的内存泄漏
  7. ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】...
  8. 智能优化算法应用:基于GWO优化的Renyi熵图像多阈值分割 - 附代码
  9. 2021/4/27 “如何为div层添加边框?”(border属性详解)
  10. windows出于安全原因某些设置由系统管理员管理解决方法
  11. 初始vue脚手架的项目文件中mian.js文件
  12. 例3.1 有人用温度计测量出用华氏法表示的温度,今要求把它转换为以摄氏法表示的温度。
  13. linux 6.5光驱是什么意思,linux 6和5有什么不同
  14. 位、字节、字符数的关系
  15. Rabbit MQ的基本使用
  16. 怎样让您的电脑待机耗电等于零?
  17. c语言圆周率小数点后500万位,圆周率500位
  18. 【K8S】k8s pv,pvc无法删除问题
  19. 好用的 js 压缩工具 压缩软件 压缩程序 精简压缩 JsZIP(JavaScript压缩工具)
  20. 计算机搜索记录为什么删除不掉,删除电脑上搜索引擎记录的解决方法

热门文章

  1. 22.实战:Kaggle房价预测
  2. 2020CADCG专题报告笔记 Jittor计图 深度学习框架
  3. 水果店如何写文案,做水果店发的文案
  4. The following packages have unmet dependencies错误
  5. 4.1.1 网络层的功能(路由选择与分组转发、异构网络互连、拥塞控制)
  6. MSP432E401Y-用定时器中断控制LED闪烁
  7. html如何生成条形码,前端如何生成条形码---JsBarcode
  8. 5G点亮工业革命前,2021需要持续点亮5G
  9. Linux云计算学习教程,一个全新的世界—Linux
  10. “拼多多和短视频极速版”,让我怎么吐槽你好呢!