优秀的编程知识分享平台

网站首页 > 技术文章 正文

Excel函数解答统计指定费用问题_如何统计各种费用表

nanyue 2025-09-14 23:35:59 技术文章 1 ℃

今天给大家带来一个实际问题,统计每个人指定费用的问题,主要是数据源不规范,不能直接聚合得到结果;题目来源网络,函数公式完全是个人花时间写的。

这个问题,我们主要是两个步骤,规范数据源和聚合;具体来看看数据源和所需结果。

这里是统计所有人的生活费合计,当然了,也可以统计其他项目费用。下面给出我的两种方法,直接上函数公式咯!

方法一:

=LET(a,A1:E32,b,TOCOL(IF(a="姓名",ROW(a),NA()),2),r,HSTACK(b,VSTACK(DROP(b,1)-1,ROWS(a))),c,TOCOL(IF(a="生活费",COLUMN(a),NA()),2),d,DROP(REDUCE("",SEQUENCE(ROWS(c)),LAMBDA(x,y,VSTACK(x,CHOOSECOLS(DROP(TAKE(a,INDEX(r,y,2)),INDEX(r,y,1)),1,INDEX(c,y))))),1),GROUPBY(TAKE(d,,1),TAKE(d,,-1),SUM,,0))

这个公式里,a表示数据源区域;b表示提取姓名所在行,r表示的是每一块数据,也就是两个姓名之间的数据,第一块是第一行到第七行,第二块是第8行到第十四行……;c表示生活费所在各个块的列数,d是得到所有的姓名和对应的生活费数据,也就是规范后的用于聚合的数据,这里很巧妙的运用了Excel函数解题三大思想中的索引和错位,另外一种是行列。

方法二:

=LET(a,A1:E32,f,LAMBDA(ch,BYROW(DROP(REDUCE("",SEQUENCE(COLUMNS(a)),LAMBDA(x,y,HSTACK(x,IF(INDEX(a,,y)=ch,y,"")))),,1),CONCAT)),g,LAMBDA(ar,SCAN(0,ar,LAMBDA(x,y,IF(y<>"",y,x)))),rc,HSTACK(g(f("姓名")),g(f("生活费"))),s,INDEX(a,SEQUENCE(ROWS(a)),rc),GROUPBY(TAKE(s,,1),TAKE(s,,-1),SUM,,0,,TAKE(s,,1)<>"姓名"))

这个公式中,通过自定义函数f和g,f提取姓名列和生活费所在列的列号,函数g补全列号并堆叠得到一个和数据源a一样行数的数据rc,然后根据rc得到我们需要的数据,也就是姓名和生活费两列数据s,之后就是和方法一一样,用groupby函数聚合,相比之下,方法一不需要筛选。

就这个问题,解决办法绝不是这两种,还有很多;下面给出两位大神的解法。

飞机大神的解法:

=LET(a,A1:E32,rindex,SEQUENCE(ROWS(a)),cindex,SCAN(0,BYROW(a,LAMBDA(x,MATCH("生活费",x,0))),LAMBDA(x,y,IF(ISNA(y),x,y))),data,INDEX(a,rindex,HSTACK(rindex^0,cindex)),GROUPBY(TAKE(data,,1),TAKE(data,,-1),SUM,0,0,,TAKE(data,,1)<>"姓名"))

佚名大神的解法:

=HSTACK(I4:I7,MAP(I4:I7,LAMBDA(j,SUM((WRAPCOLS(SCAN(,TOCOL(C$3:F$34,,1),LAMBDA(X,Y,IF(Y>"",Y,X))),32)="生活费")*(B$3:B$34=j)*N(+C$3:F$34)))))

飞机大神的解法拆解开也还可以理解,通过行列索引得到姓名和生活费对应数据;佚名(真不知道这位大神叫什么)大神的解法很费劲,我是不理解的,聪明的你可以留下解析,那就万分感谢了。

都到这里了,你确定不留下你的解法吗?

Tags:

最近发表
标签列表