ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 由SUMIF与sumproduct的速度比较展开联想,实现同一功能的不同公式如何选择?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-12 06:18 | 显示全部楼层 |阅读模式
一、两个求和公式的比较
=SUMIF(A:A,"a",B:B)
=sumproduct((A1:A4="a")*B1:B4)
论坛中应用sumproduct的很普遍,大有取代SUMIF的趋势,上面的两个条件求和方法在数据量比较大时哪那个速度快?


看附件的测试结果
测试数据再次修改20100512.rar (284.9 KB, 下载次数: 314)
欢迎大家参与讨论,尤其是测试的方法和代码的可靠性。

如果测试代码和方法正确,可看出两个公式速度相差近一倍。SUMPRODUCT比SUMIF快。

二、一列中提取不重复值的公式得比较讨论:
从17楼开始讨论一列中提取不重复值的公式:
公式一(辅助列法):
=IF(COUNTIF($e2:e$2,e2)=1,MAX(d1:d$1)+1,"")
=IF(ISNA(VLOOKUP(ROW(1:1),$d$2:$e1000,2,0)),"",VLOOKUP(ROW(1:1),$d$2:$e1000,2,0))
公式二( 区域数组公式  ):
=INDEX(e:e,SMALL(IF(MATCH(机构,机构,)=ROW(机构)-1,ROW(机构),4^8),ROW(1:250)))&""
公式三( 单个数组公式  ):
=INDEX(姓名,SMALL(IF(ROW(姓名)-1=MATCH(姓名,姓名,0),ROW(姓名)-1,""),ROW(1:1)))      
公式四(条件计数与查找):   
=INDEX(机构,MATCH(,COUNTIF($e$1:e1,机构),))
猜猜以上的四个公式哪个速度最快,哪个速度最慢?

三、几个查找公式的比较:
先需要大家的献言献策,期待……

晚枫老师的:
关于IF({1,0}的运算速度问题:
http://club.excelhome.net/thread-562336-1-1.html



czzqd在帖子
[求助]如何在单元格中取一列数中最后一个非零的数值?
的14楼指出:
http://club.excelhome.net/viewth ... 3Ddigest&page=2

介绍一下bosco_yip 对相关公式的测速结果:

=LOOKUP(2,1/(A1:A10<>""),A1:A10) - 为效率较低的函数公式 - 公式一 : LOOKUP(9.99999999999999E307,A:A) - 公式二 : LOOKUP(2,1/(A1:A65535<>””),A1:A65535) - 公式一 要比公式二, 速度效率快约500倍

==========

INDEX(A1:A10,MAX(IF(A1:A10<>"",ROW(A1:A10)))) - 亦是效率较低的函数公式 - 公式一 : LOOKUP(9.99999999999999E307,A:A) - 公式三 : INDEX(A:A,MAX(IF(A1:A65535<>””,ROW(A1:A65535)))) - 公式一 要比公式三, 速度效率快约396倍

=MATCH("一二三四五",TEXT(ROW(A:A),"[dbnum1]0"),)数组
惊心的是大数组(row(1:65536),公式短,但速度慢。
比较一下 wshcw的:
一至九的转换:
=MID(SUM(FIND(TEXT(ROW($1:$9),"[dbnum1]0"),"一二三四五六七八九")/10^ROW($1:$9)),3,9)
看来公式中引用的区域范围的大小对速度的影响也是一个重要的因素。
参看讨论的帖子:
“一二三四五”如何用公式转化成“12345”
http://club.excelhome.net/thread-617752-3-1.html


晚枫在帖子
逆向查询有多少种方法
http://club.excelhome.net/viewth ... 26amp%3Btypeid%3D40
的5楼中提供的:
IF({1,0}和CHOOSE是最慢的
OFFSET和INDRIRECT次之,
LOOKUP速度也不见得快
只有INDEX+MATCH是最快的
如果B列能够排序,那么MATCH就可以采用近似匹配,速度更快。

[ 本帖最后由 lhx120824 于 2010-9-14 16:59 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-12 07:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-12 07:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
因为sumproduct是数组得出的结论吧,楼主试试,凡我不会使用他去替代sunif。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-12 08:44 | 显示全部楼层
我用以下代码做了一个测试,
Sub getTimer()
Dim myTime
myTime = Timer
Application.Calculate
myTime = Timer - myTime
MsgBox Format(myTime, "本次计算总花费0.000秒")
End Sub

数据见附件,结果同大家的猜测正相反
=SUMPRODUCT(($P2:$P1822=$S2)*D2:D1822)
0.375
0.344
0.328

=SUMIF($P:$P,$S2,D:D)
1.172
1.188
1.414

不知是代码有问题,还是大家感觉错了?
测试数据20100512.rar (283.38 KB, 下载次数: 62)

[ 本帖最后由 lhx120824 于 2010-5-12 13:07 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-12 08:51 | 显示全部楼层
以上测试这样做的:把公式选项改为手动,在s2中输入
=SUMPRODUCT(($P2:$P1822=$S2)*D2:D1822)
回车然后右拖再双击向下自动填充,单击测速,记录下结果0.375,同样的操作反复三次,分别得到0.375   0.344  0.328

用同样的方法测试公式
=SUMIF($P:$P,$S2,D:D)

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-12 09:03 | 显示全部楼层
我又做了修改,结果差不多是第一种方法增加一倍的数据时间差不多增一倍。第二种方法改为同第一个公式同样的引用区域,时间差不多,见修改后的附件。都是引用3643行。
我怀疑的就是代码的问题,请大家讨论。
测试数据修改20100512.rar (284.39 KB, 下载次数: 40)

[ 本帖最后由 lhx120824 于 2010-7-16 22:27 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-12 09:54 | 显示全部楼层
再次修改附件,请参与讨论。
测试数据再次修改20100512.rar (284.9 KB, 下载次数: 71)

TA的精华主题

TA的得分主题

发表于 2010-5-12 10:09 | 显示全部楼层
公式应该这样才对
=SUMIF($P$2:$P$3643,$S2,D$2:D$3643)
=SUMPRODUCT(($P$2:$P$3643=$S2)*D$2:D$3643)
似乎是sumproduct快一些

[ 本帖最后由 cflood 于 2010-5-12 10:16 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-12 10:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
觉得应该sumif快

TA的精华主题

TA的得分主题

发表于 2010-5-12 10:15 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-12 07:32 , Processed in 0.037323 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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