复杂的Excel方程与多个条件

我有一张表格,用来根据时间表计算我的税款,扣款和401k。 它还计算我的PTO,病假和补偿天数(我没有加class,当我加class时,我把这个时间作为额外的rest日rest)。 我的问题是,在时间表中,很难计算我的病假,其他时间都是按小时计或按照工资期计算的。 但是生病的时候,我每年都得到一笔特定的金额。

基本上,我每年得到10天(80小时)。 所以我花了80个小时,把它除以26,这给了我多less病假时间我得到每个工资。 问题是,由于我得到了双周的付款,这实际上并不正确。 举个例子,这个月我有两个工资,我会得到.92天的病假时间,但实际上我应该得到1.在一年中有三个工资的两个月里,我会得到1.38天的病假时间,这当然也是不正确的。

所以问题是我想弄清楚如何写一个公式给我正确的天数。 参考截图:

在这里输入图像说明

因此,在G6上,这个公式将上一年(G39)的病假时间加上去,并把现在的病假时间加上去。 它决定通过检查这个支付期的总工资是否在那里,然后把这个数额乘以疾病时间累积率(G40),再除以8来给我这个日子。

但是我想要做的是检查已经填写了多less个月,然后返回。 所以在这个例子中May已经完成了,所以它会返回1天。 由于9月有3个工资期,你需要把9月份的所有工资都从4增加到5(5月,6月,8月,4月)。

有任何想法吗? 我试图做到这一切,只是失败。 请记住,这些date是dynamic的,明年,当我更改纳税年度的开始date时,有3个月的月份将会改变,以符合当年的实际支付期。 所以这个公式需要实际上能够算出,任何一个月有三个工资期提前病假计数,否则如果只有两个已经被填补的话就这样做。

尝试#2回答! > 8(

在一个单元格中完成这一切的最终方程将会变得很难看,但它会起作用。 为了解释这一点,基本上我是如何开发它的,我将把它分解成几部分。 最后,这些部分将被replace成大的等式。

我做的第一件事就是确定最后一个填满的行,或者根据注释,P列的最后一行的值大于0。为了确定这个,我在T15的一个临时单元中使用了聚合函数(是的,在你的电子表格的中间,但最终并不重要):

 =AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1) 

打破这个function:

  • 14告诉它我们要做一个数组types的计算,从最大到最小sorting数组。
  • 6告诉它忽略错误
  • (P5:P30> 0)告诉它build立一个大于0的真(或1)和假(或0)数组
  • (ROW(P5:P30)-ROW(P5)+1)生成列出行号的数组
  • 1告诉它返回数组中的最大值,如果它是第二大的话。

现在,重要的是当您将大于0的数组与行号数组相乘时会发生什么。 你得到的结果只有P值大于0的行号。当我们sorting并询问最大的数字时,我们得到你已经完成的最后一行。 一些工作。

那么现在我们可以查看完成的最后一个date,做一些检查,看看它是否在月底结束,并计算出多less病假。 丑陋的公式开始如下:

 =IF(MONTH(INDEX(I5:I30,T15))=MONTH(INDEX(I5:I30,T15)+14),MONTH(INDEX(I5:I30,T15))-1,MONTH(INDEX(I5:I30,T15))) 

这里的逻辑testing是find我们是否上次填写的date和未来14天的date仍然是同一个月份。 如果他们是同一个月,那么你还没有到月底,那么在病假期间只能赚到上个月的数字。 因此,这部分将告诉我们上个月的病假:

 MONTH(INDEX(I5:I30,T15))-1 

现在,如果未来14天的date不是同一个月,那么我们知道这个月的最后一个入口已经完成了,因此我们在病假期间累计了这个月份的数字,并使用基本相同的公式:

 MONTH(INDEX(I5:I30,T15))-1 

以及我可以看到,我们已经调用了T15单元四次,以确定是否减去1或0.虽然IF公式可能更符合您的思维过程,但是我们可以重新排列并仍然得到相同的结果,但是缩短公式,将对小区t15的呼叫减less1,并将IF全部放在一起。 这只适用于因为我们正在处理1和0这也是真实的和错误的。

 =MONTH(INDEX(I5:I30,T15))-(MONTH(INDEX(I5:I30,T15))=MONTH(INDEX(I5:I30,T15)+14)) 

现在让我们绕过那T15的计算,并回到上面的月份公式中得到:

 =MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))-(MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))=MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1))+14)) 

还没做完。 这只会告诉你今年累积的天数。 不是你真正想知道的。 您需要将其转换为小时。 还需要减less所使用的病假天数。 以下需要添加到以上的大丑:

  • * 8 8病假到病假
  • -sum($ L $ 5:$ L $ 30)来解释病态的使用时间

这导致:

 =(MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))-(MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))=MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1))+14)))*8-sum($L$5:$L$30) 

现在我在testing中注意到,如果电子表格中没有条目,那么最后一个条目的行变成0,这是不可接受的,因为它会导致一些奇怪的结果。 所以我们将这个整个公式包含在一个小错误捕获器中,以确保0没有完成支付周期时的结果。

 =if(sum(P5:P30)=0,0,(MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))-(MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)))=MONTH(INDEX(I5:I30,AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1))+14)))*8-sum($L$5:$L$30)) 

锦上添花的是上一年的累计病假。 由于我不确定病态和病态如何协同工作,所以我将把这个计算留给你,只是让你知道,无论前一年有多less数字,只要在最后一个数字后面加上上面的公式即可) 。

这里是我的testing床显示概念的certificate:

概念验证

警告:此方法## WILL ##在支付期> 0的最后date之前支付期间的结果为= 0,请参阅下面的示例:

问题与方法