【问题标题】:Creating a dynamic timeline that only takes into account office hours创建仅考虑办公时间的动态时间表
【发布时间】:2020-01-21 08:56:57
【问题描述】:

这里比较陌生。

Pt.1 - 根据小时创建动态工作日时间表

我正在尝试根据每个任务的小时数制定时间表,如下所示:

我知道如何将小时数添加到日期和时间,但我还需要考虑其他一些事项:

  • 仅从 08:00 到 16:00 运行,任何一天运行超过 16:00 的任务将在下一天继续。
  • 只计算工作日,所以从周一->周五和周五->周一开始

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

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

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

我目前在 StartEnd 列中有一些庞大且公认的杂乱无章的公式,但我怀疑从头开始会更好。它们并非一直工作(不要跳过周末,计算上午 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)

【问题讨论】:

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


    【解决方案1】:

    假设您的图片表格的第一行在第 3 行,End 列是 D 列,请将下面的公式粘贴到 D3,但在做一些准备之前不要。

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

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

    =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 这样的日期格式来包含完整日期和工作日。

    【讨论】:

    • 感谢您的回复,并通过解释。今天晚些时候将试用您的解决方案,看看效果如何。
    猜你喜欢
    • 2021-03-15
    • 2011-08-26
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多