此问题有很多可能的组合:
- 相对于工作周,工作日和午餐到达的时间
- 是否需要零件
- 相对于工作周,工作日,午餐和电话到达提出零件请求时
- 零件到达是跨越一个周末还是几个周末(如果没有)
- 技术派遣与呼叫到达和/或技术派遣与部件到达是否跨越一个周末
- 以上所有可能的组合和排列。
我看不到使用通用公式来计算事物的方法。看起来对于每种响应方案,您都需要准确地建模每个活动相对于工作周,工作日和午餐的发生时间,并添加和减去相关时间。规则变得非常复杂,并且无需处理假期,而假期将增加额外的维度。
从技术上讲,可以使用一个“公式”来执行此操作,但是它又长又复杂,以至于您永远无法对它进行故障排除或修改,也无法在事后理解它。因此,此答案将使用一堆构建块列(其中一些包含一些长公式),并且这些列会混合,匹配和重用。它将为修改事物提供基础。
我创建了我认为可以测试的最极端,最复杂的场景。该解决方案可能过于复杂,因为在现实生活中不会发生某些情况。欢迎您简化它。
构件块列
日期和时间
Excel将日期/时间存储为一个数字。整数部分是天数,小数部分是时间,是一天的小数部分。公式的各个部分只需要使用几天或几次,因此前八个构建基块将它们分开。列K
通过N
是列日C
通过F
和列O
经过R
的时间。格式化这些列的方式并没有多大区别。公式将得出数字(日期将是不到42000的数字,时间将是小数部分-中午或12小时将是0.5)。假设您的数据从第2行开始
K2: =INT(C2)
L2: =INT(D2)
M2: =INT(E2)
N2: =INT(F2)
O2: =MOD(C2,1)
P2: =MOD(D2,1)
Q2: =MOD(E2,1)
R2: =MOD(F2,1)
原始工期和零件订购时间
有几种处理零件订购时间的方法。一种是计算持续时间并将其减去。在此问题中,这又增加了另一种复杂性,因为您不想在午餐或周末重复计算排除项。我使用了另一种方法,在订购零件的情况下将问题分为两部分:订购零件之前会发生什么以及收到零件后会发生什么;在此之间的所有时间都被忽略。
这需要三个持续时间:
- 致电收据以订购零件
- 零件收据到技术调度
- 在不需要零件的情况下,将回执接到技术调度
一些公式需要实际经过的时间,而其他公式则需要与天无关的天数,因此有六个构造块列。这些持续时间减去任何周末。我假设在呼叫接收和下达零件订单之间可能会发生周末(呼叫在星期五的一天结束时到达),或者在星期五结束时的零件接收与星期一的技术发货之间。S
通过U
的列是实际经过的时间。V
通过X
的列是天数。
S2: =D2-C2-IF(WEEKDAY(C2,2)+L2-K2>5,2,0)
T2: =F2-E2-IF(N2-M2+WEEKDAY(E2,2)>5,2,0)
U2: =F2-C2-INT((N2-K2+WEEKDAY(C2,2))/7)*2
V2: =L2-K2-IF(WEEKDAY(C2,2)+L2-K2>5,2,0)
W2: =N2-M2-IF(N2-M2+WEEKDAY(E2,2)>5,2,0)
X2: =N2-K2-INT((N2-K2+WEEKDAY(C2,2))/7)*2
请注意,对于“无假期”情况,周末使用了不同的调整。这是因为我的极端测试用例包括:在呼叫到达和零件订购之间的一个周末,零件到达的长时间延迟,以及在零件到达和技术派遣之间的另一个周末。对于“无条件”场景,我只使用了整个时间,包括两个周末,因此需要使用公式来处理。如果您要解雇需要两周才能响应电话的任何技术人员,则如果希望保持一致性,可以将其更改为其他公式中使用的单周末调整类型。
合格时间
下一步是处理工作日时间表。我把问题分成三个间隔。
- 第一天(相关时间从呼叫到达开始,并且可以有各种终点)
- 最后一天(相关时间可以有不同的起点并以技术派遣结束)
- 间隔天数(这些都是整天,周末需要调整)
所有活动都可能在一天或两天内发生,因此公式需要测试特定间隔是否存在以及是否尚未考虑。取决于是否需要订购零件,公式有所不同,因此每个间隔都有两个公式(所需零件是每个组中的第一个)。
First Day
Y2: =IF(L2=K2,IF(M2=K2,IF(N2=K2,R2-Q2+P2,$J$3-Q2+P2),P2),$J$3)-O2
Z2: =IF(N2=K2,R2,$J$3)-O2
Last Day
AA2: =IF(M2=N2,IF(L2=N2,IF(K2=N2,0,P2-$J$2+R2-Q2),R2-Q2),R2-$J$2)
AB2: =IF(K2=N2,0,R2-$J$2)
Days Between
AC2: =IF(L2=K2,0,IF(M2=L2,IF(N2=L2,0,$J$3-Q2+P2-$J$2+(L2-K2-1-INT((L2-K2+WEEKDAY(C2,2))/7)*2)*
($J$3-$J$2)),P2-$J$2+(L2-K2-1-INT((L2-K2+WEEKDAY(C2,2))/7)*2)*($J$3-$J$2)))+
IF(M2=L2,0,IF(N2=M2,0,$J$3-Q2+(N2-M2-1-INT((N2-M2+WEEKDAY(E2,2))/7)*2)*($J$3-$J$2)))
AD2: =IF(N2-K2>1,N2-K2-1-INT((N2-K2+WEEKDAY(C2,2))/7)*2,0)*($J$3-$J$2)
请注意,为了便于阅读,我拆分了长公式。如果要复制和粘贴,则需要删除回车符和多余的空格。
午休
时间午休时间调整将确定哪些日期有适用的午休时间,对它们进行计数,然后将计数乘以存储的午休规范。再次,需要零件的情况是首先:
AE2: =(IF(S2>$J$5-O2,1,0)+IF(S2>P2-$J$6,1,0)+IF(V2>=2,V2-1,0)+IF(T2>$J$5-Q2,1,0)+IF(T2>R2-$J$6,1,0)+IF(W2>=2,W2-1,0))*($J$6-$J$5)
AF2: =(IF(U2>$J$5-O2,1,0)+IF(U2>R2-$J$6,1,0)+IF(X2>=2,X2-1,0))*($J$6-$J$5)
技术响应时间
响应时间然后选择适当的一组数字进行组合(无论是否需要零件),然后组合零件。单元格G2:
G2: =IF(ISBLANK(D2),Z2+AB2+AD2-AF2,Y2+AA2+AC2-AE2)
使用自定义格式。在格式下,选择一种接近的时间格式,然后在自定义窗口中对其进行自定义。您可以使用诸如hh:mm
或之类的东西hh"h "mm"m"
,它将产生类似的结果03h 47m
。
在H列中,您需要小时和十进制小时。我没有在Excel中进行很多时间格式化,但似乎内置格式只需要处理整整一个小时。如果我错了,也许其他人可以使用更好的格式化方法来编辑此答案。我只是将存储的数字转换为小时,然后将其格式化为所需位数的数字:
H2: =G2*24
这会将一天的小数部分转换为小时。
您可以根据需要在页面下方复制该行公式。如果您不想查看构建基块的列,请隐藏这些列。