Excel中如何计算恰好5个非零值的移动平均值
Excel中如何计算恰好5个非零值的移动平均值
嘿,这个需求我太懂了!普通的AVERAGEIF确实只能统计区域里所有非零值的平均,但如果要精准凑够5个非零值来计算——遇到0就直接跳过,直到找满5个有效数值——得换个组合函数的思路,我分两种Excel版本给你说:
如果你用的是Office 365/2021(支持动态数组)
这个版本有更简洁的写法,直接用FILTER+TAKE+AVERAGE组合:
假设你的数据在A1:A100区域,公式如下:
=AVERAGE(TAKE(FILTER(A1:A100,A1:A100<>0),5))
FILTER(A1:A100,A1:A100<>0):先把区域里所有非零的数值筛选出来,按原顺序排列TAKE(...,5):从筛选结果里取前5个数值AVERAGE(...):对这5个数值计算平均值
要是区域里非零值不足5个,公式会返回#CALC!,可以加IFERROR做容错处理:
=IFERROR(AVERAGE(TAKE(FILTER(A1:A100,A1:A100<>0),5)),"非零值不足5个")
如果你用的是旧版Excel(无动态数组,比如2019及更早)
得用数组公式来实现(输入完公式后要按Ctrl+Shift+Enter确认,不能直接回车):
同样假设数据在A1:A100,公式如下:
=IFERROR(AVERAGE(INDEX(A1:A100,SMALL(IF(A1:A100<>0,ROW(A1:A100)-ROW(A1)+1),ROW(INDIRECT("1:5"))))),"非零值不足5个")
拆解一下逻辑:
IF(A1:A100<>0,ROW(A1:A100)-ROW(A1)+1):找出所有非零值在区域内的相对行号SMALL(...,ROW(INDIRECT("1:5"))):取前5个非零值的相对行号INDEX(A1:A100,...):根据行号提取对应的5个非零值AVERAGE(...):计算这5个值的平均,IFERROR处理不足5个的情况
额外补充:如果要找「最近的5个非零值」(移动平均场景)
要是你的需求是从当前单元格往前找最近的5个非零值(比如滚动计算),Office 365版本可以这么写:
假设当前计算单元格是B10,要从A1:A9里找最近的5个非零值:
=AVERAGE(TAKE(SORT(FILTER(A1:A9,A1:A9<>0),ROW(A1:A9),-1),5))
这里用SORT(...,ROW(A1:A9),-1)把筛选出的非零值按行号倒序排列(最近的在前),再取前5个计算平均。
你可以根据自己的Excel版本和实际数据区域,调整公式里的单元格范围哦~
备注:内容来源于stack exchange,提问作者frenchpress61




