总和范围和减去子范围的总和

我正在计算加class费。 如果小时数大于40,则减去40。 然而,用一个单一的复制/粘贴公式 ,我想分解下来,以显示一周中的每一天有多less小时计为加class。 这是一个视觉例子:

Date | Hours | OT | -----|-------|----| Day1 | 10 | 00 | Day2 | 08 | 00 | Day3 | 18 | 00 | Day4 | 16 | 12 | OT = if SUM(B2:B5>40) then SUM(B2:B5,-40,SUM((C2:C4)*-1)) Day5 | 04 | 04 | Day6 | 08 | 08 | Day7 | 09 | 09 | 

这里我最大的问题是,我并不总是想从B2C2开始,我不想总是在B5C4结束,因为一周重新开始,我需要知道我现在的细胞( B5 )和细胞在每周下一列-1周内( C4 )。 我需要B2增加到B9B16等,我需要C4 B5增加。 即B7C6B6C5等我认为OFFSET可以工作,但我不知道如何得到它的工作,使我可以使用一个公式,而不是一个52的衍生工具。

到目前为止,我能想到的最好的公式是: =SUM(OFFSET($B$2,(ROW()-2)*7,0,7,1),-40)它只计算整个加class周和静态B2

感谢@TomSharpe。 这些都是完美的。 select你最喜欢的一个:

抵消

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(SUM(OFFSET($C$2,INT((ROW()-ROW($2:$2))/7)*7,0,MOD(ROW()-ROW($2:$2),7)))=0,--TEXT(SUM(OFFSET($B$2,INT((ROW()-ROW($2:$2))/7)*7,0,MOD(ROW()-ROW($2:$2),7)+1))-40,"0;\0"),B2)) 

指数

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(SUM(INDEX(C:C,INT((ROW()-ROW($2:$2))/7)*7+2):C1)=0,--TEXT(SUM(INDEX(B:B,INT((ROW()-ROW($2:$2))/7)*7+2):B2)-40,"0;\0"),B2)) 

这里是一个偏移公式,每周都有加class计算。 偏移量是当前星期的开始,高度是当前星期的天数。 我终于意识到,当前一天的加class时间大于零时,当天加class只是当天工作的小时数(因为他们都是加class)。

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(C1=0,--TEXT(SUM(OFFSET($B$2,INT((ROW()-ROW($2:$2))/7)*7,0,MOD(ROW()-ROW($2:$2),7)+1))-40,"0;\0"),B2)) 

TEXT函数的使用是@Barry Houdini提出的一个技巧,当结果为负时,可以节省重复整个公式。

使用INDEX而不是OFFSET这样做会很好,而且时间允许我会看看是否可以这样做。

在这里输入图像说明

这里是INDEX版本 – 稍微简单些,因为范围的末尾只是B列中的当前单元格。

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(C1=0,--TEXT(SUM(INDEX(B:B,INT((ROW()-ROW($2:$2))/7)*7+2):B2)-40,"0;\0"),B2)) 

编辑

正如OP指出的那样,我忘记了工作时间为零的几天。 所以我的OFFSET公式应该是

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(SUM(OFFSET($C$2,INT((ROW()-ROW($2:$2))/7)*7,0,MOD(ROW()-ROW($2:$2),7)))=0,--TEXT(SUM(OFFSET($B$2,INT((ROW()-ROW($2:$2))/7)*7,0,MOD(ROW()-ROW($2:$2),7)+1))-40,"0;\0"),B2)) 

而我的INDEX公式应该是

 =IF(MOD(ROW()-ROW($2:$2),7)=0,0,IF(SUM(INDEX(C:C,INT((ROW()-ROW($2:$2))/7)*7+2):C1)=0,--TEXT(SUM(INDEX(B:B,INT((ROW()-ROW($2:$2))/7)*7+2):B2)-40,"0;\0"),B2)) 

在一周的第一天工作的加class时间总是设置为零(即使你input了50个小时),但实际上你每天工作时间不能超过24小时:如果你想改变为了让整个团队工作,我认为这是另一个问题。

在这里输入图像说明