创建仅考虑办公时间的动态时间表

时间:2020-01-21 08:56:57

标签: excel date datetime excel-formula excel-2010

相对于此处的Excel来说是新的。

Pt.1-基于小时创建动态的工作日时间表

我正在尝试根据每个任务的时间来制定时间表,就像这样:

enter image description here

我知道如何在日期和时间中增加几个小时,但是我还需要考虑其他一些事项:

  • 日期仅从08:00 h到16:00 h运行,任何在一天中16:00 h之后运行的任务将在第二天继续。
  • 仅计算工作日,因此从星期一至星期五和星期五至星期一

我的想法是我可以将此表用于任何项目,并且只需知道每个任务所需的时间即可生成时间表。

Pt.2-为实际的完成日期添加一列

为了使其更加复杂,我想添加另一列,当我实际完成任务时可以在其中写入,然后更新表的其余部分,如下所示:

enter image description here

我目前在开始结束列中有一些庞大且公认的混乱公式,尽管我怀疑从头开始会更好。他们不会一直工作(不要跳过周末,不要计算上午8点至下午16点之间的小时数),它们如下:

开始: =IF(W9<>"", IF(TIME(HOUR(AA8), MINUTE(AA8), SECOND(AA8))<TIME(16,0,0),AA8,DATE(YEAR(AA8),MONTH(AA8),DAY(AA8))+1+TIME(8,0,0))+SUM(INT((WEEKDAY(AA8-{1,7})+DATE(YEAR(AA8),MONTH(AA8),DAY(AA8))+1+TIME(8,0,0)-AA8)/7)), "")=IF(W9<>"", IF(TIME(HOUR(AA8), MINUTE(AA8), SECOND(AA8))<TIME(16,0,0),AA8,DATE(YEAR(AA8),MONTH(AA8),DAY(AA8))+1+TIME(8,0,0))+SUM(INT((WEEKDAY(AA8-{1,7})+DATE(YEAR(AA8),MONTH(AA8),DAY(AA8))+1+TIME(8,0,0)-AA8)/7)), "")

结束=IF(AB10="", IF(W10<>"", IF(TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1,0,0)>TIME(16,0,0), IF(Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1, 0, 0)>TIME(16, 0, 0), IF(HOUR(DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0))=8, DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0)-(2/3), DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0)), Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1, 0, 0)), Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10), 0, 0))+SUM(INT((WEEKDAY(Z10-{1,7})+IF(TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1,0,0)>TIME(16,0,0), IF(Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1, 0, 0)>TIME(16, 0, 0), IF(HOUR(DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0))=8, DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0)-(2/3), DATE(YEAR(Z10),MONTH(Z10),DAY(Z10+1))+TIME(8,0,0)+ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0)+TIME(((((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8)-ROUNDDOWN(((HOUR((TIME(HOUR(Z10),MINUTE(Z10),SECOND(Z10))))+IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1)-16)/8, 0))*8, 0, 0)), Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10)+1, 0, 0)), Z10+TIME(IF(ISNUMBER(SEARCH("Concept", W10)), Y10/3, Y10), 0, 0))-Z10)/7)), ""), AB10+AC10)

1 个答案:

答案 0 :(得分:0)

假设您的图片表的第一行在第3行中,而 End 列在D列中,请将下面的公式粘贴到D3,但在进行一些准备之前不要粘贴。 / p>

  1. 设置命名范围DayStart,然后在其唯一的单元格中输入=Time(8,0,0)
  2. 设置命名范围DayEnd,然后在其唯一的单元格中输入=Time(16,0,0)
  3. 设置命名范围“假期”,并输入非工作日的日期(星期六和星期日除外)。

这三个范围可以在工作簿中的任何位置,只要它们的范围包括粘贴了公式的工作表即可。假期将被视为休息日。工作时间可以随时更改。

=WORKDAY(C3,INT((((MOD(C3,1)-DayStart)+(B3/24))/(DayEnd-DayStart))),Holidays)+(MOD((((MOD(C3,1)-DayStart)+(B3/24))/(DayEnd-DayStart)),1)*(DayEnd-DayStart))+IF(ABS((((MOD(C3,1)-DayStart)+(B3/24))/(DayEnd-DayStart))-1)>(0.1^4),DayStart,(DayEnd-1))

这是我开发过程中复制的一些公式。

=WORKDAY(C3,INT(J3),Holidays)+K3
[K3] =(MOD(J3,1)*(DayEnd-DayStart))+IF(ABS(J3-1)>(0.1^4),DayStart,(DayEnd-1))
[J3] =(I3/(DayEnd-DayStart))
[I3] =(G3+F3)
[G3] =(MOD(C3,1)-DayStart)
[F3] =(B3/24)

[B3]保持小时数,而不是Time,而是如图所示的表中的纯整数(不尝试小数)。 [C3]可能会出现问题,至少在您似乎拥有的格式下。 我使用了=DATE(2020,1,22)+TIME(8,0,0)之类的公式来确保正确的日期。如果您打算使用表标题中的当前日期来定义C列中的日期,则会出现我预见的问题。

仅供参考,我发现您使用的日期格式不方便,因为我进行了长达64小时和几个假想假期的测试。因此,我需要一种ddd, mmm dd, yyyy hh:mm之类的日期格式,包括完整的日期以及工作日。