Страницы: 1
RSS
Подсчёт количества дней между двумя датами
 
Подскажите пожалуйста, как с помощью формул подсчитать количество определенных дней, между двумя датами?

Нашёл тему на форуме: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=18851

Там был вариант с такой формула для подсчёта всех дней недели (от понедельника до воскресенья) в пределах указанных дат:
=СУММПРОИЗВ(--(ДЕНЬНЕД(СТРОКА(ИНДЕКС(A:A;$E$1):ИНДЕКС(A:A;$F$1));2)=A3))

где E1 - начало периода, F1 - конец периода, A:A - диапазон номеров дней недели, A3 - равен 1 и это понедельник.


Но моих знаний не хватает, чтобы преобразовать формулу под один конкретный день недели, а не вычислять его из диапазона. Хочется избавиться от избыточной информации.
 
Файл-пример покажите.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
небольшой пример изобразите. (файл xls)
Код
=СУММПРОИЗВ(--(ДЕНЬНЕД(A2+СТРОКА(ДВССЫЛ("1:" & B2-A2+1))-1;2)=C2))
Изменено: V - 28.02.2024 10:10:42
 
Вот пример из той темы
 
а теперь, словами, что именно считать нужно. согласно файла.
 
V, ваш вариант формулы полностью подошёл. Осталось ее осознать, т.к. обычно в такие дебри не лазил и с подобными функциями не работал.

А по файлу, Я скорее всего не так понял Максим В., и он просил конкретно файл с моим примером, а не пример из темы, на которую я ссылался.  
 
Цитата
killerrok, написал:
=СУММПРОИЗВ(--(ДЕНЬНЕД(СТРОКА(ИНДЕКС(A:A;$E$1):ИНДЕКС(A:A;$F$1));2)=A3))
А что вас в этой формуле не устраивает?
замените "=A3" на интересующий вас день недели (1-7 = пн-вс).
Например, для пятницы ("=5"):
Код
=СУММПРОИЗВ(--(ДЕНЬНЕД(СТРОКА(ИНДЕКС(A:A;$E$1):ИНДЕКС(A:A;$F$1));2)=5))
Можно ещё более длинную, но (вроде бы) более понятную использовать (тут "5" - пятница - встречается в 4 местах):
Код
=ОТБР(($F$1-$E$1)/7) + ИЛИ(ДЕНЬНЕД($E$1;2)=5; ДЕНЬНЕД($F$1;2)=5; ЗНАК(ДЕНЬНЕД($E$1;2)-5)<>ЗНАК(ДЕНЬНЕД($F$1;2)-5))
 
andypetr, в той формуле меня не устраивал диапазон по столбцу А, который в исходном варианте отвечал за выбор дня недели из списка. Хотел уйти от этого, перейдя к одному дню недели.
Но знаний не хватило, т.к. настолько глубоко в экселе не разбираюсь, а чтение хелпа по функции ИНДЕКС не внесли ясности. Попытки заменить диапазон А:А на конкретную ячейку, значение не привели к желаемому результату, потому сюда и обратился.
 

Это не моя формула, но я так и подумал, что может смутить наличие A:A в ней (столбец может быть любой, хоть Z:Z.).

Результатом функции СТРОКА(ИНДЕКС(…):ИНДЕКС(…)) будет массив номеров строк, соответствующих датам от E1 до F1.

Для 01.01.2024…31.12.2024 это будут числа 45292…45657 (т.к. даты это числа).

Далее, для каждой даты происходит сравнение: --(ДЕНЬНЕД(…)=5) (где 5 - это пятница) – в результате получаем массив из 0 и 1.

СУММПРОИЗВ() суммирует все 1 в массиве = получаем кол-во пятниц.

Код
=СУММПРОИЗВ(--(ДЕНЬНЕД(СТРОКА(ИНДЕКС(A:A;$E$1):ИНДЕКС(A:A;$F$1));2)=5))

Правда, у этой формулы 2 недостатка:

  • Столбец A пользователь может удалить и формула «сломается».

  • Количество строк на листе ограничено, поэтому есть предел по датам: для XLS это 2079 г., для XLSX это 4770 г.

В той же архивной теме привели более устойчивую формулу, которую я немного подправил. Четыре раза «5» в формуле - это пятница:

Код
=ОТБР(($F$1-$E$1)/7) + ИЛИ(ДЕНЬНЕД($E$1;2)=5; ДЕНЬНЕД($F$1;2)=5; ЗНАК(ДЕНЬНЕД($E$1;2)-5)<>ЗНАК(ДЕНЬНЕД($F$1;2)-5))

Формула ув. V,  тоже правильная (и самая лаконичная). Но мне не нравится использование волатильной ДВССЫЛ():

Код
=СУММПРОИЗВ(--(ДЕНЬНЕД(A2+СТРОКА(ДВССЫЛ("1:" & B2-A2+1))-1;2)=C2))
Изменено: andypetr - 01.03.2024 10:50:01
Страницы: 1
Наверх