Введение: зачем считать месяцы между датами в Excel?
Расчёт количества месяцев между двумя датами — одна из самых востребованных задач в Excel для финансового анализа, управления проектами и HR-отчётности. Например, бухгалтеру нужно определить стаж сотрудника для начисления премии, менеджеру проекта — оценить продолжительность этапа в месяцах, а маркетологу — проанализировать динамику продаж по временным интервалам. Вручную такие вычисления занимают часы, а автоматизация с помощью формул экономит время и исключает ошибки.
Ключевая сложность заключается в том, что месяцы имеют разную продолжительность (28–31 день), а стандартные функции Excel не всегда корректно обрабатывают неполные периоды. В этой статье мы разберём 5 рабочих методов — от базовой функции DATEDIF до комбинированных формул с учётом календарных особенностей, а также покажем, как избежать типичных ошибок при работе с датами.
1. Функция DATEDIF: самый простой способ
Функция DATEDIF (от англ. DATE DIFFerence) специально предназначена для вычисления разницы между датами в днях, месяцах или годах. Несмотря на то, что она не документирована в официальной справке Microsoft, она работает во всех версиях Excel (включая Excel 365 и Excel 2021).
Синтаксис функции:
=DATEDIF(начальная_дата; конечная_дата; "единица_измерения")
Для подсчёта месяцев используйте параметр "m" (месяцы) или "ym" (месяцы без учёта лет). Например:
- 📅
=DATEDIF("01.01.2023"; "15.03.2023"; "m")— вернёт 2 (полных месяца между датами). - 📊
=DATEDIF("01.01.2023"; "15.03.2023"; "ym")— вернёт 1 (месяцы за вычетом полных лет, но в этом случае разницы нет). - ⚠️
=DATEDIF("01.01.2023"; "31.01.2023"; "m")— вернёт 0, так как разница менее месяца.
⚠️ Внимание: Функция DATEDIF округляет результат в меньшую сторону. Если вам нужно учитывать неполные месяцы (например, 1.5 месяца), используйте методы из следующих разделов.
2. Комбинация YEAR и MONTH: альтернатива DATEDIF
Если функция DATEDIF по какой-то причине недоступна (например, в некоторых локализованных версиях Excel), можно использовать формулу на основе YEAR и MONTH. Этот метод даёт тот же результат, но требует ручного учёта разницы в годах:
= (ГОД(конечная_дата) - ГОД(начальная_дата)) * 12 + МЕСЯЦ(конечная_дата) - МЕСЯЦ(начальная_дата)
Пример:
= (YEAR("15.03.2023") - YEAR("01.01.2023")) * 12 + MONTH("15.03.2023") - MONTH("01.01.2023")
Результат: 14 (2 месяца разницы в годах + 2 месяца разницы между мартом и январём).
| Формула | Пример | Результат | Примечание |
|---|---|---|---|
DATEDIF с "m" |
=DATEDIF("01.01.2023"; "15.03.2023"; "m") |
2 | Только полные месяцы |
YEAR/MONTH |
= (2023-2023)*12 + 3-1 |
2 | Аналог DATEDIF, но без учёта дней |
DATEDIF с "ym" |
=DATEDIF("01.01.2022"; "15.03.2023"; "ym") |
14 | Месяцы без учёта полных лет |
Этот метод полезен, если вам нужно раздельно анализировать годы и месяцы, например, для расчёта стажа в формате "X лет Y месяцев". Однако он не учитывает дни — если конечная дата раньше начальной по дню месяца, результат может быть некорректным.
3. Учёт неполных месяцев: формула с YEARFRAC
Если вам нужно посчитать месяцы с учётом дробной части (например, 1.5 месяца вместо 1), используйте функцию YEARFRAC (от англ. YEAR FRACTION — доля года). Она возвращает разницу между датами в годах, которую затем можно перевести в месяцы:
= YEARFRAC(начальная_дата; конечная_дата; 1) * 12
Параметр 1 в функции указывает на метод расчёта (фактическое количество дней в месяце). Примеры:
- 📅
=YEARFRAC("01.01.2023"; "15.01.2023"; 1)*12→ 0.48 (примерно 15 дней из 31). - 📈
=YEARFRAC("01.01.2023"; "31.01.2023"; 1)*12→ 0.97 (почти полный месяц). - 🔍
=YEARFRAC("01.01.2023"; "01.02.2023"; 1)*12→ 1.00 (ровно месяц).
⚠️ Внимание: ФункцияYEARFRACможет давать неожиданные результаты при работе с датами в разных временных зонах или при переходе на летнее/зимнее время. Для финансовых расчётов используйте параметр4(европейский метод: 30 дней в месяце).
Критичный нюанс: если вам нужно округлить результат до целого месяца в большую сторону (например, для начисления премии за неполный месяц), оберните формулу в CEILING:
= CEILING(YEARFRAC("01.01.2023"; "15.01.2023"; 1)*12; 1)
Результат: 1 (округление 0.48 до 1).
Убедитесь, что даты введены в формате ДД.ММ.ГГГГ|
Проверьте порядок дат (начальная < конечной)|
Используйте YEARFRAC с параметром 1 для точного учёта дней|
Округляйте результат, если требуются целые месяцы-->
4. Расчёт месяцев с учётом рабочих дней
В бизнес-задачах часто требуется посчитать не календарные, а рабочие месяцы (исключая выходные и праздники). Для этого комбинируйте функцию NETWORKDAYS (рабочие дни между датами) с переводом в месяцы:
= NETWORKDAYS(начальная_дата; конечная_дата) / 21.67
Почему 21.67? Это среднее количество рабочих дней в месяце (при 5-дневной рабочей неделе: 260 рабочих дней в году / 12 месяцев). Пример:
= NETWORKDAYS("01.01.2023"; "31.01.2023") / 21.67
Результат: 0.97 (21 рабочий день в январе 2023 года / 21.67 ≈ 0.97 месяца).
Для более точного расчёта создайте таблицу с праздничными днями и используйте её в качестве третьего аргумента NETWORKDAYS:
= NETWORKDAYS("01.01.2023"; "31.01.2023"; праздники!A2:A10) / 21.67
Как создать список праздников в Excel?
1. Создайте новый лист с названием "Праздники".
2. В столбце A перечислите даты праздников (например, "01.01.2023", "07.01.2023").
3. В формуле NETWORKDAYS укажите диапазон этого столбца как третий аргумент.
5. Продвинутый метод: массивы и условная логика
Если вам нужно гибко учитывать разные правила (например, считать месяц полным только после 15 дней или игнорировать определённые периоды), используйте формулы массива с IF и DAY. Пример:
= SUM(
IF(
DAY(ROW(INDIRECT("1:" & DAY(конечная_дата - начальная_дата)))) >= 15,
1,
0
)
) / 30
Эта формула подсчитывает количество "значимых" дней (≥15) и делит их на 30, чтобы получить приблизительное количество месяцев. Для ввода формулы массива нажмите Ctrl+Shift+Enter (в Excel 365 это не требуется).
Более практичный пример — подсчёт месяцев с учётом порога (например, 10 дней = 0.5 месяца):
= (YEAR(конечная_дата) - YEAR(начальная_дата)) * 12 +
(MONTH(конечная_дата) - MONTH(начальная_дата)) +
IF(DAY(конечная_дата) >= 10; 0.5; 0)
6. Типичные ошибки и как их избежать
Даже опытные пользователи Excel допускают ошибки при работе с датами. Вот самые распространённые:
- 🗓️ Некорректный формат даты: Если ячейка содержит текст (например, "январь 2023"), формулы не будут работать. Используйте
ДАТАЗНАЧдля преобразования:= DATEDIF(ДАТАЗНАЧ("01.01.2023"); ДАТАЗНАЧ("15.03.2023"); "m") - ⚠️ Отрицательная разница: Если начальная дата позже конечной,
DATEDIFвернёт ошибку. Добавьте проверку:= IF(начальная_дата > конечная_дата; "Ошибка"; DATEDIF(начальная_дата; конечная_дата; "m")) - 📉 Игнорирование високосных годов: Функции вроде
YEARFRACучитывают високосные годы автоматически, но при ручных расчётах это может стать источником ошибок.
⚠️ Внимание: В Excel для Mac функцияDATEDIFможет возвращать ошибку #ИМЯ? из-за особенностей локализации. В этом случае замените её на комбинациюYEAR/MONTHили используйте английскую версию функции:=DATEDIF(start_date; end_date; "m").
FAQ: Частые вопросы о расчёте месяцев в Excel
Можно ли посчитать месяцы между датами без учёта годов?
Да, используйте параметр "ym" в функции DATEDIF:
=DATEDIF("01.01.2020"; "15.03.2023"; "ym")
Эта формула вернёт 14 (месяцы без учёта полных лет).
Как посчитать количество полных месяцев между датами, игнорируя дни?
Используйте комбинацию YEAR и MONTH с округлением вниз:
= (YEAR(конечная_дата) - YEAR(начальная_дата)) * 12 + MONTH(конечная_дата) - MONTH(начальная_дата)
Или упрощённо:
= DATEDIF(начальная_дата; конечная_дата; "m")
Почему YEARFRAC даёт неточный результат?
Функция YEARFRAC зависит от выбранного метода расчёта (параметр 1–4). Для финансовых расчётов используйте параметр 4 (30/360), а для календарных — 1 (фактическое количество дней). Пример:
=YEARFRAC("01.01.2023"; "31.01.2023"; 1)*12 → 0.97 (фактические дни)
=YEARFRAC("01.01.2023"; "31.01.2023"; 4)*12 → 1.00 (30/360)
Как посчитать месяцы между сегодняшней датой и другой датой?
Используйте функцию TODAY() для автоматического подставления текущей даты:
= DATEDIF("01.01.2023"; TODAY(); "m")
Эта формула будет обновляться при каждом открытии файла.
Можно ли посчитать месяцы с учётом только рабочих дней?
Да, комбинируйте NETWORKDAYS с делением на среднее количество рабочих дней в месяце (например, 21.67):
= NETWORKDAYS("01.01.2023"; "31.01.2023") / 21.67
Для точности создайте список праздников и укажите его в третьем аргументе.