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

时间:2017-12-15 07:49:13

标签: excel excel-formula

我在计算加班费。如果小时数大于40,则减去40.足够简单。但是,使用单一复制/粘贴公式,我想将其分解,以显示每天的加班时数星期。这是一个直观的例子:

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 |

我的重大问题是,我并不总是希望从B2& C2开始,我不想总是在B5& {{1因为一周重新开始,我需要知道我当前的单元格(C4)和每周下一列-1行中的单元格(B5)。我需要C4B2incrementB9等,我需要B16增加 C4。即B5& B7C6& B6等。我认为C5可行,但我不知道怎么做到工作,以便我可以使用一个公式而不是一个公式的52个衍生物。

到目前为止,我能想到的最好的公式是: OFFSET 其中仅计算整周的总加班时间和静态=SUM(OFFSET($B$2,(ROW()-2)*7,0,7,1),-40)

ANSWERED: 感谢@TomSharpe。这些都是完美的。选择你最喜欢的人:

OFFSET

B2

INDEX

=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))

1 个答案:

答案 0 :(得分:1)

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

=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这样做会很好,如果时间允许,我会看看是否可以这样做。

enter image description here

这是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))

在一周的第一天工作的加班时间始终设置为零(即使您输入50小时),理由是实际上您每天工作超过24小时:如果你想改变球门柱,以便它适用于整个团队,我想这将是另一个问题。

enter image description here