Как подсчитать, сколько раз определенное время находится между несколькими интервалами времени (см. Пример) - PullRequest
0 голосов
/ 15 октября 2019

РЕДАКТИРОВАТЬ: Забыл добавить текущую формулу (см. Нижнюю часть сообщения)

У меня есть несколько столбцов, которые хранят время в качестве значений интервала (например, 10 вечера, как 22, 6 утра, как 06) - см. изображение

Мне нужно проверить, находится ли определенное время между всеми различными временными интервалами

Как мне написать формулу Excel, которая проверяет, находится ли время между несколькимиинтервалы (например, 2:30 утра между 10:00 и 4:00?)?

Мои интервалы времени хранятся в столбцах:

J5&K5 [i.e. J5 is the start (value: 02) and K5 is the end (value: 12)]
L5&M5
N5&O5
P5&Q5
R5&S5 [i.e. R5 is the start (value: 06) and K5 is the end (value: 18)]

Времена, в которые я хотел бы проверитьT1: AE5

e.g. T1 = 6:30AM
e.g. U1 = 8:30AM
e.g. AD1 = 02:30AM
e.g. AE1 = 04:30AM

Пример (см. Изображение): Посчитайте, сколько раз AD1 находится между:

J5&K5 
L5&M5
N5&O5
P5&Q5
R5&S5 (i.e. R5 is the start and K5 is the end)

В этом примере счет долженбыть 3 и храниться в AD5 (между J5 и K5, L5 и M5, N5 и O5)

sample time intervals and times to be tested

Что следует учитывать:

  • 00: 00 и 24:00 сохраняются как 24
  • Иногда время начала ночью (например, 22, 24) и время окончанияутром (например, 02, 04, 06)
  • Иногда время начала - утром (например, 02 или 04), а время окончания - днем ​​(например, 14 или 16)

Текущая формула в AD1 (которая не может объяснить тот факт, что 2.5 на самом деле находится между 24 и 06)

=SUMPRODUCT(($AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))

^ Обратите внимание, что это формула, предоставленная другим членом Stackoverflowкогда мне пришлось решить несколько более простую задачу до того, как изменилось требование

Ответы [ 3 ]

3 голосов
/ 15 октября 2019

Разбирая полученную формулу:

=SUMPRODUCT(($AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))
  • $AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))) проверяет, превышает ли AD1 время начала

  • $AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) проверяет, является ли AD1 меньше времени окончания

  • Затем результаты умножаются. Поскольку True оценивается как 1, а False - 0, умножение дает только 1, если выполняются оба условия.

В логических терминах:

  • AD1 больше времени начала

И

  • AD1 меньше времени окончания

Требуется дополнительная логикадля подсчета случаев, когда:

  • AD1 больше времени начала

ИЛИ

  • AD1 меньше времени окончания

WHILE

  • время начала больше времени окончания

Это достигается с помощью:

=SUMPRODUCT((($AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))+($AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))*(INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))
  • $AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))) проверяет, превышает ли AD1 время начала

  • $AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) проверяет, меньше ли AD1 время окончания

  • На этот раз они складываются вместе (ИЛИ)

  • INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) проверяет, что время начала больше времени окончания

  • Эта третья проверка умножается (Иг) с результатом предварительного добавления. Это приводит только к подсчету ситуаций, в которых время начала находится позднее времени окончания (овернайт) и , для которого AD1 находится в течение периода времени.


Таким образом, чтобы подсчитать все желаемые ситуации, вы должны использовать сумму как оригинальной, так и новой частей:

=SUMPRODUCT(($AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))+SUMPRODUCT((($AD$1>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))+($AD$1<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))*(INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))
0 голосов
/ 16 октября 2019

Вот один из способов решения проблемы с использованием двух вспомогательных строк (если это возможно):

Helper Rows

Цель вспомогательных строк - определить «истинное» время окончания и начала каждого начала и конца раздела, используя полдень 12 в качестве точки суждения. Другими словами, я разделил периоды времени от 5 пар до 10 уникальных периодов времени с его собственным временем начала и окончания.

Чтобы найти Время начала , введите следующую формулув ячейку J6 и перетащите ее через;

=IF(LEFT(J3,5)="Start",J5,IF(J5<12,0,12))

Чтобы найти Конец время, введите следующую формулу в ячейку J7 и перетащите ее через;

=IF(LEFT(J3,3)="End",J5,IF(J5>12,24,12))

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

=SUMPRODUCT((T$1>=Start)*(T$1<=End))

Solution

РЕДАКТИРОВАТЬ # 2

На самом деле можно объединить вышеприведенное в одну формулу массива (поэтому избегайте использования фактических вспомогательных строк), которую необходимо подтвердить нажатием Ctrl + Shift + Введите после завершения формулы в строке формул.

=SUMPRODUCT((T$1>=IF(LEFT($J$3:$S$3,5)="Start",$J5:$S5,IF($J5:$S5<12,0,12)))*(T$1<=IF(LEFT($J$3:$S$3,3)="End",$J5:$S5,IF($J5:$S5>12,24,12))))

Введите вышеуказанное в ячейку T5 и перетащитет.

Дайте мне знать, если у вас есть какие-либо вопросы. Ура :) 1060 *

0 голосов
/ 15 октября 2019

Ну, не самая чистая формула в мире, но, по крайней мере, она работает. Я уверен, что есть способ возобновить эту формулу, но я такой нуб с SUMPRODUCT, и я не мог найти способ.

Я получил это: enter image description here

Формула, которую я использовал в ячейке A3:

=SUM(IF(B7<A7;IF(Y(A1+24>=A7;A1+24<=B7+24);1;0);IF(Y(A1>=A7;A1<=B7);1;0));IF(D7<C7;IF(Y(A1+24>=C7;A1+24<=D7+24);1;0);IF(Y(A1>=C7;A1<=D7);1;0));IF(F7<E7;IF(Y(A1+24>=E7;A1+24<=F7+24);1;0);IF(Y(A1>=E7;A1<=F7);1;0));IF(H7<G7;IF(Y(A1+24>=G7;A1+24<=H7+24);1;0);IF(Y(A1>=G7;A1<=H7);1;0));IF(J7<I7;IF(Y(A1+24>=I7;A1+24<=J7+24);1;0);IF(Y(A1>=I7;A1<=J7);1;0)))

Идея состоит в том, чтобы просто проверить, меньше ли End Start. Если это правда, потому что вы работаете с периодами в 24 часа, то суммируйте от 24 до End, а также проверяемое значение.

После этого он просто проверяет, находится ли значение между Start и End.

Но да, довольно грязно. Я публикую формулу, надеясь, что кто-нибудь сможет ее возобновить.

Но, как я уже сказал, по крайней мере, это работает.

...