ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10054|回复: 18

[分享] VBA中调用Excel工作表函数和直接用VBA代码实现相同功能的速度比较

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-12 14:12 | 显示全部楼层 |阅读模式
长期在Excelhomel论坛潜水,受益良多,今日回馈论坛和坛友。
【题目】:VBA中调用Excel工作表函数和直接用VBA代码实现相同功能的速度比较
【缘由】:Excel中有很多函数可供在VBA中调用,同时,如果不怕麻烦,也可以自己编写Vba的代码实现相同功能,两个哪个速度更快呢,让事实说话。
【实例】:选用求一个数组的最大值的命题,简单易懂。
【实现】:因为实际代码执行很快,单次的测试肯定难以测出结果,因此选择重复执行的方式(本例重复10万次)
【代码】:复制粘贴后可直接在VBA环境中运行)
Sub SpeedTest2()    '测试VBA代码和调用Excel函数的速度差异
    Dim i As Long, j As Long, Lp As Long '循环变量,循环次数
    Dim T As Single, T1 As Single, T2 As Single '时间
    Dim R As Double, R1 As Double, R2 As Double '结果
    Dim V As Single, V1 As Single, V2 As Single '临时变量
    Dim A(1 To 256) As Single
   
'初始化
    Lp = 100000  '设定循环次数,便于修改
    For i = 1 To 256
        A(i) = i
    Next i
    A(123) = 456
'测试过程1
    T1 = Timer
    For i = 1 To Lp  '具体测试过程
        V1 = A(1)
        For j = 2 To 256
            If A(j) > V1 Then V1 = A(j)
        Next j
    Next i
    T2 = Timer
    R1 = T2 - T1    '结果1
'测试过程2
    T1 = Timer
    For i = 1 To Lp  '具体测试过程
        V2 = Application.WorksheetFunction.Max(A)
    Next i
    T2 = Timer
    R2 = T2 - T1    '结果1
'输出结果
    If R1 > R2 Then R = R1 / R2 Else R = R2 / R1
    MsgBox "直接用VBA语句实现并找出的最大值是:" & V1 & "  运行" & Lp & "次的时间:" & R1 & vbCr & _
           "调用Excel的 Max函数找出的最大值是:" & V2 & "  运行" & Lp & "次的时间:" & R2 & vbCr & _
        "二者相差:" & R & "倍!" & vbCrLf & "呵呵。"
End Sub
【结果】:
jieguo.PNG

【结论】:用VBA语句直接实现的速度是调用Excel函数速度的将近5倍!
【实际意义】:
        1.调用Excel函数简单易懂,可以简化代码,在速度要求不高或数据量不大的情况下,应优先选用;
        2.如果数据处理量很大,对速度要求又很高的话,最好还是不要怕麻烦,自己编写代码实现为妙。当然,前提是代码不能太糟糕。

        班门弄斧,诸位见笑!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-12 14:16 | 显示全部楼层
从语句上看,VBA语句执行的循环次数很多,但是反而速度快,不清楚是为什么。

TA的精华主题

TA的得分主题

发表于 2009-2-12 15:32 | 显示全部楼层
For i = 1 To Lp  运行小一次,可快些吗.......不知是否正确
     If A(j) > A(i+1) Then
           v1 = a(i)
     else
           v1 = a(i+1)
      end if
Next i

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-13 10:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 6688 于 2009-2-12 15:32 发表
For i = 1 To Lp  运行小一次,可快些吗.......不知是否正确
     If A(j) > A(i+1) Then
           v1 = a(i)
     else
           v1 = a(i+1)
      end if
Next i


概念有错误,循环变量为i 的循环是重复10万次的循环体,其内部才是真正进行比较速度的代码。

TA的精华主题

TA的得分主题

发表于 2009-2-13 13:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
是吗?看看!

TA的精华主题

TA的得分主题

发表于 2009-9-27 14:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
office2007的测试。
2009-09-27_145140.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-11-25 11:22 | 显示全部楼层
出这个帖子的缘由,在于看到不少资料在推荐VBA编程时,推荐多调用excel的函数,宣称excel内置函数计算速度快。故有了比较一下的念头。
    从测试结果看,大多数资料的概念是错误的,在VBA中调用excel内置函数的方式未必运行速度快!(有点吹毛求疵了)
    但是,在VBA中直接调用excel内置函数的优点还是比较明显的:可以减小编程难度、可以简化代码,在对速度要求不高的情况下,还是有相当大的好处的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-11-25 11:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢六楼参与测试。

TA的精华主题

TA的得分主题

发表于 2009-11-25 11:42 | 显示全部楼层
如果楼主没错的话,看来我们多数人都被书上忽悠了

没有实际测过.....

TA的精华主题

TA的得分主题

发表于 2009-11-25 12:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
office2007的测试如附件(附机器配置说明:CPU Core:T6400、内存:2G)
还是自己写代码的好啊,我很少在VBA编程的时候使用内置函数。
Test.JPG
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-16 13:44 , Processed in 0.043122 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表