如何在Excel中实现无销售日工时结转及符合条件连续行部分和计算
一、计算满足条件的连续行部分和公式
以下是两种常见场景的公式实现:
场景1:计算当前行向上连续满足条件的数值和
假设A列为条件列(如产品类别),B列为数值列(如销量),要计算从当前行向上连续等于“苹果”的B列数值和:
=SUM(OFFSET(B2, 0, 0, -MATCH(FALSE, A$2:A2="苹果", 0)+1, 1))
- 逻辑:
MATCH(FALSE, A$2:A2="苹果", 0)定位第一个不满足条件的行位置,OFFSET确定求和范围,SUM计算总和。
场景2:批量计算所有连续满足条件区块的和(Excel 365/2021)
若需一次性生成所有连续满足条件的区块和,使用动态数组公式:
=LET( 数值列, B:B, 条件列, A:A="苹果", 连续组标识, SCAN(0, 条件列, LAMBDA(累计值, 当前条件, IF(当前条件, 累计值+1, 0))), 结果, BYROW(连续组标识, LAMBDA(组号, IF(组号>0, SUM(OFFSET(数值列, -组号+1, 0, 组号, 1)), 0))) )
- 逻辑:
SCAN生成连续满足条件的组序号,BYROW遍历每个组号,计算对应范围的数值和。
二、无销售日期工时结转至下一日的实现
需求说明
当某日期对应的产品销量为0时,将当日工时结转至下一个有销量的日期,仅在有销量的日期显示累计工时。
实现方案(Excel 365/2021 动态数组版)
假设A列为日期,B列为当日工时,C列为销量,在空白列(如E列)输入以下公式:
=LET( 日期列, A:A, 工时列, B:B, 销量列, C:C, 有效行号, FILTER(ROW(日期列), 销量列>0), 结转结果, BYROW(ROW(日期列), LAMBDA(当前行号, IF(ISNUMBER(MATCH(当前行号, 有效行号, 0)), SUM(INDEX(工时列, IFERROR(MAX(FILTER(有效行号, 有效行号<当前行号)), 1)):INDEX(工时列, 当前行号)), 0 ) )), 结转结果 )
- 逻辑:
FILTER筛选所有有销量的行号;BYROW遍历每一行,若为有效行(有销量),则计算从上一个有效行到当前行的工时总和,否则返回0。
旧版Excel 数组公式实现(需按Ctrl+Shift+Enter确认)
在E2单元格输入以下公式,下拉填充:
=IF(C2>0,SUM(OFFSET(B$1,MAX(IF(C$1:C1>0,ROW(C$1:C1),0)),0,ROW()-MAX(IF(C$1:C1>0,ROW(C$1:C1),0)),1)),0)
示例表格

表格说明:1/2日销量为0,当日2小时工时结转至1/3日,因此1/3日的结转后工时为3+2=5;1/5日销量为0,工时1结转至1/6日,1/6日结转后工时为4+1=5。
内容的提问来源于stack exchange,提问作者Rony
相关产品推荐
相关产品推荐

