我有一张表,用于根据时间表计算我的税金,扣除额和401k。它还会计算我的PTO,病假和补偿日期(我没有加班,当我加班时,我会在年底时将这段时间作为额外的带薪休假)。我的问题是,根据时间表,我很难计算我的病假,其他所有时间都是小时工作或基于工资期。但是在病假的时候,我每年都会得到一个特定的数额。
基本上,我每年要10天(80小时)。所以我花了80个小时,除以26,这给了我每个工资期多少生病的时间。问题是,因为我得到每两周一次的薪酬,这实际上并不正确。因此,例如,这个月我有2个薪水,我得到了0.92天的病假,但我实际上应该得到1.在我有3个薪水的一年中的2个月里,我会得到1.38天的生病的时间,当然也不正确。
所以问题是我试图弄清楚如何编写一个公式来给我正确的天数。请参阅屏幕截图:
基本上在G6上,该公式采用了从前一年开始的病假天数(G39),并将当前的病假时间加入其中。它决定通过检查该支付期的总工资是否存在,然后将该数额乘以病假时间应计利率(G40),并将其除以8给我时间。
但我想做的是检查已经填写了多少个月并将其返回。所以在这个例子中May已经完成,所以它会返回1天。由于9月有3个工资期,你需要填写9月份的所有三个工资单,以便从4增加到5(可能,jun,jul,aug为4)。
有什么想法吗?我尝试过的所有事情都失败了。请记住,这些日期是动态的,明年当我更改纳税年度的开始日期时,有3个月的月份将更改为与该年度的实际付款期间相匹配。因此,这个公式实际上需要能够计算出任何一个月有3个工资期来提前病假计数,否则如果只有2个已经填补了这一点。
答案 0 :(得分:1)
尝试#2回答! > 8(
在一个单元格中执行此操作的结束方程式将会变得难看,但它会起作用。为了解释这一点,基本上我是如何开发它的,我将把它分解成几部分。最后,零件将被替换为大方程。
我做的第一件事是确定上次填充的行,或者根据注释,列P的最后一行的值大于0.为了确定这一点,我暂时使用了聚合函数T15的单元格(是的,在电子表格的中间,但最后不重要):
=AGGREGATE(14,6,(P5:P30>0)*(ROW(P5:P30)-ROW(P5)+1),1)
要打破此功能:
现在重要的是将大于0的数组与行号数组相乘时会发生什么。你最终只得到P值大于0的行号。当我们排序并要求最大数字时,我们得到你已经完成的最后一行。可以使用的东西。
所以现在我们可以查看完成的最后一个日期,做一些检查以确定它是否在月末,并计算出多少病假。丑陋的公式开始于:
=IF(MONTH(INDEX(I5:I30,T15))=MONTH(INDEX(I5:I30,T15)+14),MONTH(INDEX(I5:I30,T15))-1,MONTH(INDEX(I5:I30,T15)))
这里的逻辑测试是找到我们的最后填写日期和未来14天的日期是否仍然是同一个月。如果他们是同一个月,那么你还没有在月底,那里只能在病假中赚取前一个月的数字。因此,这部分将告诉我们上个月的病假日数:
MONTH(INDEX(I5:I30,T15))-1
现在,如果将来14天的日期不是同一个月,那么我们知道该月的最后一个条目已经完成,因此我们在病假中累计了该月份的数字并使用了基本相同的公式:
MONTH(INDEX(I5:I30,T15))-1
我可以看到我们已经4次调用T15单元格来确定我们是否减去1或0.虽然IF公式可能与您的思维过程更加一致,但我们可以重新排列事物但仍能得到相同的结果但是缩短公式,将对单元格t15的调用减少1并将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))
尚未完成。这只会告诉你今年累积的天数。不是你真正想知道的。你需要把它转换成几小时。它还需要减少使用的病假天数。以下需要添加到上面的大丑:
这导致:
=(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)
现在我在测试期间注意到如果电子表格中没有条目,那么最后一个条目的行变为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))
锦上添花加重了去年累积的病假天数。由于我不确定病假率和病假如何一起工作,我将把这个计算留给你,并且只是让你知道,无论从前一年结转的是什么数字,只需在最后一个之后将其添加到上面的公式中)
这是我的测试床,显示了概念证明:
警告:此方法## WILL ##会产生错误的结果,因为付款期限= 0,最后一个日期之前支付期间> 0,请参阅下面的示例: