Формула Excel: Получить часы работы между датами настраиваемое расписание -

Содержание

Общая формула

=SUMPRODUCT(MID(schedule,WEEKDAY(ROW(INDIRECT(start&":"&end))),1)*ISNA(MATCH(ROW(INDIRECT(start&":"&end)),holidays,0)))

Резюме

Чтобы рассчитать количество рабочих часов между двумя датами с помощью настраиваемого расписания, вы можете использовать формулу, основанную на функциях WEEKDAY и SUMPRODUCT, с помощью ROW, INDIRECT и MID. В показанном примере формула в F8:

=SUMPRODUCT(MID(D6,WEEKDAY(ROW(INDIRECT(B6&":"&C6))),1)*ISNA(MATCH(ROW(INDIRECT(B6&":"&C6)),holidays,0)))

Что возвращает 36 часов на основе настраиваемого графика, где 8 часов работают с понедельника по пятницу, 4 часа работают в субботу, а понедельник 3 сентября - выходной. Праздники представлены в названном диапазоне G6: G8. График работы вводится в виде текстовой строки в столбце D и может быть изменен по желанию.

Примечание. Это формула массива, которую необходимо вводить с помощью Control + Shift + Enter. Если у вас стандартный 8-часовой рабочий день, эта формула проще.

Объяснение

По сути, эта формула использует функцию WEEKDAY для определения дня недели (например, понедельник, вторник и т. Д.) Для каждого дня между двумя заданными датами. WEEKDAY возвращает число от 1 до 7. По умолчанию воскресенье = 1, а суббота = 7.

Уловка этой формулы состоит в том, чтобы собрать массив дат, который вы можете передать в функцию WEEKDAY. Это делается с помощью ROW с INDIRECT:

ROW(INDIRECT(B6&":"&C6))

СТРОКА интерпретирует объединенные даты как номера строк и возвращает такой массив:

(43346;43347;43348;43349;43350;43351;43352)

Каждое число в массиве представляет дату. Затем функция WEEKDAY оценивает массив и возвращает массив значений дня недели:

(2;3;4;5;6;7;1)

Эти числа соответствуют дню недели каждой даты. Они предоставляются функции MID в качестве аргумента начального номера вместе со значением в D6, "0888884" для текста:

MID("0888884",(2;3;4;5;6;7;1),1)

Поскольку мы передаем MID массив начальных чисел, он возвращает массив таких результатов:

("8";"8";"8";"8";"8";"4";"0")

Эти значения соответствуют количеству отработанных часов каждый день с даты начала до даты окончания. Обратите внимание, что значения в этом массиве - это текст, а не числа. Чтобы преобразовать в фактические числа, мы умножаем их на второй массив, созданный для управления праздниками, как описано ниже. Математическая операция переводит текст в числовые значения.

каникулы

Для обработки праздников мы используем ISNA, MATCH и именованный диапазон «праздники» следующим образом:

ISNA(MATCH(ROW(INDIRECT(B6&":"&C6)),holidays,0))

Это выражение использует MATCH для поиска дат, которые находятся в праздничных днях именованного диапазона, используя тот же массив дат, созданный выше с помощью INDIRECT и ROW. ПОИСКПОЗ возвращает число, если праздники найдены, и ошибку # Н / Д, если нет. Функция ISNA "переворачивает" результаты так, что ИСТИНА представляет праздники, а ЛОЖЬ - не праздничные дни. ISNA возвращает массив или такие результаты:

(FALSE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE)

Наконец, оба массива умножаются друг на друга внутри SUMPRODUCT. Математическая операция приводит ИСТИНА и ЛОЖЬ к 1 и нулю, а текстовые значения в первом массиве - к числовым значениям (как объяснено выше), поэтому в итоге мы имеем:

=SUMPRODUCT((8;8;8;8;8;4;0)*(0;1;1;1;1;1;1))

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

=SUMPRODUCT((0;8;8;8;8;4;0))

Затем СУММПРОИЗВ суммирует все элементы в массиве и возвращает результат 36.

Интересные статьи...