Содержание
- Получить дни, месяцы и годы между датами
- Подсчитайте дни недели между датами
- Подсчитывать праздники между двумя датами
- Создание диапазона дат с двух дат
- Получать рабочие часы между датами
- Получать рабочие часы между датами собственного расписания
- Получать рабочие дни между датами
- Список праздников между двумя датами
- Скачать файл
Получить дни, месяцы и годы между датами
= РАЗНДАТ (начало; конец; "г")&"годы"; & РАЗНДАТ(начало; конец; "гм") & "месяцы"; & РАЗНДАТ(начало; конец; "мд") & "дни"
= DATEDIF (начало; конец; "г")&"годы"; & DATEDIF(начало; конец; "гм") & "месяцы"; & DATEDIF(начало; конец; "мд") & "дни"
Чтобы рассчитать и отобразить время между датами в днях, месяцах и годах, вы можете использовать формулу, основанную на функции РАЗНДАТ.
В показанном примере формула в D5:
= РАЗНДАТ(B5; C5; "г") & "годы"; & РАЗНДАТ(B5; C5; "гм") & "месяцы"; & РАЗНДАТ(B5; C5; "мд") & "дни"
= DATEDIF (B5; C5; "г")&"годы"; & DATEDIF(B5; C5; "гм") & "месяцы"; & DATEDIF(B5; C5; "мд") & "дни"
Где даты начала указаны в столбце B, а даты окончания - в столбце C.
Функция РАЗНДАТ предназначена для вычисления разницы между датами в годах, месяцах и днях. Доступны несколько вариантов (например, время в месяцах, время в месяцах без учета дней и лет и т. д.), И они устанавливаются аргументом «единица» в функции.
В показанном примере мы вычисляем отдельно годы, месяцы и дни, затем «склеиваем» результаты вместе с конкатенацией. Чтобы получить целые годы, мы используем:
РАЗНДАТ(B5; C5; "г") и "годы"
DATEDIF(B5; C5; "г") и "годы"
Чтобы получить целые месяцы, мы используем:
РАЗНДАТ(B5; C5; "гм") & "месяцы"
DATEDIF(B5; C5; "гм") & "месяцы"
И мы вычисляем дни с:
РАЗНДАТ(B5; C5; "мд") & "дни"
DATEDIF(B5; C5; "мд") & "дни"
Остальная часть формулы - это просто необходимый текст, объединенный с оператором конкатенации (&).
Чтобы предотвратить вывод дней, месяцев или лет с нулевыми значениями, вы можете обернуть каждую функцию РАЗНДАТ внутри ЕСЛИ, как показано здесь (строки, добавленные для удобочитаемости):
=ЕСЛИ(РАЗНДАТ(B5; C5; "г"); РАЗНДАТ (B5; C5; "г") & "годы"; "")ЕСЛИ(РАЗНДАТ(B5; C5; "гм"); РАЗНДАТ(B5; C5; "гм") & "месяцы"; "")ЕСЛИ(РАЗНДАТ(B5; C5; "мд"); РАЗНДАТ(B5; C5; "мд") & "дни"; "")
=IF(DATEDIF(B5; C5; "г")); DATEDIF (B5; C5; "г") & "годы"; "")IF(DATEDIF(B5; C5; "гм"); DATEDIF(B5; C5; "гм") & "месяцы"; "")IF(DATEDIF(B5; C5; "мд"); DATEDIF(B5; C5; "мд") & "дни"; "")
Для предотвращения появления дополнительных запятых в конечном результате запятые заменяются пробелами. Использование исходной формулы РАЗНДАТ как «логического теста» внутри ЕСЛИ работает, потому что ЕСЛИ обрабатывает любой ненулевой результат как истинный.
Подсчитайте дни недели между датами
= СУММПРОИЗВ(- (ДЕНЬНЕД(СТРОКА(ДВССЫЛ (дата1 & ":" & дата2))) = дни))
= SUMPRODUCT(- (WEEKDAY(ROW(INDIRECT (дата1 & ":" & дата2))) = дни))
Чтобы подсчитать количество понедельников, пятниц, воскресений и т. п. между двумя датами, вы можете использовать формулу массива, которая использует несколько функций: СУММПРОИЗВ, ДЕНЬНЕД, СТРОКА и ДВССЫЛ.
В показанном примере формула в ячейке E5 имеет следующий вид:
= СУММПРОИЗВ(- (ДЕНЬНЕД(СТРОКА(ДВССЫЛ(B5 & ":" & C5))) = D5))
= SUMPRODUCT(- (WEEKDAY(ROW(INDIRECT(B5 & ":" & C5))) = D5))
В основном эта формула использует функцию ДЕНЬНЕД, чтобы проверить количество дат, чтобы увидеть, попадают ли они в заданный день недели и функцию СУММПРОИЗВ, чтобы подсчитать общее количество.
Когда дана дата, ДЕНЬНЕД просто возвращает число от 1 до 7, соответствующее конкретному дню недели. С настройками по умолчанию: 1 = воскресенье и 7 = суббота. Итак, 2 = понедельник, 6 = пятница и так далее.
Трюк этой формулы заключается в понимании того, что даты в Excel - это только серийные номера, которые начинаются 1 января 1900 года. Например, 1 января 2016 года - это серийный номер 42370, а 8 января - 42377. Даты в Excel выглядят только как даты, когда применяется формат числа даты.
Итак, возникает вопрос - как вы можете построить массив дат, который вы можете использовать в функции ДЕНЬНЕД, чтобы узнать соответствующие дни недели?
Ответ: использовать СТРОКА с ДВССЫЛ следующим образом:
СТРОКА(ДВССЫЛ(дата1 & ":" & дата2))
ROW(INDIRECT(дата1 & ":" & дата2))
ДВССЫЛ позволяет связанным датам «42370: 42377» интерпретироваться как номера строк. Затем функция СТРОКА возвращает массив вроде этого:
{42370; 42371; 42372; 42373; 42374; 42375; 42376; 42377}
Функция ДЕНЬНЕД оценивает эти числа как даты и возвращает этот массив:
{6; 7; 1; 2; 3; 4; 5; 6}
Который тестируется на заданный день недели (6 в данном случае, начиная с D6). Как только результаты теста преобразуются в 1 и 0 с двойным дефисами, этот массив обрабатывается СУММПРОИЗВ:
{1; 0; 0; 0; 0; 0; 0; 1}
Который возвращает 2.
Подсчитывать праздники между двумя датами
= СУММПРОИЗВ((праздники> = начало) * (праздники <= конец))
= SUMPRODUCT((праздники> = начало) * (праздники <= конец))
Для подсчета праздничных дней, которые происходят между двумя датами, вы можете использовать функцию СУММПРОИЗВ.
В показанном примере формула в F7:
=СУММПРОИЗВ((B5:B13>=F5)*(B5:B13<=F6))
= SUMPRODUCT((праздники> = начало) * (праздники <= конец))
Эта формула использует два выражения в одном массиве внутри функции СУММПРОИЗВ.
Первое выражение проверяет каждую дату отпуска, чтобы увидеть, больше или равна дате начала в F5:
(B5: B13> = F5)
Это возвращает массив значений ИСТИНА/ЛОЖЬ, например:
{ЛОЖЬ; ЛОЖЬ; ЛОЖЬ; ЛОЖЬ; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА }
={FALSE; FALSE; FALSE; FALSE; TRUE; TRUE; TRUE; TRUE; TRUE }
Второе выражение проверяет каждую дату отпуска, чтобы увидеть, меньше или равна конечной дате в F6:
(B5: B13 <= F6)
Который возвращает массив значений ИСТИНА/ЛОЖЬ следующим образом:
{ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ИСТИНА; ЛОЖЬ}
={TRUE; TRUE; TRUE; TRUE; TRUE; TRUE; TRUE; TRUE; FALSE}
Умножение этих двух массивов автоматически присваивает значения ИСТИНА/ЛОЖЬ единицам и нулям, что приводит к массивам, которые выглядят так:
= СУММПРОИЗВ(({0; 0; 0; 0; 1; 1; 1; 1; 1}) * ({1; 1; 1; 1; 1; 1; 1; 1; 0}))
= SUMPRODUCT(({0; 0; 0; 0; 1; 1; 1; 1; 1}) * ({1; 1; 1; 1; 1; 1; 1; 1; 0}))
После умножения у нас есть только один массив:
=СУММПРОИЗВ ({0; 0; 0; 0; 1; 1; 1; 1; 0}})
= SUMPRODUCT ({0; 0; 0; 0; 1; 1; 1; 1; 0}})
Наконец, СУММПРОИЗВ суммирует элементы в массиве и возвращает 4.
Для подсчета праздничных дней, которые происходят только в рабочие дни (понедельник-пятница), вы можете расширить формулу следующим образом:
=СУММПРОИЗВ ({0; 0; 0; 0; 1; 1; 1; 1; 0}})
= SUMPRODUCT ({0; 0; 0; 0; 1; 1; 1; 1; 0}})
Где диап - диапазон, содержащий даты отпуска.
Создание диапазона дат с двух дат
= ТЕКСТ(дата1; "формат") & "-" & ТЕКСТ (дата2; "формат")
= TEXT(дата1; "формат") & "-" & TEXT (дата2; "формат")
Чтобы отобразить диапазон дат в одной ячейке на основе дат в разных ячейках, вы можете использовать формулу, основанную на функции ТЕКСТ.
В показанном примере формула в ячейке E5:
= ТЕКСТ (B5; "ммм д") & "-" & ТЕКСТ(C5; "ммм д")
= TEXT (B5; "ммм д") & "-" & TEXT(C5; "ммм д")
Функция ТЕКСТ принимает числовые значения и преобразует их в текстовые значения, используя заданный вами формат. В этом примере мы используем формат "ммм д" для обеих функций TEКСT в E5. Результаты объединяются дефисом, используя простую конкатенацию.
Примечание. Другие примеры в столбце E используют разные текстовые форматы.
Если дата окончания отсутствует, формула не будет работать правильно, потому что дефис будет добавлен к дате начала (например, «1 марта»).
Чтобы обработать этот случай, вы можете обернуть конкатенацию и вторую функцию ТЕКСТ внутри ЕСЛИ следующим образом:
= ТЕКСТ(дата1; "ммм д") & ЕСЛИ(дата2 <> ""; "-" &ТЕКСТ(дата2; "ммм д"); "")
= TEXT(дата1; "ммм д") & IF(дата2 <> ""; "-" &TEXT(дата2; "ммм д"); "")
Это создает полный диапазон дат, когда обе даты присутствуют, но выводит только дату начала, когда дата окончания отсутствует.
Для обработки случая, когда обе даты отсутствуют, вы можете вложить еще один ЕСЛИ следующим образом:
= ЕСЛИ(дата1 <> ""; ТЕКСТ(дата1; "мммм д") & ЕСЛИ(дата2 <> ""; "-" & ТЕКСТ(дата2; "ммм д"); ""); "")
= IF(дата1 <> ""; TEXT(дата1; "мммм д") & IF(дата2 <> ""; "-" & TEXT(дата2; "ммм д"); ""); "")
Эта формула просто возвращает пустую строку (""), когда дата1 недоступна.
Получать рабочие часы между датами
= ЧИСТРАБДНИ (начало; конец; праздники) * часы
= NETWORKDAYS (начало; конец; праздники) * часы
Чтобы получить общее количество часов работы между двумя датами, вы можете использовать формулу, основанную на функции ЧИСТРАБДНИ, где «начало» - это дата начала, «конец» - конечная дата, «праздники» - диапазон, который включает в себя даты отпуска, А «часы» - количество рабочих часов в день.
В показанном примере формула в D5:
=ЧИСТРАБДНИ(B5;C5)*8
=NETWORKDAYS(B5;C5)*8
Эта формула использует функцию ЧИСТРАБДНИ, чтобы выполнить работу по определению общего количества рабочих дней между двумя датами с учетом выходных и (необязательно) праздников.
Праздники, если они предусмотрены, должны быть диапазоном, который включает действительные даты Excel.
Как только общие рабочие дни известны, их просто умножают на количество часов в рабочем дне.
Обратите внимание, что ЧИСТРАБДНИ по дизайну включает как дату начала, так и дату окончания в результате, и исключает как субботу, так и воскресенье.
Получать рабочие часы между датами собственного расписания
Чтобы вычислить часы работы между двумя датами с настраиваемым расписанием, вы можете использовать формулу, основанную на функциях ДЕНЬНЕД и ВЫБОР.
{= СУММ(ВЫБОР(ДЕНЬНЕД(СТРОКА(ДВССЫЛ(дата1 & ":" & дата2))); 1;2;3;4;5;6;7))}
{= SUM(CHOOSE(WEEKDAY(ROW(INDIRECT(дата1 & ":" & дата2))); 1;2;3;4;5;6;7))}
Чтобы вычислить часы работы между двумя датами с настраиваемым расписанием, вы можете использовать формулу, основанную на функциях ДЕНЬНЕД и ВЫБОР.
В показанном примере формула в F5:
=СУММ(ВЫБОР(ДЕНЬНЕД(СТРОКА(ДВССЫЛ(B5&":"&C5)));0;8;4;8;4;8;0))
=SUM(CHOOSE(WEEKDAY(ROW(INDIRECT(B5&":"&C5)));0;8;4;8;4;8;0))
Который возвращает 32 часа, основанный на пользовательском расписании, где 8 часов работают в Пн, Ср и Пт, а 4 часа - в Пт и Вт.
Примечание. Это формула массива, которая должна вводиться с помощью Control + Shift + Enter.
По сути, эта формула использует функцию ДЕНЬНЕД для определения дня недели (например, понедельник, вторник и т. д.) Для каждого дня между двумя указанными датами.
ДЕНЬНЕД возвращает число от 1 до 7, соответствующее конкретному дню недели. С настройками по умолчанию: 1 = воскресенье и 7 = суббота, поэтому, 2 = понедельник, 6 = пятница и так далее.
Хитрость этой формулы заключается в создании массива дат, которые вы можете использовать в функции ДЕНЬНЕД. Это делается с помощью СТРОКА с ДВССЫЛ следующим образом:
СТРОКА(ДВССЫЛ(дата1 & ":" & дата2))
ROW(INDIRECT(дата1 & ":" & дата2))
ДВССЫЛ позволяет связанным датам "" 42464: 42470 "" интерпретироваться как номера строк. Затем функция СТРОКА возвращает массив вроде этого:
{42464; 42465; 42466; 42467; 42468; 42469; 42470}
Функция ДЕНЬНЕД оценивает эти числа как даты и возвращает этот массив:
{2; 3; 4; 5; 6; 7; 1}
Эти числа соответствуют дню недели каждой даты.
Этот массив затем передается функции ВЫБОР в качестве «номера индекса», который был сконфигурирован с 7 значениями:
Значение1 – рабочие дни в воскресенье
Значение 2 - рабочие часы в понедельник
Значение 3 - рабочие часы вторника
Значение 4 - Рабочие часы в среду
Значение 5 - рабочие часы в четверг
Значение 6 - рабочие часы в пятницу
Значение 7 - работа в субботу
Поскольку мы даем ВЫБОР более чем одно значение индекса, он возвращает более одного результата в массиве следующим образом:
{8; 4; 8; 4; 8; 0; 0}
Эти цифры соответствуют часам, которые выполнялись каждый день с даты 1 по дату2.
Наконец, чтобы получить итоговое значение, нам просто нужно обернуть ВЫБОР в СУММ и ввести формулу массива.
В этом примере итоговый результат составляет 32 часа.
Примечание: вы могли бы подумать, что вы могли бы использовать СУММПРОИЗВ вместо СУММ, чтобы избежать синтаксиса массива, но он не работает; Вам все равно придется использовать CSE. Я знаю, что причина заключается в использовании ДВССЫЛ с СТРОКА для построения массива значений индекса, но не знаю, почему это требует CSE.
Получать рабочие дни между датами
= ЧИСТРАБДНИ(нач_дата; кон_дата; праздники)
= NETWORKDAYS(нач_дата; кон_дата; праздники)
Чтобы вычислить количество рабочих дней между двумя датами, вы можете использовать функцию ЧИСТРАБДНИ. ЧИСТРАБДНИ автоматически исключает выходные и может также исключать настраиваемый список праздничных дней.
Например, если у вас есть дата 4 января 2016 года (понедельник) в ячейке B4 и 11 января 2016 года (также понедельник) в ячейке C4, эта формула вернет 6:
= ЧИСТРАБДНИ(B4; C4)
= NETWORKDAYS(нач_дата; кон_дата; праздники)
Обратите внимание, что ЧИСТРАБДНИ включает как начальную, так и конечную даты в расчете, если они являются рабочими днями.
ЧИСТРАБДНИ также может исключать настраиваемый список праздников. Например, если у вас есть даты отпуска в H1: H10, вы можете указать ЧИСТРАБДНИ не включать эти даты в качестве рабочих дней, добавив этот диапазон в качестве третьего аргумента в формуле:
= ЧИСТРАБДНИ(B4; C4; H1: H10)
= NETWORKDAYS(B4; C4; H1: H10)
Если вам нужно учитывать пользовательские выходные дни (например, выходные - это только суббота, воскресенье и понедельник и т. д.), Вам нужно переключиться на более надежную функцию ЧИСТРАБДНИ.МЕЖД, которая позволяет вам установить, какие дни недели считаются выходными, подавая аргумент в выходные дни в виде числового кода.
Список праздников между двумя датами
{= ОБЪЕДИНИТЬ (";"; ИСТИНА; ЕСЛИ(даты> = старт; ЕСЛИ(даты <= конец; праздники; ""); ""))}
Для отображения праздников, которые происходят между двумя датами, вы можете использовать формулу, основанную на функциях ОБЪЕДИНИТЬ и ЕСЛИ.
В показанном примере формула в F8:
{= ОБЪЕДИНИТЬ(";"; ИСТИНА; ЕСЛИ(B4: B12> = F5; ЕСЛИ(B4: B12 <= F6; C4: C12; ""); ""))}
Это формула массива и должна вводиться control + shift + enter.
На высоком уровне эта формула использует вложенную функцию ЕСЛИ для возвращения массива праздников между двумя датами.
Затем этот массив обрабатывается функцией ОБЪЕДИНИТЬ, которая преобразует массив в текст, используя запятую в качестве разделителя.
Работая изнутри, мы генерируем массив совпадений праздников, используя вложенный ЕСЛИ:
ЕСЛИ(B4: B12> = F5; ЕСЛИ(B4: B12 <= F6; C4: C12; ""); "")
IF(B4: B12> = F5; IF(B4: B12 <= F6; C4: C12; ""); "")
Если даты в B4: B12 больше или равны начальной дате в F5, и если даты в B4: B12 меньше или равны конечной дате в F6, тогда ЕСЛИ возвращает массив праздничных дней. В показанном примере список выглядит так:
{""; ""; "День президента"; "День памяти"; ""; ""; ""; ""; ""}
Этот массив затем доставляется в функцию ОБЪЕДИНИТЬ в качестве аргумента текст1, где разделитель имеет значение «,», а игнорировать_пустые - ИСТИНА. Функция ОБЪЕДИНИТЬ обрабатывает элементы в массиве и возвращает строку, где каждый непустой элемент разделяется запятой и пробелом.
Примечание. Функция ОБЪЕДИНИТЬ является новой в Excel 2016.
скачать файл
Автор проекта
Дмитрий Якушев
Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель - помочь вам эффективнее работать в Excel.
Изучайте наши статьи с примерами формул, сводных таблиц, условного форматирования, диаграмм и макросов. Записывайтесь на наши курсы или заказывайте обучение в корпоративном формате.
Сайт https://akademia-excel.ru/
ИП Якушев Дмитрий Александрович
ОГРНИП: 314501721200022
ИНН: 501706813807
Образовательная лицензия № Л035-01255-50/01194039
Почта: info@akademia-excel.ru
Телефон для связи: + 7 (958) 697-73-88, + 7 (495) 145-23-86
Регистрация на сайте означает согласие с пользовательским соглашением и на получение рассылки и рекламных материалов.
Политика в отношении обработки и защиты персональных данных.
Банковские реквизиты:
Расчетный счет 40802810500000003597
Банк АО «Тинькофф Банк»
Юридический адрес Банка Москва, 123060,1-й Волоколамский проезд, д. 10, стр. 1
Корр. счет Банка 30101810145250000974
ИНН Банка 7710140679
БИК Банка 044525974
Подписывайтесь на нас в соц.сетях:
Сайт https://akademia-excel.ru/
ИП Якушев Дмитрий Александрович
ОГРНИП: 314501721200022
ИНН: 501706813807
Образовательная лицензия № Л035-01255-50/01194039
Банковские реквизиты:
Расчетный счет 40802810500000003597
Банк АО «Тинькофф Банк»
Юридический адрес Банка Москва, 123060,1-й Волоколамский проезд, д. 10, стр. 1
Корр. счет Банка 30101810145250000974
ИНН Банка 7710140679
БИК Банка 044525974
Регистрация на сайте означает согласие с пользовательским соглашением и на получение рассылки и рекламных материалов.
Политика в отношении обработки и защиты персональных данных.
Почта: info@akademia-excel.ru
Телефон для связи: + 7 (958) 697-73-88, + 7 (495) 145-23-86
Написать в тех.поддержку
Подписывайтесь:
авторизуйтесь