【发布时间】:2019-12-19 20:30:27
【问题描述】:
目标是在这个“两周工资”输入工作簿中修复我的逻辑中的循环引用。 当人们不在办公室并且无法访问系统时,这是一张临时表。 也就是说,该表仍应为他们提供准确的数据。
有 26 张表,其中包含员工完成的时间,例如,采用典型格式,每张 2 周(总共一年)。 剔除本次查询的所有格式和无用信息,它们看起来有点像这样(带有正确的日期):
+-----------+----------+--------+----------+--------+-------+------+
| Date | AM start | AM end | PM start | PM end | total | over |
+-----------+----------+--------+----------+--------+-------+------+
| Monday | 8:00 | 12:00 | 13:00 | 16:00 | 7:00 | 0:00 |
+-----------+----------+--------+----------+--------+-------+------+
| Tuesday | 8:00 | 12:00 | 13:00 | 15:00 | 6:00 | 0:00 |
+-----------+----------+--------+----------+--------+-------+------+
| Wednesday | 8:00 | 12:00 | 13:00 | 17:00 | 8:00 | 1:00 |
+-----------+----------+--------+----------+--------+-------+------+
| ... | .... | .... | .... | .... | .... | .... |
+-----------+----------+--------+----------+--------+-------+------+
然后在另一张纸上,需要计算支付金额(每 2 周最多 70 小时)、必须支付的加班费等。
A B C D E F G
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
1 | Pay # | Hours paid | Overtime | Used overtime | Total hours worked | | Total overtime left |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
2 | 1 | 70:00 | 5:00 | 0:00 | 75:00 | | 0:00 |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
3 | 2 | 70:00 | 0:00 | 5:00 | 65:00 | | |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
4 | ... | ... | ... | .... | | | |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
在上表中,工资#2 获得了 70 小时的工资,但该人只工作了 65 小时,并使用了过去两周加班时间中的 5 小时。
A1:E4 连接在一起,G1:G2 本身是数据,与该表中的工资数字或其他数据无关(换句话说,只有一个单元格包含剩余的总加班时间,而 F 用于分隔两者表)。
G2 目前有 0:00,因为它本应用于完成第二次付款的 5:00。
支付小时数单元格 (B) 包含以下公式:
=IF($E$2>=2.91666666666667,2.91666666666667,IF((2.91666666666667- $E$2)<=$G$2;2.91666666666667,$E$2+$D$2))
-
Step 1 [condition]:如果这两周的总工作时间大于等于70小时(这里使用2.91666666666667代替“70:00”进行比较);
-
步骤 1.1 [true]:然后在单元格中输入“70:00”,因为每两周最多有 70 小时(这很好,因为我们有另一个单元格存储加班完成(在本例中) ,
C)); -
步骤 1.2 [false->condition] :否则,该两周的总工作时间低于 70 小时,因此请检查 70 小时减去该两周的总工作时间是否低于总小时数剩余加班时间(用于查看本次是否有剩余加班时间可以使用,使工资最高可以达到70小时);
- 步骤 1.2.1 [true]:如果是,请投入 70 小时,因为我们将使用剩余的部分加班费来完成这两周;
- 步骤 1.2.2 [false] :否则,将这两周的总工作时间添加到该周使用的加班时间中(此单元格稍后用她的公式解释,此步骤适用于当有剩下的加班时间,但还不足以让它达到 70 小时,所以我们把它最终的时间量)。
-
步骤 1.1 [true]:然后在单元格中输入“70:00”,因为每两周最多有 70 小时(这很好,因为我们有另一个单元格存储加班完成(在本例中) ,
这里重要的部分是要记住B 需要D,因此我解释了它的公式。
加班时间 (C) 和“总工作时间” (E) 单元格包含基本公式,它们要么给出超过 70 小时的时间量,要么给出总工作小时数;这里不用解释了,可以的。
Used overtime 单元格 (D) 是比较棘手的地方。为了解释它,我们需要知道G2 是怎么回事。
剩余的总加班时间单元格 (G2) 是加班时间的总和减去 D 中所有单元格的总和(已使用加班时间)。
其目的是获取剩余加班费的最新值。
返回加班时间。
您可能开始在这里看到循环引用; D 需要 G2 才能工作,G2 是 D 中所有单元格的总和(在表格范围内,不是全部)。
该公式需要剩余加班时间的概念,因此它可以检查我们是否可以使用一些。
这是公式:
=IF($E$2>=2.91666666666667,"00:00",IF((2.91666666666667-$E$2)<=$G$2,(2.91666666666667-$E$2),IF(($G$2+$E$2)<=2.91666666666667,$G$2,"00:00")))
- 第 1 步 [条件]:如果这两周的总工作时间大于或等于 70 小时;
- 第 1.1 步 [true]:然后输入 0 小时,因为该工资已经达到最长 70 小时;
-
步骤 1.2 [false->condition] :否则,这两周的总工作时间低于 70 小时,如果我们还有加班费可能会增加,因此请检查 70 小时是否减去这两周的总工作时间(我们可以从剩余的加班时间中增加的时间量)低于或等于剩余的加班费总额;
- 第 1.2.1 步 [true]:然后将 70 小时减去那两周的总工作时间(我们将从剩余的加班时间中添加的时间增加到最多70 小时);
-
Step 1.2.2 [false->condition] : 否则,检查剩余加班时间加到两周工作总时数中是否小于或等于 70 小时(如果是,则这意味着我们可以在不超过 70 小时的情况下添加所有剩余的加班时间);
- 步骤 1.2.2.1 [true]:如果是,则该值是剩余的总加班时间,因为它会使那两周的总工作时间仍然低于最大值,但要支付加班费待付;
- 步骤 1.2.2.2 [false]:否则,将 0 小时,因为我们不会在此工资中添加加班,因为没有加班需要添加。
我如何既能得到准确的加班时间,又能在没有循环引用的情况下动态计算自己的加班时间?
【问题讨论】:
-
上述星期三的上午和下午开始/结束时间与星期一相同,但时间总计为 8:00,Over=1:00。星期三的下午结束时间应该是 17:00 吗?
-
@PeterT 你是对的,写的时候打错了。我会将其编辑为正确的结束时间。谢谢。
标签: excel excel-formula logic circular-reference