我在计算加班费。如果小时数大于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
)。我需要C4
到B2
到increment
到B9
等,我需要B16
增加 C4
。即B5
& B7
,C6
& 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))
答案 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这样做会很好,如果时间允许,我会看看是否可以这样做。
这是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小时:如果你想改变球门柱,以便它适用于整个团队,我想这将是另一个问题。