Excel 求和范围和减去子范围之和

Excel 求和范围和减去子范围之和,excel,excel-formula,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:C

我在计算加班时间。如果小时数大于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
&
C4
结束,因为一周开始了,我需要知道我的当前单元格(
B5
)和下一列的一周内的单元格-每天一行(
C4
)。我需要
B2
increment
B9
B16
等,我需要
C4
B5
增加。i、 e.
B7
C6
B6
C5
等等。我认为
OFFSET
可以工作,但我不知道如何使它工作,以便我可以使用一个公式,而不是一个公式的52个导数

到目前为止,我能想到的最好的公式是:
=总额(抵销($B$2,(行()-2)*7,0,7,1),-40)
它只计算一整周的总加班时间和statics
B2

回答: 多亏了@TomSharpe。这两个都很完美。选择你最喜欢的:

偏移量

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

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

使用文本函数是@Barry Houdini建议的一个技巧,它可以在结果为负时避免重复整个公式

这将是很好的使用索引,而不是偏移量和时间允许,我会看看它是否可以这样做

这是索引版本-稍微简单一点,因为范围的末尾就是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所指出的,我已经忘记了零小时工作的日子。所以我的补偿公式应该是

=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))
我的指数公式应该是

=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))
每周第一天的加班时间总是设置为零(即使你输入,比如说50小时),因为实际上你一天的工作时间不能超过24小时:如果你想改变球门柱,使其适用于整个团队,我想那将是另一个问题


日期是否始终是天和数字,第8天是否在第7天之后?还是从第一天开始?或者该列是否包含实际日期?它将采用
mm/dd/yyyy
格式。看起来不错,但我真的不明白整个过程是如何工作的。请问我该去哪里更好地了解这是如何工作的?对于第2行,我开始计算,当我看到SUM(INDEX(B:B,{2}):B3)这样的语法时,我感到困惑-40INDEX返回一个引用,所以可以使用它,所以使用普通符号指定范围的任意一端:。在文档末尾有一个例子=SUM(B2:INDEX(A2:C6,5,2)),其计算结果为=SUM(B2:B6)但他们并没有明确说明这有多有用。我想你可以这样看,但在我的回答中,范围中只有一列,因此范围的开始是表达式INT((row()…等)给出的行与范围B:B中的列1的交点,该列可以归结为B2,范围的结束(如果您在第3行对其进行评估)只是B3。这似乎有效,但有一些纠结。请看《让我们忘记一秒钟内每天工作时间不能超过24小时》中的第5行到第8行。即使经过这一步,我仍然不明白当输入0时如何分配加班。@TomSharpeYou是对的,我确实需要按照您所说的,将本周所有加班时间相加在你的问题中,不要只看前一天,因此,如果前一天的加班时间为零,那么我关于加班时间只是工作时间的假设是错误的(我忘记了没有工作的日子)。