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

Почему стандартные функции Excel дают неверный результат

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

Ещё одна распространённая ошибка — использование функции DATEDIF без учёта её скрытых особенностей. Например, если вы попытаетесь посчитать месяцы между 01.01.2023 и 31.01.2023, некоторые формулы вернут 0 вместо 1, потому что не учитывают полные календарные месяцы. А если даты перепутаны местами (конечная раньше начальной), Excel вообще выдаст ошибку #ЧИСЛО!.

В этой статье мы разберём 5 надёжных способов посчитать месяцы между датами — от простейших до продвинутых, с учётом частичных периодов, округления и даже рабочих дней. Вы узнаете, как избежать типичных ошибок и получить точный результат в любой ситуации.

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

Способ 1: Функция DATEDIF — базовый метод с подводными камнями

Функция DATEDIF (от англ. Date Difference) специально создана для расчёта разницы между датами, но она не документирована в официальной справке Excel. Это наследие старых версий Lotus 1-2-3, которое сохранилось для совместимости. Несмотря на это, DATEDIF остаётся самым популярным инструментом для задачи.

Базовый синтаксис:

=DATEDIF(начальная_дата; конечная_дата; "M")

Где "M" — это код для подсчёта полных месяцев между датами. Например:

  • 📅 =DATEDIF("01.05.2023"; "15.08.2023"; "M") → вернёт 3 (май, июнь, июль).
  • 📅 =DATEDIF("15.05.2023"; "01.06.2023"; "M") → вернёт 0, потому что 1 июня ещё не наступил полный месяц с 15 мая.
⚠️ Внимание: Если конечная дата раньше начальной, DATEDIF выдаст ошибку #ЧИСЛО!. Чтобы избежать этого, используйте функцию IF для проверки порядка дат:
=IF(конечная_дата>начальная_дата; DATEDIF(начальная_дата; конечная_дата; "M"); "Ошибка: даты перепутаны")

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

Если DATEDIF кажется вам ненадёжной, можно обойтись стандартными функциями YEAR и MONTH. Этот метод даёт математически точный результат без скрытых округлений. Формула:

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

Разберём на примере:

  • 📅 Для дат 10.03.2023 и 05.07.2026 формула вернёт 16 (1 год и 4 месяца = 12 + 4).
  • 📅 Если конечная дата 15.03.2023, а начальная 10.03.2023, результат будет 0, потому что разница в месяцах отсутствует.

Главное преимущество этого метода — прозрачность вычислений. Вы точно знаете, как Excel получает результат, и можете легко модифицировать формулу. Например, чтобы учесть дни, добавьте проверку:

= ЕСЛИ(ДЕНЬ(конечная_дата)>=ДЕНЬ(начальная_дата); формула_выше; формула_выше - 1)
Почему иногда результат отличается от DATEDIF?

Функция DATEDIF использует внутреннюю логику округления, которая может не совпадать с ручным подсчётом. Например, если начальная дата — 31 января, а конечная — 1 марта, DATEDIF посчитает это как 1 месяц (потому что 28/29 февраля "пропускаются"), тогда как формула с YEAR/MONTH может вернуть 0 или 1 в зависимости от условия.

Способ 3: Учёт частичных месяцев с округлением

Часто требуется посчитать месяцы с учётом частичных периодов, округлив результат до целого числа. Например, если разница между датами — 1 месяц и 20 дней, нужно ли считать это за 1 или 2 месяца? Здесь поможет комбинация функций DATEDIF и ROUNDUP (округление вверх).

Формула для округления до полных месяцев:

= ОКРВВЕРХ(DATEDIF(начальная_дата; конечная_дата; "D")/30; 0)

Где:

  • 📊 DATEDIF(..."D") — возвращает разницу в днях.
  • 📊 Деление на 30 — приблизительное количество дней в месяце (можно заменить на 30.44 для большей точности).
  • 📊 ОКРВВЕРХ — округляет результат до ближайшего целого вверх.

Примеры:

Начальная датаКонечная датаРезультат (месяцев)
01.01.202315.01.20231
01.01.202301.02.20231
15.01.202310.02.20231
01.01.202331.03.20233
⚠️ Внимание: Этот метод даёт приблизительный результат, так как не учитывает реальное количество дней в каждом месяце. Для юридических или финансовых расчётов лучше использовать DATEDIF с кодом "M" или "YM".

Убедитесь, что даты введены как даты (а не текст)|Проверьте порядок дат (начальная ≤ конечной)|Учтите, нужно ли округлять частичные месяцы|Протестируйте формулу на крайних случаях (например, 31 января → 1 марта)

-->

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

Если вам нужно посчитать не календарные, а рабочие месяцы (например, для расчёта стажа или срока действия договора), стандартные функции не подойдут. Здесь потребуется комбинация DATEDIF и NETWORKDAYS (рабочие дни) с дополнительной логикой.

Алгоритм:

  1. Посчитайте общее количество дней между датами: =DATEDIF(нач_дата; кон_дата; "D").
  2. Посчитайте количество рабочих дней: =NETWORKDAYS(нач_дата; кон_дата).
  3. Разделите рабочие дни на среднее количество рабочих дней в месяце (обычно 21 или 22) и округлите:
= ОКРУГЛВНИЗ(NETWORKDAYS(нач_дата; кон_дата)/21; 0)

Пример: между 01.01.2023 (воскресенье) и 31.01.2023 (вторник) всего 30 дней, но рабочих — 22. Формула вернёт 1 (22/21 ≈ 1.05).

Важно: Для точного расчёта добавьте список праздничных дней в третий аргумент NETWORKDAYS, например: =NETWORKDAYS(A1; B1; Праздники!A:A), где Праздники!A:A — столбец с датами выходных.

Способ 5: Динамический расчёт с учётом текущей даты

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

Примеры формул:

  • 📅 Полных месяцев с даты в ячейке A1 до сегодня: =DATEDIF(A1; TODAY(); "M").
  • 📅 Месяцев с округлением вверх: =ОКРВВЕРХ(DATEDIF(A1; TODAY(); "D")/30; 0).
  • 📅 Лет и месяцев (например, "2 года 3 месяца"): =DATEDIF(A1; TODAY(); "Y") & " лет " & DATEDIF(A1; TODAY(); "YM") & " месяцев".

Обратите внимание: TODAY()изменчивая функция. Если вы отправите файл коллеге завтра, результат пересчитается автоматически. Чтобы зафиксировать дату, замените TODAY() на конкретное значение (например, "31.12.2023") или используйте Ctrl + ; для вставки статической даты.

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

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

  1. Текст вместо дат: Если ячейка содержит текст (например, "01.01.2023" вместо даты), Excel не сможет выполнить вычисления. Проверьте формат ячейки (должен быть Дата) и используйте ДАТАЗНАЧ() для преобразования:
    =DATEDIF(ДАТАЗНАЧ("01.01.2023"); ДАТАЗНАЧ("31.01.2023"); "M")
  2. Перепутанные даты: Если начальная дата позже конечной, большинство формул выдадут ошибку. Добавьте проверку:
    =ЕСЛИ(A1<=B1; DATEDIF(A1; B1; "M"); "Ошибка: даты перепутаны")
  3. Игнорирование високосных лет: Функции вроде DATEDIF корректно обрабатывают 29 февраля, но ручные формулы (например, с делением на 30) могут давать погрешность. Для критических расчётов используйте ДАТАМЕС():
    =ДАТАМЕС(нач_дата; количество_месяцев)

Ещё одна ловушка — региональные настройки. В американском Excel даты вводятся как MM/DD/YYYY, а в российском — DD.MM.YYYY. Если файл создан в другой локали, Excel может неправильно интерпретировать даты. Чтобы избежать этого, используйте функцию ДАТА():

=ДАТА(2023; 5; 15)  // 15 мая 2023 года (независимо от региона)

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

Можно ли посчитать месяцы между датами в Google Таблицах?

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

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

Используйте комбинацию NETWORKDAYS и округления, как описано в Способе 4. Для точности добавьте список праздников в третий аргумент NETWORKDAYS.

Почему DATEDIF возвращает неверный результат для 31 января и 1 марта?

Функция DATEDIF учитывает, что в феврале может быть 28 или 29 дней. Если начальная дата — 31 января, а конечная — 1 марта, DATEDIF посчитает это как 1 месяц (потому что 28/29 февраля "пропускаются"). Чтобы получить 2 месяца, используйте код "RM" или ручную корректировку.

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

Используйте коды "Y" (полные годы) и "YM" (месяцы без учёта полных лет) в DATEDIF:

=DATEDIF(A1; B1; "Y") & " лет и " & DATEDIF(A1; B1; "YM") & " месяцев"
Можно ли автоматически обновлять расчёт при изменении дат?

Да, если вы используете ссылки на ячейки (например, =DATEDIF(A1; B1; "M")). Excel пересчитает результат при изменении A1 или B1. Для принудительного пересчёта нажмите F9.