【问题标题】:Complicated excel equation with multiple conditions具有多个条件的复杂 excel 方程
【发布时间】:2016-05-08 19:36:24
【问题描述】:

我有一张表格,用于根据时间表计算我的税款、扣除额和 401k。它还计算我的 PTO、病假和补偿天数(我没有加班,当我加班时,我会在年底将那个时间作为额外的带薪休假)。我的问题是,使用时间表,很难计算我的病假天数,所有其他时间都是每小时或基于工资期。但是,我每年都会得到一定数量的病假。

基本上,我每年有 10 天(80 小时)。所以我用 80 小时除以 26,这就是我每个工资期的病假时间。问题是,因为我得到的是双周工资,这实际上是不正确的。例如,这个月我有 2 份薪水,我会得到 0.92 天的病假,但实际上我应该得到 1 天。在一年中有 3 份薪水的 2 个月里,我会得到 1.38 天的病假,这当然也不正确。

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

因此,基本上在 G6 上,该公式采用上一年 (G39) 的滚动病假天数并将当前病假时间添加到其中。它决定通过检查该支付期间的总工资是否存在,然后将该金额乘以病假时间应计率 (G40),再除以 8 得到天数。

但我想做的是检查填写了多少个月并将其返回。所以在这个例子中 May 已经完成,所以它会返回 1 天。由于 9 月有 3 个支付期,因此您需要填写所有 3 份 9 月的薪水,才能将其从 4 增加到 5(5 月、6 月、7 月、8 月为 4)。

有什么想法吗?我试图做的一切都失败了。请记住,这些日期是动态的,明年当我更改纳税年度的开始日期时,有 3 个月的月份将更改以匹配该年的实际支付期。因此,这个公式实际上需要能够计算出任何一个月有 3 个支付周期来提前计算病假天数,否则如果只有 2 个已被填满,则要这样做。

【问题讨论】:

  • 您是否可以请病假,或者当您生病时,您会休息一整天?仅仅试图了解这并不重要,您是否真的在跟踪几天或几小时。只是为了更清楚地了解。如果在您开始工作前的第二天,您生病了并且在接下来的两周内无法获得佣金,那么您的病假时间将不会得到任何报酬?或者你会得到报酬,但在今年剩下的时间里一无所有?
  • 我们可以做几个小时,但通常我会休息一整天。但有时我可能会有约会或其他事情,我只需花 2-3 个小时就可以上班。
  • 我知道您描述了按支付期累计您的病假福利,但我询问第二天病假情况的部分原因是,有些公司在一年,您可以使用 80 小时。在这种情况下,您的病假计算将只是 =80-sum(L5:L30) 加上前几年的结转,因为您可以这样做。并非所有公司都这样做。另外,您对可以累积的病假天数有上限吗?有些公司不允许累积超过最大值的假期、病假等。
  • 我不清楚的一件事是计划如何按月累积您的病假。 80小时是10个病假。您描述了每月累积 1 天,但一年有 12 个月。所以多解释一下这个过程也可能会有所帮助。
  • 当我说 80 小时我说错了,80 小时是为了别的东西。实际上是 96 天。我们每个月只有 1 天病假。无需担心最大值,我们的最大值可以转换为 PTO 或退休,我将分别设置这两者。我们每个月只有 1 天(8 小时)。

标签: excel excel-formula countif


【解决方案1】:

尝试 #2 回答! >8(

在一个单元格中完成这一切的最终方程式会变得丑陋,但它会起作用。为了解释这一点以及我是如何开发它的,我将把它分解成几个部分。最后,这些部分将被重新代入大方程。

我做的第一件事是确定最后填充了哪一行,或者根据 cmets,列 P 的最后一行的值大于 0。为了确定这一点,我临时使用了聚合函数T15 的单元格(是的,在您的电子表格的中间,但最终无关紧要):

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

分解这个函数:

  • 14 告诉它我们要进行数组类型计算,将数组从大到小排序。
  • 6 告诉它忽略错误
  • (P5:P30>0) 告诉它构建一个大于 0 的真(或 1)和假(或 0)单元格数组
  • (ROW(P5:P30)-ROW(P5)+1) 生成列出行号的数组
  • 1 告诉它返回数组中的最大值,如果它是第二大的 2。

现在重要的是当您将大于 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

好吧,我可以看到我们已经调用单元格 T15 4 次以确定我们是减去 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))

还没有完成。这只告诉你今年累积的天数。不是你真正想知道的。您需要将其转换为小时。它还需要通过使用的病假天数来减少。上面的大丑需要添加以下内容:

  • *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)

现在我在测试期间确实注意到,如果电子表格中没有条目,那么最后一个条目的行将变为 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,请参见下面的示例:

【讨论】:

  • 是的,当我使用它时只填写了 1 个月,它说我有 40 个病假
  • @Flynn 第一个月还是第一个月后你有时填写一个月。
  • @Flynn 根据答案最后的警告,如果您只填写可能的时间段而没有填写之前的时间段,它会给您一个错误的数字。这是因为整个前提是填写的最后一行意味着截至年初的所有其他行也已填写。所以如果只填may,还是假设jan、feb、mar、april也都填好了。
  • 为了找出最早的入口,我们可以用聚合函数反转这个过程,找到最小的入口值。然后计算到该行的月数并减去这些病假天数。不过,这带来了更多问题。如果您今年的第一次入职是一个月的一部分,那么假设您有 17/04/16 和 17/04/30 的工作时间,那么由于您没有在 17/ 04/02 期间?
  • 我刚开始在那里工作,所以上个月之前没有工作时间
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2017-03-10
  • 2019-09-21
相关资源
最近更新 更多