全文约1712字;
阅读时间:约7分钟;
听完时间:约12分钟;
在设计表格版本的自动排程时,时间是一个非常关键的因素。首先,在确定了工作日历中每天的出勤工时后,需要创建一个辅助行来计算累计出勤工时。这个累计出勤工时将作为自动排程的时间依据。
累计工时是指将一段时间内每个时间点或时间段的工时逐个相加得到的总和。这种计算方式常用于跟踪项目进度、员工工作时间或者生产过程中的累积工作量。例如,如果你有一系列每天的工作小时数,那么累计工时就是到目前为止所有天数的工作小时数之和。
累计求和传统的表格计算方法如下:
第一天的工时是10小时,第二天的工时是11小时,第三天的工时是10小时。
那么累计工时可以这样计算:
第一天的累计工时 = 10
第二天的累计工时 = 第一天的累计工时 + 第二天的工时 = 10 + 11 = 21
第三天的累计工时 = 第二天的累计工时 + 第三天的工时 = 21 + 10 = 31
因此,最终的累计工时序列就是10、21、31。
在Excel&WPS中,你可以使用简单的公式来计算累计工时。假设你的原始工时数据在A列(从A2开始),你可以在B列(从B2开始)输入以下公式来计算累计工时:
B2: =A2
B3: =B2 + A3
然后向下拖动B3单元格的填充柄,即可自动填充剩余的累计工时。虽然这种方法可以计算出累计工时,但需要手动填充公式,并且不能自动扩展。
自动扩展为了实现自动扩展,可以利用动态数组公式。例如,在最新版本的Excel或WPS中,可以使用以下公式进行自动扩展求和:
=SCAN(0,P2#,SUM)/24
公式解释:
参数1(初始值):0
参数2(数组):P2#,这是出勤工时的动态数组区域,例如 {11, 0, 0, 11, 11, 8, 0}。
参数3(函数):SUM,是一个简写的方式,实际原理是用LAMBDA,来实现,这是一个自定义函数,用于对这些工时进行累计求和。
/24:将累计的工时总和转换为天数,以便与开工日期(如9月30日)进行运算。
这样,无论你在 P2# 中添加多少新的工时数据,该公式都会自动扩展并计算出累计的出勤天数。
把这一列设计成为时间格式,效果如下图所示:
拼接数据上面计算的累计工时结果没有包含初始的开工时间(即开始排程的时间9月30日)。实际上,这个累计工时表示的是完工时间。因此,我们需要将开工时间与累计工时拼接起来进行运算。可以使用以下公式:
=HSTACK(J2,J2+SCAN(0,P2#,SUM)/24)
公式解释:
J2 + SCAN(...):将初始的开工时间加上累计的天数,得到每个时间点的完工时间。
HSTACK(J2, ...):将初始的开工时间和每个时间点的完工时间水平拼接在一起。
通过这种方式,你可以得到一个包含初始开工时间和每个时间点完工时间的结果。
而这个时间将是后续设计全自动动态数组排程的一个关键字段。
条件之一实际上,编写自动排程的公式所涉及的函数并不多。如果不使用动态数组公式,实际用到的主要就是布尔逻辑函数(如IF、AND、OR)。难点在于这些函数的多层判断。例如以下这个公式就包含了四层IF嵌套:
=IF(OR($G5>=J$3,$H5<=I$3),"",IF(AND($G5>=I$3,$H5<J$3),$F5/24,IF(AND($G5>=I$3,$G5<J$3),J$3-$G5,IF(AND($H5>I$3,$H5<J$3),$H5-I$3,I$2/24)))*24*$E5)
在这个公式中:
最外层是 IF(OR(...), ...)。
OR函数内部有两个条件:$G5>=J$3 和 $H5<=I$3。
第二层IF内有一个 AND(...,...)。
第三层IF内也有一个 AND(...,...)。
第四层IF内同样有一个 AND(...,...)。
第五层IF内没有更多的AND或OR。
如果将每个OR和AND都算作单独的一层,那么总共有:
4层IF
1层OR
3层AND
加起来就是 4 + 1 + 3 = 8 层。但请注意,这种计数方法并不是标准做法。通常情况下,OR和AND被视为IF语句的一部分而不是独立的层级。因此,在标准情况下,我们仍然会说这个公式有4层IF嵌套。
在转成动态数组前,为了让大家更好的一理解,每个层级都单独出来,让大家理解。本案例中的第一层判断:
=N5#>=DROP(P3#,,1)
公式解释:
N5# 表示每个生产任务的开工时间。
DROP(P3#, , 1):P3# 是累计开工的工时,这个在昨天的公式中已经讲过。DROP 函数用来去除一列,即得到从第二天开始的累计工时。
该公式会检查每个生产任务的开工时间是否大于或等于从第二天开始的累计工时。如果条件满足(即开工时间大于或等于第二天的累计工时),则返回 TRUE;否则返回 FALSE。在这个逻辑下,TRUE 对应的情况不需要进一步排程,可以返回空值。而 FALSE 的情况则需要进入下一层级进行进一步判断。
整个公式的逻辑是:
如果每个生产任务的开工时间大于第二天的累计工时,则返回空值,意味着这个任务不需要再进行排程。例如,如果某个任务的开工时间是9月30日,而根据上述逻辑,这个时间点已经超过了从10月1日开始的累计工时,那么这个任务就可以被标记为空,表示它不需要再安排到后续的时间段内。这样可以确保任务按照正确的顺序和时间进行安排。
未完待续……