Создание динамической временной шкалы c, которая учитывает только рабочее время - PullRequest
0 голосов
/ 21 января 2020

относительно новый, чтобы преуспеть здесь.

Pt.1 - Создание динамической c временной шкалы дня недели, основанной на часах

Я пытаюсь сделать временную шкалу, основанную на часах каждого Задача, например, так:

enter image description here

Я знаю, как просто добавить часы к дате и времени, но есть еще несколько вещей, которые я должен принять во внимание :

  • Дни, которые запускаются только с 08:00 до 16:00 ч, любые задачи, которые выполняются после 16:00 ч в один день, продолжаются на следующий.
  • Только считается по рабочим дням, так что с понедельника по пятницу и с пятницы по понедельник

Идея состоит в том, что я могу использовать эту таблицу для любого проекта, и просто зная время, необходимое для каждой задачи, получим временную шкалу.

Pt.2 - Добавление столбца для фактических завершенных дат

Чтобы сделать его еще более сложным, я хочу добавить еще один столбец, в который я могу написать, когда я фактически выполнил задачу, что затем обновляет оставшуюся часть таблицы, например так:

enter image description here

У меня в настоящее время есть некоторые массивные и по общему признанию неорганизованные формулы в столбцах Start и End , хотя я подозреваю, что лучше начинать с нуля. Они не работают все время (не пропускайте выходные, считайте часы за пределами диапазона с 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 голосов
/ 21 января 2020

Предполагая, что ваша первая строка отображаемой таблицы находится в строке 3, а столбец Конец - это столбец D, вставьте приведенную ниже формулу в D3, но не раньше, чем сделаете несколько приготовлений.

  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, чтобы включить как полную дату, так и день недели.

...