Как вычислить дни в Excel: от базовых операций до сложных расчётов

Работа с датами в Microsoft Excel — одна из самых востребованных задач среди пользователей всех уровней. Нужно ли вам посчитать количество дней между двумя событиями, определить возраст клиента, рассчитать рабочие дни для проекта или автоматизировать отчёт по срокам — без знания формул для работы с датами не обойтись. Однако многие сталкиваются с ошибками: Excel вдруг показывает неверное количество дней, выдаёт странные числа вместо дат или вообще возвращает ошибку #ЗНАЧ!.

В этой статье мы разберём 7 проверенных способов вычисления дней в Excel — от элементарных операций вычитания до продвинутых функций с учётом праздников и выходных. Вы узнаете, как избежать типичных ошибок (например, почему =DATEDIF иногда не работает), как правильно форматировать ячейки с датами и даже как автоматизировать расчёты с помощью Power Query. А в конце вас ждёт FAQ-блок с ответами на самые частые вопросы по теме.

1. Базовый метод: вычитание дат

Самый простой способ посчитать дни между двумя датами — вычесть одну дату из другой. Excel хранит даты в виде последовательных чисел (начиная с 1 января 1900 года = 1), поэтому арифметические операции с ними работают интуитивно.

Пример: если в ячейке A1 указана дата начала проекта 15.05.2026, а в B1 — дата окончания 30.05.2026, формула =B1-A1 вернёт 15 (количество дней между датами). Но здесь есть подводные камни:

  • 📅 Формат ячеек: если результат отображается как дата (например, 15.01.1900), а не число — измените формат ячейки с результатом на Общий или Числовой.
  • Ошибка #ЗНАЧ!: появляется, если хотя бы одна из ячеек содержит текст вместо даты. Проверьте формат с помощью Формат ячеек → Дата.
  • ⚠️ Отрицательные значения: если дата окончания раньше начальной, Excel покажет отрицательное число дней. Используйте =ABS(B1-A1), чтобы всегда получать положительный результат.

Этот метод подходит для любых временных интервалов — от часов до лет, но только если вам нужно абсолютное количество дней. Для более сложных расчётов (например, рабочие дни или возраст в годах) потребуются специализированные функции.

📊 Как часто вы работаете с датами в Excel?
Ежедневно
Несколько раз в неделю
Редко
Никогда

2. Функция DATEDIF: расчёт дней, месяцев и лет

Функция DATEDIF (или её русский аналог РАЗНДАТ) — уникальный инструмент Excel, который отсутствует в официальной документации Microsoft, но работает во всех версиях программы. Она позволяет вычислять разницу между датами не только в днях, но и в месяцах или годах, что критично для расчёта возраста, стажа или сроков действия договоров.

Синтаксис функции:
=DATEDIF(начальная_дата; конечная_дата; единица_измерения), где единица_измерения может принимать значения:

ПараметрОписаниеПример результата
"D"Количество полных дней=DATEDIF("1.01.2026"; "15.01.2026"; "D") → 14
"M"Количество полных месяцев=DATEDIF("1.01.2026"; "15.03.2026"; "M") → 2
"Y"Количество полных лет=DATEDIF("1.01.2020"; "15.03.2026"; "Y") → 4
"YM"Месяцы без учёта лет=DATEDIF("1.01.2020"; "15.03.2026"; "YM") → 2
"MD"Дни без учёта месяцев и лет=DATEDIF("1.01.2026"; "15.03.2026"; "MD") → 14

⚠️ Внимание: функция DATEDIF не учитывает високосные годы при расчёте дней. Например, разница между 28.02.2026 и 1.03.2026 будет 2 дня, хотя в 2026 году 29 февраля. Для точных расчётов используйте комбинацию с =ДЕНЬНЕД().

Пример расчёта возраста в формате XX лет, YY месяцев, ZZ дней:

=DATEDIF(A1;TODAY();"Y") & " лет, " & DATEDIF(A1;TODAY();"YM") & " мес., " & DATEDIF(A1;TODAY();"MD") & " дн."

3. Рабочие дни: функция NETWORKDAYS

Если вам нужно посчитать только рабочие дни (исключая выходные и праздники), используйте функцию NETWORKDAYS (в русской версии — ЧИСТРАБДНИ). Она автоматически исключает субботу и воскресенье, а также позволяет указать дополнительные праздничные дни.

Синтаксис:
=NETWORKDAYS(начальная_дата; конечная_дата; [праздники]), где [праздники] — необязательный диапазон ячеек с датами праздников.

Пример: расчёт рабочих дней между 1.05.2026 и 10.05.2026 с учётом праздников 1 и 9 мая:

=NETWORKDAYS("1.05.2026"; "10.05.2026"; {"1.05.2026"; "9.05.2026"})

Результат: 6 (вместо 9 календарных дней).

  • 📊 Для динамических диапазонов: если праздники хранятся в столбце D2:D10, используйте =NETWORKDAYS(A1;B1;D2:D10).
  • Отрицательные значения: если конечная дата раньше начальной, функция вернёт ошибку. Используйте =ABS(NETWORKDAYS(...)).
  • 🌍 Региональные особенности: в некоторых странах выходные — пятница и суббота. Для таких случаев есть функция NETWORKDAYS.INTL.

Убедиться, что даты в формате Excel (не текст)

Проверить регион (выходные суббота/воскресенье?)

Создать список праздников в отдельном диапазоне

Использовать ABS() для избежания отрицательных значений-->

4. NETWORKDAYS.INTL: нестандартные выходные

Функция NETWORKDAYS.INTL (в русской версии — ЧИСТРАБДНИ.МЕЖД) расширяет возможности NETWORKDAYS, позволяя задавать произвольные выходные дни. Это актуально для стран с нестандартной рабочей неделей (например, ОАЭ, где выходные — пятница и суббота) или для компаний с индивидуальным графиком.

Синтаксис:
=NETWORKDAYS.INTL(начальная_дата; конечная_дата; [код_выходных]; [праздники]), где [код_выходных] — число от 1 до 17 или строка из 7 символов (например, "0000011" для выходных в субботу и воскресенье).

Примеры кодов выходных:

  • 📅 1 — суббота и воскресенье (стандарт)
  • 🕍 11 — пятница и суббота (мусульманские страны)
  • 🏢 "0000010" — только воскресенье (6-дневная рабочая неделя)

⚠️ Внимание: если вы используете строковый формат кода (например, "0000011"), убедитесь, что строка содержит ровно 7 символов (по одному на каждый день недели, начиная с понедельника). Ошибка в количестве символов приведёт к #ЗНАЧ!.

Пример расчёта рабочих дней для графика "понедельник-пятница" с выходными в субботу и воскресенье:

=NETWORKDAYS.INTL("1.05.2026"; "10.05.2026"; 1)

5. Расчёт дней до сегодняшней даты (TODAY и NOW)

Для динамических расчётов (например, "сколько дней осталось до дедлайна" или "сколько дней прошло с даты регистрации") используйте функции TODAY (СЕГОДНЯ) и NOW (ТДАТА). Они автоматически обновляют значение при каждом открытии файла.

Примеры:

  • 🗓️ Дни до события: =A1-TODAY() (где A1 — дата события). Если результат отрицательный — событие уже прошло.
  • Дни и часы до дедлайна: =NOW()-A1 вернёт дробное число (целая часть — дни, дробная — время). Используйте формат ячейки [d]:[h] для отображения в виде 12 дней 5 часов.
  • 📈 Автообновление отчётов: комбинируйте с ЕСЛИ для цветовой индикации просроченных задач: =ЕСЛИ(A1-TODAY()<0; "Просрочено"; "В срок").

⚠️ Внимание: функции TODAY и NOW не обновляются в реальном времени — только при открытии файла или принудительном пересчёте (F9). Для постоянного обновления (например, для таймера) потребуется VBA-макрос.

6. Продвинутые приёмы: EOMONTH, EDATE и массивы

Для сложных расчётов с датами (например, "последний день месяца", "дата через N месяцев" или обработка массива дат) пригодятся функции EOMONTH (КОНМЕСЯЦА) и EDATE (ДАТАМЕС). Они часто используются в финансовых моделях, графиках платежей или планировании проектов.

Примеры:

  • 📅 Последний день месяца: =EOMONTH("15.05.2026"; 0)31.05.2026.
  • 🔄 Дата через 3 месяца: =EDATE("15.05.2026"; 3)15.08.2026.
  • 📊 Массив дат: чтобы создать список последних дней каждого месяца в 2026 году, используйте формулу массива:
    =ДАТА(2026; СТРОКА(ДВССЫЛ(1:12)); 1)

    и примените EOMONTH к результату.

Комбинация этих функций с DATEDIF позволяет решать нетривиальные задачи. Например, расчёт количества полных месяцев между датами с учётом конца месяца:

=DATEDIF(A1; EOMONTH(A1; B1); "M")

где A1 — начальная дата, а B1 — количество месяцев для добавления.

Как работают EOMONTH и EDATE с отрицательными значениями?

Функция EOMONTH("15.05.2026"; -1) вернёт последний день предыдущего месяца (30.04.2026), а EDATE("15.05.2026"; -2) — дату за 2 месяца до указанной (15.03.2026). Это удобно для расчёта просрочек или ретроспективного анализа.

7. Автоматизация: Power Query и пользовательские функции

Если вам нужно обработать тысячи дат (например, в отчётах по продажам или логах событий), ручные формулы становятся неэффективными. В таких случаях поможет:

  1. Power Query:

    Инструмент для импорта и преобразования данных. Например, можно загрузить список дат из CSV, добавить столбец с количеством дней до сегодняшней даты и экспортировать результат обратно в Excel. Преимущество — обработка миллионов строк без тормозов.

    Пример запроса (в редакторе Power Query):

    = Table.AddColumn(#"Предыдущий шаг", "Дней до сегодня", each Duration.Days(DateTime.LocalNow() - [Дата]))
  2. Пользовательские функции на VBA:

    Если стандартных функций недостаточно, напишите свою. Например, функция для расчёта дней с учётом региональных праздников:

    Function CustomWorkDays(startDate As Date, endDate As Date) As Long
    

    Dim holidays As Variant

    holidays = Array("01.01.2026", "07.01.2026", "23.02.2026") ' Список праздников

    CustomWorkDays = Application.WorksheetFunction.NetWorkdays(startDate, endDate, holidays)

    End Function

⚠️ Внимание: при использовании Power Query учитывайте, что даты в исходных данных должны быть в распознаваемом формате. Если Excel воспринимает даты как текст, предварительно преобразуйте их с помощью Date.From или DateTime.Parse.

FAQ: Ответы на частые вопросы

🔹 Почему формула =B1-A1 возвращает неверное количество дней?

Скорее всего, одна или обе ячейки имеют текстовый формат, а не формат даты. Проверьте это так:

  1. Выделите ячейку с датой.
  2. Нажмите Ctrl+1 (или правая кнопка → Формат ячеек).
  3. Убедитесь, что выбран формат Дата.

Если дата хранится как текст, преобразуйте её с помощью =ДАТАЗНАЧ(A1).

🔹 Как посчитать дни между датами без учёта выходных, но с учётом праздников?

Используйте функцию NETWORKDAYS с третьим аргументом — диапазоном праздников:

=NETWORKDAYS("1.01.2026"; "31.01.2026"; D2:D10)

где D2:D10 — список праздничных дат. Для нестандартных выходных (например, пятница-суббота) используйте NETWORKDAYS.INTL.

🔹 Можно ли в Excel посчитать количество будних дней между двумя датами?

Да, для этого подходит функция NETWORKDAYS (она по умолчанию исключает субботу и воскресенье). Если нужно исключить ещё и праздники, укажите их в третьем аргументе:

=NETWORKDAYS(A1; B1; Праздники!A2:A10)

где Праздники!A2:A10 — диапазон с датами праздников на отдельном листе.

🔹 Как посчитать возраст в годах, месяцах и днях?

Используйте комбинацию функций DATEDIF:

=DATEDIF(A1;TODAY();"Y") & " лет, " & DATEDIF(A1;TODAY();"YM") & " мес., " & DATEDIF(A1;TODAY();"MD") & " дн."

где A1 — ячейка с датой рождения. Для корректного отображения на русском языке замените "Y", "YM", "MD" на русские эквиваленты, если используете РАЗНДАТ.

🔹 Почему DATEDIF иногда возвращает ошибку #ЧИСЛО!?

Ошибка #ЧИСЛО! возникает, если:

  • Начальная дата позже конечной (используйте =ABS(DATEDIF(...))).
  • Один из аргументов не является датой (проверьте формат ячеек).
  • Вы указали неверный код интервала (например, "X" вместо "D" или "M").

Решение: проверьте порядок дат и их формат, а также правильность третьего аргумента.