5 проверенных способов посчитать количество месяцев между датами в Excel

Почему стандартные функции Excel не всегда корректно считают месяцы

Работа с датами в Microsoft Excel — одна из самых востребованных задач, но даже опытные пользователи сталкиваются с неожиданными ошибками при расчёте интервалов. Например, если вам нужно узнать, сколько полных месяцев прошло между 15 января 2023 и 10 марта 2023, стандартная функция DATEDIF вернёт 1 месяц, хотя логически ожидаешь 2. Всё дело в том, как Excel интерпретирует "неполные" периоды.

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

Способ 1: Функция DATEDIF — быстрый, но коварный

Функция DATEDIF (от англ. Date Difference) специально создана для вычисления разницы между датами, но она имеет скрытые нюансы. Синтаксис:

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

Где "M" — код для расчёта полных месяцев. Например, для дат в ячейках A1 (01.01.2023) и B1 (01.04.2023) формула вернёт 3. Но если в B1 будет 30.03.2023, результат останется тем же — 3, хотя фактически прошло 2 полных месяца и 29 дней.

  • Плюсы: простой синтаксис, работает во всех версиях Excel.
  • Минусы: не учитывает дни, округляет вниз, скрыта в списке функций (набирается вручную).
  • 🔍 Лайфхак: используйте "YM" вместо "M", чтобы получить разницу в месяцах без учёта лет.
⚠️ Внимание: DATEDIF не документирована в официальной справке Microsoft, но работает с Excel 2000. В будущих версиях её могут удалить — дублируйте расчёты альтернативными методами.

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

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

=((ГОД(B1)-ГОД(A1))*12)+МЕСЯЦ(B1)-МЕСЯЦ(A1)

Для англоязычной версии Excel замените ГОД на YEAR, а МЕСЯЦ на MONTH. Например, для дат 15.11.2022 и 20.02.2026 формула вернёт 15 (1 год и 3 месяца = 15 месяцев).

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

=ЕСЛИ(ДЕНЬ(B1)>=ДЕНЬ(A1); формула_выше; формула_выше-1)

Ячейки с датами отформатированы как "Дата"|Начальная дата меньше конечной|Нет пустых ячеек в диапазоне-->

Способ 3: Формула массива для сложных случаев

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

=СУММ((ГОД(ЕОМЕСЯЦ(A1;ПОСЛЕДОВ(0;МЕСЯЦ(B1)-МЕСЯЦ(A1)+12*(ГОД(B1)-ГОД(A1))-1;1))+МЕСЯЦ(ЕОМЕСЯЦ(A1;ПОСЛЕДОВ(0;...))))-ГОД(A1))*12+МЕСЯЦ(ЕОМЕСЯЦ(A1;...))-МЕСЯЦ(A1))

👉 Упрощённая версия (скопируйте в Excel как формулу массива, нажав Ctrl+Shift+Enter):

=МАКС(0;(ГОД(B1)-ГОД(A1))*12+МЕСЯЦ(B1)-МЕСЯЦ(A1)-ЕСЛИ(ДЕНЬ(B1)<ДЕНЬ(A1);1;0))

Эта формула:

  • 📅 Корректно обрабатывает переход через год (например, 30.12.2023 и 01.01.2026 → 1 месяц).
  • 🔄 Учитывает, что 31 марта и 30 апреля — это 1 полный месяц.
  • ⚡ Работает в Excel 2010 и новее.

Функция DATEDIF|Комбинация YEAR/MONTH|Формулы массива|Пользовательская функция VBA|Не знаю, как считать-->

Способ 4: Пользовательская функция VBA для гибкости

Если вам нужно настраиваемое решение (например, учитывать только рабочие месяцы или игнорировать выходные), напишите собственную функцию на VBA. Откройте редактор (Alt+F11), вставьте этот код в модуль:

Function MonthsBetween(date1 As Date, date2 As Date, Optional includeDays As Boolean = False) As Variant

Dim fullMonths As Integer

fullMonths = DateDiff("m", date1, date2) - (Day(date2) < Day(date1))

If includeDays Then

MonthsBetween = fullMonths + (Day(date2) >= Day(date1))

Else

MonthsBetween = fullMonths

End If

End Function

Теперь в Excel можно использовать:

=MonthsBetween(A1; B1)

или с учётом дней:

=MonthsBetween(A1; B1; ИСТИНА)
⚠️ Внимание: VBA-функции работают только в файлах с расширением .xlsm. При отправке такого файла коллегам убедитесь, что у них разрешено выполнение макросов (вкладка Файл → Параметры → Центр управления безопасностью).
Как включить макросы в Excel?

1. Откройте Файл → Параметры → Центр управления безопасностью → Параметры центра...

2. Выберите Включить все макросы (не рекомендуется для недоверенных файлов).

3. Для временного разрешения используйте Включить содержимое при открытии файла.

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

Если вам нужно посчитать месяцы между датами для тысяч строк (например, в отчётах по клиентам или проектам), используйте Power Query:

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

Power Query автоматически учитывает:

  • 📊 Разную длину месяцев (февраль, апрель и т.д.).
  • 🔄 Високосные годы.
  • 📈 Возможность обновления данных без повторного ввода формул.
Метод Точность Сложность Подходит для
DATEDIF Средняя Низкая Быстрых расчётов без дней
YEAR/MONTH Высокая Низкая Календарных интервалов
Формула массива Максимальная Средняя Сложных случаев с днями
VBA Настраиваемая Высокая Автоматизации и уникальных правил
Power Query Высокая Средняя Больших наборов данных

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

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

  1. Неправильный формат ячеек: если даты введены как текст (например, "01.01.2023" вместо 01.01.2023), формулы вернут ошибку. Проверьте формат через Формат ячеек → Дата.
  2. Отрицательные значения: если начальная дата позже конечной, DATEDIF вернёт #ЧИСЛО!. Используйте ЕСЛИОШИБКА или ABS.
  3. Игнорирование високосных лет: 29 февраля может "исчезнуть" при расчётах. Для точности используйте ЕОМЕСЯЦ (конец месяца).
⚠️ Внимание: Функция МЕСЯЦ возвращает номер месяца (1–12), а не количество месяцев между датами. Не путайте =МЕСЯЦ(B1)-МЕСЯЦ(A1) с полноценным расчётом интервала!

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

Почему DATEDIF показывает неверное количество месяцев?

Функция DATEDIF считает полные месяцы, игнорируя дни. Например, между 31.01.2023 и 01.03.2023 она вернёт 1, потому что 28 февраля — не полный месяц с 31 января. Чтобы учитывать дни, комбинируйте DATEDIF с ЕСЛИ:

=DATEDIF(A1;B1;"M") + ЕСЛИ(ДЕНЬ(B1)>=ДЕНЬ(A1);0;-1)
Как посчитать месяцы между датами с учётом рабочих дней?

Стандартные функции не учитывают выходные. Используйте комбинацию:

  1. Посчитайте общее количество дней: =B1-A1.
  2. Вычтите выходные: =ЧИСТРАБДНИ(A1;B1).
  3. Преобразуйте в месяцы, разделив на 21.75 (среднее количество рабочих дней в месяце).

Или напишите VBA-функцию с кастомными правилами для праздников.

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

Да, в Google Sheets работает DATEDIF, но синтаксис отличается:

=DATEDIF(A1; B1; "M")

Также доступны функции:

  • =YEAR(B1)-YEAR(A1) — разница в годах.
  • =MONTH(B1)-MONTH(A1) — разница в месяцах (без учёта лет).

Для точного расчёта используйте:

=ARRAYFORMULA((YEAR(B1)-YEAR(A1))*12 + MONTH(B1)-MONTH(A1) - (DAY(B1)
Как посчитать количество месяцев между сегодняшней датой и другой датой?

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

=DATEDIF(A1; ТДАТА(); "M")

Чтобы результат обновлялся автоматически, нажмите F9 или включите автоматический пересчёт в Формулы → Параметры вычислений.

Почему Excel показывает ###### вместо результата?

Это означает, что:

  1. Ширина столбца слишком мала — расширьте его.
  2. Результат отрицательный (начальная дата позже конечной) — используйте =ABS(ваша_формула).
  3. Формат ячейки неверный — установите Общий или Числовой.