Excel中如何在没有循环引用的情况下动态计算剩余加班时间和已使用加班时间?
How to dynamically calculate the overtime left and the overtime used without a circular reference in Excel?
目标是修复此 "two weeks pay" 输入工作簿中我的逻辑中的循环引用。
这是一个临时的 sheet,当人们不在办公室并且无法访问系统时。
也就是说,sheet 仍然应该为他们提供准确的数据。
有 26 个 sheet 包含员工完成的时间,例如,以典型的格式,每个 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 |
+-----------+----------+--------+----------+--------+-------+------+
| ... | .... | .... | .... | .... | .... | .... |
+-----------+----------+--------+----------+--------+-------+------+
然后在另一个 sheet 上,必须计算支付的金额(每 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 | ... | ... | ... | .... | | | |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
在上面的 table 中,工资 #2 得到了 70 小时的报酬,但是这个人只做了 65 小时,并且使用了过去两周加班的 5 小时。
A1:E4
连接在一起,G1:G2
本身就是数据,与工资号码或 sheet 中的其他数据无关(换句话说,只有一个单元格包含总加班时间left 和 F 用于分隔两个 tables)。
G2
目前有 0:00 因为 5:00 它本来可以用来完成第二次付款。
工时 单元格 (B
) 包含此公式:
=IF($E>=2.91666666666667,2.91666666666667,IF((2.91666666666667- $E)<=$G;2.91666666666667,$E+$D))
- 第1步[条件]:如果这两周的总工作时间大于或等于70小时(此处使用2.91666666666667而不是“70:00 " 使比较有效);
- 步骤 1.1 [true] : 然后在单元格中输入“70:00”,因为每两周最多 70 小时(这很好,因为我们有另一个单元格存储完成的加班(在本例中,
C
));
- 步骤 1.2 [false->condition] : 否则,那两周的总工作时间少于 70 小时,因此检查 70 小时是否减去总工作时间两周少于剩余的总加班时间(用于检查是否有剩余的加班时间可以用来使工资最高,最多可以达到70小时);
- 步骤 1.2.1 [true] : 如果是,请输入 70 小时,因为我们将使用剩余的部分加班费来完成这两周;
- Step 1.2.2 [false] : 否则,将那两周的总工作时间加上那一周的已用加班时间(这个单元格后面会和她一起解释公式,此步骤适用于剩余加班时间,但不足以使其达到 70 小时,因此我们输入最终的时间。
这里的重要部分是记住 B
需要 D
,因此我解释了它的公式。
Overtime (C
) 和 "Total hours worked" (E
) 单元格包含基本公式,可以给出超过 70 的时间小时或总工作小时数;不用在这里解释了,很管用
已用加班 单元格 (D
) 变得棘手。为了解释它,我们需要知道 G2
.
是怎么回事
剩余总加班时间 单元格 (G2
) 是总加班时间减去 D
中所有单元格(已加班)的总和。
它的目的是获取剩余加班费的最新值。
返回使用加班。
您可能会在这里开始看到循环引用; D
需要 G2
才能工作,G2
是 D
中所有单元格的总和(在 table 范围内,不是全部)。
该公式需要剩余多少加班时间的概念,以便它可以检查我们是否可以使用一些。
这是公式:
=IF($E>=2.91666666666667,"00:00",IF((2.91666666666667-$E)<=$G,(2.91666666666667-$E),IF(($G+$E)<=2.91666666666667,$G,"00:00")))
- 第1步[条件]:如果这两周的总工作时间大于或等于70小时;
- 步骤1.1 [true] : 然后输入0小时,因为工资已经达到70小时的最大值;
- 步骤 1.2 [false->条件] : 否则,这两周的总工作时间低于 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 小时,因为我们不会将加班费添加到此工资中,因为没有加班费了。
我怎么能在没有循环引用的情况下同时拥有准确的剩余加班时间和使用的加班时间呢?
如果每一行都有该支付期后剩余总加班时间的最新值怎么办?
G2 的公式:=C2-D2
那么之后的每个G格只需要加上上一个支付周期剩余的加班费+加班费-已用加班费:
G3:=G2+C3-D3
从那里开始。
目标是修复此 "two weeks pay" 输入工作簿中我的逻辑中的循环引用。 这是一个临时的 sheet,当人们不在办公室并且无法访问系统时。 也就是说,sheet 仍然应该为他们提供准确的数据。
有 26 个 sheet 包含员工完成的时间,例如,以典型的格式,每个 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 |
+-----------+----------+--------+----------+--------+-------+------+
| ... | .... | .... | .... | .... | .... | .... |
+-----------+----------+--------+----------+--------+-------+------+
然后在另一个 sheet 上,必须计算支付的金额(每 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 | ... | ... | ... | .... | | | |
+-------+------------+----------+---------------+-----------------------+-------+---------------------+
在上面的 table 中,工资 #2 得到了 70 小时的报酬,但是这个人只做了 65 小时,并且使用了过去两周加班的 5 小时。
A1:E4
连接在一起,G1:G2
本身就是数据,与工资号码或 sheet 中的其他数据无关(换句话说,只有一个单元格包含总加班时间left 和 F 用于分隔两个 tables)。
G2
目前有 0:00 因为 5:00 它本来可以用来完成第二次付款。
工时 单元格 (B
) 包含此公式:
=IF($E>=2.91666666666667,2.91666666666667,IF((2.91666666666667- $E)<=$G;2.91666666666667,$E+$D))
- 第1步[条件]:如果这两周的总工作时间大于或等于70小时(此处使用2.91666666666667而不是“70:00 " 使比较有效);
- 步骤 1.1 [true] : 然后在单元格中输入“70:00”,因为每两周最多 70 小时(这很好,因为我们有另一个单元格存储完成的加班(在本例中,
C
)); - 步骤 1.2 [false->condition] : 否则,那两周的总工作时间少于 70 小时,因此检查 70 小时是否减去总工作时间两周少于剩余的总加班时间(用于检查是否有剩余的加班时间可以用来使工资最高,最多可以达到70小时);
- 步骤 1.2.1 [true] : 如果是,请输入 70 小时,因为我们将使用剩余的部分加班费来完成这两周;
- Step 1.2.2 [false] : 否则,将那两周的总工作时间加上那一周的已用加班时间(这个单元格后面会和她一起解释公式,此步骤适用于剩余加班时间,但不足以使其达到 70 小时,因此我们输入最终的时间。
- 步骤 1.1 [true] : 然后在单元格中输入“70:00”,因为每两周最多 70 小时(这很好,因为我们有另一个单元格存储完成的加班(在本例中,
这里的重要部分是记住 B
需要 D
,因此我解释了它的公式。
Overtime (C
) 和 "Total hours worked" (E
) 单元格包含基本公式,可以给出超过 70 的时间小时或总工作小时数;不用在这里解释了,很管用
已用加班 单元格 (D
) 变得棘手。为了解释它,我们需要知道 G2
.
剩余总加班时间 单元格 (G2
) 是总加班时间减去 D
中所有单元格(已加班)的总和。
它的目的是获取剩余加班费的最新值。
返回使用加班。
您可能会在这里开始看到循环引用; D
需要 G2
才能工作,G2
是 D
中所有单元格的总和(在 table 范围内,不是全部)。
该公式需要剩余多少加班时间的概念,以便它可以检查我们是否可以使用一些。
这是公式:
=IF($E>=2.91666666666667,"00:00",IF((2.91666666666667-$E)<=$G,(2.91666666666667-$E),IF(($G+$E)<=2.91666666666667,$G,"00:00")))
- 第1步[条件]:如果这两周的总工作时间大于或等于70小时;
- 步骤1.1 [true] : 然后输入0小时,因为工资已经达到70小时的最大值;
- 步骤 1.2 [false->条件] : 否则,这两周的总工作时间低于 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 小时,因为我们不会将加班费添加到此工资中,因为没有加班费了。
我怎么能在没有循环引用的情况下同时拥有准确的剩余加班时间和使用的加班时间呢?
如果每一行都有该支付期后剩余总加班时间的最新值怎么办?
G2 的公式:=C2-D2
那么之后的每个G格只需要加上上一个支付周期剩余的加班费+加班费-已用加班费:
G3:=G2+C3-D3
从那里开始。