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

Почему стандартное вычитание дат в Excel даёт неверный результат в месяцах

Вы когда-нибудь пытались вычесть одну дату из другой в Microsoft Excel или Google Таблицах, ожидая получить разницу в месяцах, но вместо этого получали бессмысленное число дней? Это классическая ловушка для новичков. Дело в том, что Excel хранит даты как последовательные числа (начиная с 1 января 1900 года), и простое вычитание A2-B2 вернёт количество дней между датами, а не месяцев.

Например, разница между 1 января 2026 и 31 января 2026 составит 30 дней, но при этом это всего 1 полный месяц. А если сравнить 15 января и 10 февраля, то разница в днях будет 26, но в месяцах — менее одного. Вот почему для корректного расчёта требуются специализированные функции.

Способ 1: Функция DATEDIF (РАЗНДАТ) — универсальный инструмент

Функция DATEDIF (в русскоязычной версии — РАЗНДАТ) — это скрытая жемчужина Excel, которую не найдёшь в списке функций через мастер. Она существует ещё со времён Lotus 1-2-3 и поддерживается для обратной совместимости. Синтаксис:

=DATEDIF(начальная_дата; конечная_дата; "единица_измерения")

Для расчёта в месяцах используйте параметр "m":

  • 📅 Точный расчёт: =DATEDIF("15.01.2026"; "10.03.2026"; "m") вернёт 2 (месяца), даже если разница в днях — 55.
  • ⚠️ Округление вниз: Функция всегда округляет неполные месяцы до целого числа в меньшую сторону. Например, разница между 30 января и 1 февраля будет 0.
  • 🔄 Отрицательный результат: Если конечная дата раньше начальной, функция вернёт ошибку #ЧИСЛО!.
Параметр "единица_измерения" Описание Пример результата
"m" Полные месяцы между датами DATEDIF("01.01.2026"; "31.01.2026"; "m")0
"ym" Месяцы без учёта лет (разница в месяцах, если годы одинаковые) DATEDIF("01.01.2026"; "15.03.2026"; "ym")2
"md" Разница в днях, игнорируя месяцы и годы DATEDIF("15.01.2026"; "10.02.2026"; "md")26
⚠️ Внимание: В Google Таблицах функция DATEDIF работает, но может выдавать неожиданные результаты с параметром "md" при пересечении границ месяцев. Всегда проверяйте результат на тестовых данных.

Способ 2: Комбинация YEAR и MONTH для точного расчёта

Если вам нужно учитывать не только месяцы, но и годы, используйте формулу на основе YEAR (ГОД) и MONTH (МЕСЯЦ):

= (ГОД(конечная_дата) - ГОД(начальная_дата)) * 12 + (МЕСЯЦ(конечная_дата) - МЕСЯЦ(начальная_дата))

Пример:

  • 📊 Расчёт: = (ГОД("10.03.2026") - ГОД("15.01.2026")) * 12 + (МЕСЯЦ("10.03.2026") - МЕСЯЦ("15.01.2026"))14 (месяцев).
  • Плюс: Формула учитывает полные годы как 12 месяцев.
  • Минус: Не учитывает дни — разница между 31.01.2026 и 01.02.2026 будет 1 месяц, хотя фактически прошёл всего 1 день.
📊 Какой способ расчёта месяцев вы используете чаще?
Функция DATEDIF
Формула с YEAR/MONTH
Другие функции
Не знаю, как считать

Способ 3: Функция EDATE для добавления/вычитания месяцев

Функция EDATE (в русскоязычной версии — ДАТАМЕС) не рассчитывает разницу, но позволяет прибавлять или отнимать месяцы от заданной даты. Это полезно для обратного расчёта:

=ДАТАМЕС(начальная_дата; количество_месяцев)

Чтобы найти разницу в месяцах, можно использовать цикл:

  1. Добавляйте по 1 месяцу к начальной дате, пока не превысите конечную дату.
  2. Сосчитайте количество итераций.

Пример в VBA (для автоматизации):

Function MonthsDiff(startDate As Date, endDate As Date) As Integer

Dim months As Integer

months = 0

Do While DateAdd("m", months, startDate) <= endDate

months = months + 1

Loop

MonthsDiff = months - 1

End Function

⚠️ Внимание: Этот метод учитывает точные календарные месяцы, включая случаи, когда конечная дата приходится на более раннее число (например, 31 января + 1 месяц = 28 февраля в невисокосный год).

Способ 4: Формула для учёта неполных месяцев (с округлением)

Если вам нужно учитывать частичные месяцы (например, считать 15 дней как 0.5 месяца), используйте комбинацию функций:

= (ГОД(конечная_дата) - ГОД(начальная_дата)) * 12 + (МЕСЯЦ(конечная_дата) - МЕСЯЦ(начальная_дата)) + (ДЕНЬ(конечная_дата) - ДЕНЬ(начальная_дата)) / 30

Примеры результатов:

  • 📅 15.01.2026 → 10.02.2026: 0.83 (26 дней / 30 ≈ 0.87, но формула даёт 0.83 из-за разницы в днях).
  • 🔢 01.01.2026 → 31.01.2026: 0.67 (30 дней / 30).
Почему делим на 30, а не на 31?

В календаре месяцы имеют разное количество дней (28–31), но для упрощённых расчётов часто используется усреднённое значение 30.44 дней. Деление на 30 — это компромисс между точностью и простотой. Для бухгалтерских расчётов могут применяться другие правила (например, "30/360").

Способ 5: Power Query для обработки больших массивов дат

Если вам нужно рассчитать разницу в месяцах для тысяч строк, ручные формулы будут неэффективны. В этом случае поможет Power Query (в Excel 2016+ или через надстройку):

  1. Выделите таблицу с датами → Данные → Получить данные → Из таблицы/диапазона.
  2. В редакторе Power Query добавьте столбец с формулой:
    = Date.From([КонечнаяДата]) - Date.From([НачальнаяДата])
  3. Преобразуйте результат в месяцы, разделив на 30 (или используя Duration.Days → конвертацию в месяцы).

Преимущества метода:

  • Производительность: Обрабатывает миллионы строк без тормозов.
  • 🔄 Автоматизация: Обновляет результаты при изменении исходных данных.
  • 📊 Гибкость: Можно добавить дополнительные условия (например, игнорировать выходные).

Загрузите данные в Power Query|Проверьте формат ячеек с датами (должен быть "Дата")|Удалите пустые строки|Создайте копию исходной таблицы на случай ошибок-->

Типичные ошибки и как их избежать

Даже опытные пользователи Excel допускают ошибки при работе с датами. Вот самые распространённые:

  1. Текст вместо дат: Если ячейка содержит текст "01.01.2026" (а не дату), формулы вернут ошибку. Исправляйте формат через Формат ячеек → Дата или функцию ДАТАЗНАЧ().
  2. Неучёт високосных лет: Функции вроде DATEDIF корректно обрабатывают 29 февраля, но самодельные формулы могут давать сбой. Например:
    =ДАТА(2026;2;29) - ДАТА(2023;2;28)

    вернёт 366 (дни), а не 365.

  3. Разные форматы дат: В настройках Windows может быть установлен формат ММ.ДД.ГГГГ или ДД.ММ.ГГГГ. Excel интерпретирует "01.02.2026" как 1 февраля или 2 января в зависимости от региональных настроек.
⚠️ Внимание: В Google Таблицах функция ДАТАЗНАЧ() работает иначе, чем в Excel! Например, =ДАТАЗНАЧ("31.02.2026") в Google Таблицах вернёт ошибку, а в Excel — автоматически скорректирует дату на 02.03.2026.

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

Можно ли в Excel посчитать месяцы с учётом рабочих дней?

Да, но для этого потребуется комбинация функций. Сначала рассчитайте разницу в днях с помощью РАБДЕНЬ.МЕЖД (NETWORKDAYS.INTL), затем разделите на среднее количество рабочих дней в месяце (обычно 21–22). Пример:

= РАБДЕНЬ.МЕЖД(начальная_дата; конечная_дата) / 21.67

Где 21.67 — среднее количество рабочих дней в месяце (260 рабочих дней в году / 12 месяцев).

Почему DATEDIF возвращает #ЧИСЛО!, хотя даты корректные?

Ошибка #ЧИСЛО! возникает в трёх случаях:

  1. Конечная дата раньше начальной.
  2. Одна из "дат" на самом деле текст (проверьте через ЕТЕКСТ()).
  3. Некорректный третий аргумент (например, опечатка в "m").

Решение: используйте ЕОШИБКА() для обработки ошибок:

=ЕСЛИОШИБКА(DATEDIF(A1; B1; "m"); "Ошибка в данных")

Как посчитать месяцы между датами, игнорируя дни?

Используйте функцию ДАТА(), чтобы привести обе даты к первому числу месяца:

=DATEDIF(ДАТА(ГОД(A1); МЕСЯЦ(A1); 1); ДАТА(ГОД(B1); МЕСЯЦ(B1); 1); "m")

Эта формула вернёт разницу в полных календарных месяцах, независимо от дней.

Можно ли посчитать месяцы с точностью до десятых (например, 1.5 месяца)?

Да, для этого комбинируйте функции DATEDIF и учёт дней:

=DATEDIF(A1; B1; "m") + (ДЕНЬ(B1) - ДЕНЬ(A1)) / 30

Для более точного расчёта замените 30 на ДЕНЬ(ДАТА(ГОД(B1); МЕСЯЦ(B1)+1; 1)-1) — это вернёт количество дней в текущем месяце.

Как автоматически обновлять разницу в месяцах при изменении дат?

Если даты в ячейках обновляются (например, через связь с внешним источником), используйте динамические массивы (в Excel 365+) или таблицы Excel:

  1. Преобразуйте диапазон в таблицу (Ctrl+T).
  2. Добавьте вычисляемый столбец с формулой DATEDIF.
  3. Разница будет пересчитываться автоматически при изменении данных.