VBA入门到进阶常用知识代码总结47
第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”) = "=C2D2”
Range(“e2:e2000”).FillDown
Debug.Print Timer - t
End Sub
VBA入门到进阶常用知识代码总结47相关推荐
- VBA入门到进阶常用知识代码总结77
第77集 API基础 367. API概述 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或 ...
- VBA入门到进阶常用知识代码总结43
第43集 日期与时间专辑 189. 返回当前日期.时间(指本机系统设置的日期和时间) Sub t1() Debug.Print Date '返回当前日期 Debug.Print Time '返回当前时 ...
- VBA入门到进阶常用知识代码总结40
第40集 正则表达式4 175. () 可以让括号内作为一个整体,取匹配结果的时候,括号中的表达式可以用 \数字引用,\后数字按照从左往右,从外向里的顺序. Sub t29() Dim regx As ...
- Vue3+TypeScript从入门到进阶(六)——TypeScript知识点——附沿途学习案例及项目实战代码
文章目录 一.简介 二.Vue2和Vue3区别 三.Vue知识点学习 四.TypeScript知识点 一.JavaScript和TypeScript 二.TypeScript的安装和使用 1.Type ...
- Webpack从入门到进阶(二)---附沿路学习案例代码
文章目录 Webpack从入门到进阶(一)---附沿路学习案例代码 一.Webpack简介 1.前端发展的几个阶段 2.前端三个框架的脚手架 3.Webpack是什么? 4.webpack和vite ...
- HBase入门至进阶以及开发等知识梳理
HBase入门至进阶以及开发等知识梳理 HBase简介 hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分 ...
- Vue3+TypeScript从入门到进阶(八)——项目打包和自动化部署——附沿途学习案例及项目实战代码
文章目录 一.简介 二.Vue2和Vue3区别 三.Vue知识点学习 四.TypeScript知识点 五.项目实战 六.项目打包和自动化部署 一. 项目部署和DevOps 1.1. 传统的开发模式 1 ...
- 100例Python代码带你从入门到进阶!
以下所有代码全都至少运行一遍,确保可复现.易于理解.逐步完成入门到进阶的学习. 此教程经过我 反复打磨多遍 ,经常为此熬夜,真心不易,文章比较长,看完有用,帮我点个在看或分享支持. 教程包括 62 个 ...
- VBA编程中常用过程代码
VBA编程常用过程代码方案,供大家写代码参考,陆续发表: VBA过程代码6:返回当前单元格的位移 Sub MyNZ() on error resume next ActiveCell.Offset(0 ...
最新文章
- swift中字符串截取方法(substring)
- oracle解除表锁死1,解除Oracle被锁的表
- VS2015安装简单的C#单元测试
- c语言全排列算法_一文学会回溯搜索算法解题技巧
- layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...
- mmap函数_分析由 mmap 导致的内存泄漏
- ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】...
- 智能优化算法应用:基于GWO优化的Renyi熵图像多阈值分割 - 附代码
- 2021/4/27 “如何为div层添加边框?”(border属性详解)
- windows出于安全原因某些设置由系统管理员管理解决方法
- 初始vue脚手架的项目文件中mian.js文件
- 例3.1 有人用温度计测量出用华氏法表示的温度,今要求把它转换为以摄氏法表示的温度。
- linux 6.5光驱是什么意思,linux 6和5有什么不同
- 位、字节、字符数的关系
- Rabbit MQ的基本使用
- 怎样让您的电脑待机耗电等于零?
- c语言圆周率小数点后500万位,圆周率500位
- 【K8S】k8s pv,pvc无法删除问题
- 好用的 js 压缩工具 压缩软件 压缩程序 精简压缩 JsZIP(JavaScript压缩工具)
- 计算机搜索记录为什么删除不掉,删除电脑上搜索引擎记录的解决方法
热门文章
- 22.实战:Kaggle房价预测
- 2020CADCG专题报告笔记 Jittor计图 深度学习框架
- 水果店如何写文案,做水果店发的文案
- The following packages have unmet dependencies错误
- 4.1.1 网络层的功能(路由选择与分组转发、异构网络互连、拥塞控制)
- MSP432E401Y-用定时器中断控制LED闪烁
- html如何生成条形码,前端如何生成条形码---JsBarcode
- 5G点亮工业革命前,2021需要持续点亮5G
- Linux云计算学习教程,一个全新的世界—Linux
- “拼多多和短视频极速版”,让我怎么吐槽你好呢!