Почему стандартное вычитание дат в 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 день.
Способ 3: Функция EDATE для добавления/вычитания месяцев
Функция EDATE (в русскоязычной версии — ДАТАМЕС) не рассчитывает разницу, но позволяет прибавлять или отнимать месяцы от заданной даты. Это полезно для обратного расчёта:
=ДАТАМЕС(начальная_дата; количество_месяцев)
Чтобы найти разницу в месяцах, можно использовать цикл:
- Добавляйте по 1 месяцу к начальной дате, пока не превысите конечную дату.
- Сосчитайте количество итераций.
Пример в 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+ или через надстройку):
- Выделите таблицу с датами →
Данные → Получить данные → Из таблицы/диапазона. - В редакторе Power Query добавьте столбец с формулой:
= Date.From([КонечнаяДата]) - Date.From([НачальнаяДата]) - Преобразуйте результат в месяцы, разделив на 30 (или используя
Duration.Days→ конвертацию в месяцы).
Преимущества метода:
- ⚡ Производительность: Обрабатывает миллионы строк без тормозов.
- 🔄 Автоматизация: Обновляет результаты при изменении исходных данных.
- 📊 Гибкость: Можно добавить дополнительные условия (например, игнорировать выходные).
Загрузите данные в Power Query|Проверьте формат ячеек с датами (должен быть "Дата")|Удалите пустые строки|Создайте копию исходной таблицы на случай ошибок-->
Типичные ошибки и как их избежать
Даже опытные пользователи Excel допускают ошибки при работе с датами. Вот самые распространённые:
- Текст вместо дат: Если ячейка содержит текст
"01.01.2026"(а не дату), формулы вернут ошибку. Исправляйте формат черезФормат ячеек → Датаили функциюДАТАЗНАЧ(). - Неучёт високосных лет: Функции вроде
DATEDIFкорректно обрабатывают 29 февраля, но самодельные формулы могут давать сбой. Например:=ДАТА(2026;2;29) - ДАТА(2023;2;28)вернёт
366(дни), а не365. - Разные форматы дат: В настройках 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 возвращает #ЧИСЛО!, хотя даты корректные?
Ошибка #ЧИСЛО! возникает в трёх случаях:
- Конечная дата раньше начальной.
- Одна из "дат" на самом деле текст (проверьте через
ЕТЕКСТ()). - Некорректный третий аргумент (например, опечатка в
"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:
- Преобразуйте диапазон в таблицу (
Ctrl+T). - Добавьте вычисляемый столбец с формулой
DATEDIF. - Разница будет пересчитываться автоматически при изменении данных.