|

楼主 |
发表于 2019-6-18 12:56
|
显示全部楼层
本帖最后由 流浪铁匠 于 2019-6-18 13:07 编辑
四,数组扩展
因为sum函数支持数组,支持多维,所以在这个阶段,sum函数具有无尽的衍生用法
在这里只列一点点皮毛,希望对大家有所帮助(sum简单的条件求和/计数资料太多,这里尽量列点相对少见的)
1,斜线求和
(第1个特意找了个不常见的,毕竟像简单的(多)条件求和/计数,稍微对数组有点了解的都知道怎么做
(斜线求和是我一个同事之前问我的问题,扩展了下难度,需要对图示几个颜色的区域分别求和
(图示颜色只是便于查看区域,不能使用宏表函数利用背影颜色来作为求和条件))(一个公式下拉完成)
2,
多列条件求和
混过e圈的应该知道这题有个段子
菜鸟公式为多个sumif列相加和sum无关故不列举
高手公式 =SUM(SUMIF(OFFSET(A$107:A$116,,ROW($1:$4)*0),G107,OFFSET(A$107:A$116,,ROW($1:$4))))
可简化为 =SUM(SUMIF(A$107:A$116,G107,OFFSET(A$107:A$116,,ROW($1:$4))))
高高手公式
=SUM(SUBTOTAL(9,OFFSET(B$106:E$106,ROW($1:$10),))*(A$107:A$116=G107))
高高高手公式
=SUM(MMULT(B$107:E$116,ROW(1:4)^0)*(A$107:A$116=G107))
可是这题我一直奇怪难道不是一个sum就完事了么……
纯一维数组解法
=SUM((A$107:A$116=G107)*(B$107:B$116+C$107:C$116+D$107:D$116+E$107:E$116)) 只适合学习时使用,列多了和sumif相加一样属于低效解法
常规二维数组解法
=SUM((A$107:A$116=G107)*B$107:E$116)
当然这题如果你sum熟悉了还有很多别的解法……
=SUM(IF(A$107:A$116=G107,B$107:E$116))
=SUM(DSUM(A$106:E$116,ROW($2:$5),G$106:G107))-SUM(H$106:H106)
=SUM(COUNTIF(G107,A$107:A$116)*B$107:E$116)
好吧我承认这题其实重点不是sum而是各种数组运算思路……,但sum在数组运算里的重要内容之一就是把各种内存数组聚合为求和结果不是么,
无论哪个解法最外面没sum(或sumproduct)也只是个内存数组而已
3
区间取值/范围判断
你们以为范围取值,只是 lookup/ vlookup/ match等函数的事情 ?!
(1)求日期对应的季度
(2)成绩判断
sum+常量数组的结构类似match
但match内需要排序
sum的常量数组没有这个限制
而且使用sum的另一个好处是比lookup等更适合左开右闭区间
(左开右闭时lookup等需要修正临界点的小数精度)
4,0& 在sum数组公式中的容错应用
严格来说这不是一个套路,而是一种容错的技巧,在sum的数组公式中常见,之前碰到一个题又用上了
=SUM(--TRIM(MID(SUBSTITUTE(A177,"/",REPT(" ",99)),(ROW(INDIRECT("1:"&(LEN(A177)-LEN(SUBSTITUTE(A177,"/",))+1))))*99-98,99)))
因为"/"数量不一致,所以部分公式利用trim/substitute/mid的套路产生的用"/"分列的内存数组,会产生 "" 空文本,
在用 --(减负运算)或*1等把文本型数值转化成真数值求和的过程中,--"" 会产生错误值,因为文本不能进行四则运算
所以使用row+indirect+len的结构,保证分列数与"/"间隔数匹配
可简化为
=SUM(--(0&TRIM(MID(SUBSTITUTE(A177,"/",REPT(" ",99)),ROW($1:$5)*99-98,99))))
而若使用0&的方式,把产生的"" 转成文本型的0&""即"0"
亦可对公式进行容错处理,且公式较为简洁
(这里只是介绍一个类似1/17,5^19的常用容错手段,短的公式计算量不一定小,切记)
如果存在文本,经常会借助text来经常类似处理,因为之后案例有text更强大的应用,这里不再赘述
另外,关于0& 还要说明下,这个除了处理空文本外还能处理单纯的空格
因为excel的计算有个性质是可以直接忽略数字两端的多余空格
所以 =sum(" 123 ")等价 =sum("123")等价 =sum(123)
|
评分
-
1
查看全部评分
-
|