Последний день месяца в Excel: все способы от простых формул до VBA

Почему поиск последней даты месяца — частая задача в Excel

Работа с датами в Microsoft Excel — одна из самых востребованных операций среди аналитиков, бухгалтеров и менеджеров. Определение последнего дня месяца требуется для расчёта дедлайнов по проектам, формирования отчётности за полный календарный период, начисления зарплат или арендных платежей. Без этого умения невозможно корректно агрегировать данные по месяцам, особенно когда речь идёт о феврале с его переменной длительностью (28 или 29 дней).

В этой статье мы разберём 7 проверенных методов — от элементарных формул до автоматизированных решений на VBA. Каждый способ проиллюстрирован примерами, адаптированными под разные версии Excel (2010–2026) и локализации (русскую/английскую). Вы узнаете, как обойтись без макросов, если они заблокированы политикой безопасности компании, и почему иногда проще использовать EOMONTH, чем комбинацию из трёх функций.

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

Функция EOMONTH (от англ. End Of Month) специально создана для этой задачи. Она возвращает последний день месяца, отстоящего на заданное количество месяцев от указанной даты. Синтаксис:

=EOMONTH(стартовая_дата; количество_месяцев)

Примеры использования:

  • 📅 Чтобы найти последний день текущего месяца, используйте: =EOMONTH(СЕГОДНЯ(); 0). Функция СЕГОДНЯ() вернёт сегодняшнюю дату, а EOMONTH — последний день этого же месяца.
  • 📆 Для определения последнего дня следующего месяца: =EOMONTH(СЕГОДНЯ(); 1).
  • 🔙 Чтобы получить последний день прошлого месяца: =EOMONTH(СЕГОДНЯ(); -1).

Важное замечание: EOMONTH доступна только в Excel 2007 и новее. В старых версиях (2003 и ранее) её нет — придётся использовать альтернативные методы (см. ниже). Также функция возвращает результат в формате даты, поэтому для отображения только дня месяца применяйте ДЕНЬ():

=ДЕНЬ(EOMONTH(СЕГОДНЯ(); 0))
📊 Какую версию Excel вы используете?
2010-2013
2016-2019
2021 или новее
Mac-версия
Другая

Способ 2: Комбинация ДАТА + ДЕНЬ для универсальности

Если EOMONTH недоступна (например, в Excel 2003 или на некоторых корпоративных ПК с ограниченными надстройками), используйте формулу из трёх функций:

=ДАТА(ГОД(дата); МЕСЯЦ(дата)+1; 0)

Разберём, как это работает:

  1. ГОД(дата) и МЕСЯЦ(дата) извлекают год и месяц из исходной даты.
  2. К месяцу прибавляется +1 (следующий месяц).
  3. 0 в аргументе дня означает "последний день предыдущего месяца". Таким образом, ДАТА(2026; 5+1; 0) вернёт 31 мая 2026 года.

Примеры:

  • 📌 Для ячейки с датой A1: =ДАТА(ГОД(A1); МЕСЯЦ(A1)+1; 0).
  • 📅 Для текущего месяца: =ДАТА(ГОД(СЕГОДНЯ()); МЕСЯЦ(СЕГОДНЯ())+1; 0).

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

Когда нужно найти последний день месяца для списка дат (например, в столбце A2:A100), используйте формулу массива. Она обработает все ячейки сразу:

=МАКС(ЕСЛИ(МЕСЯЦ(A2:A100)=МЕСЯЦ(A2); A2:A100))

Как это работает:

  1. МЕСЯЦ(A2:A100)=МЕСЯЦ(A2) проверяет, belong ли все даты в диапазоне к тому же месяцу, что и первая дата (A2).
  2. ЕСЛИ возвращает только те даты, которые удовлетворяют условию.
  3. МАКС находит максимальную (последнюю) дату в отфильтрованном списке.

⚠️ Внимание: Это формула массива! В старых версиях Excel (до 2019) её нужно вводить нажатием Ctrl+Shift+Enter. В новых версиях (365, 2021) достаточно просто нажать Enter.

Что делать, если формула возвращает #ЗНАЧ?

Если в диапазоне есть пустые ячейки или текстовые значения, МАКС может выдавать ошибку. Добавьте проверку на пустоту:

=МАКС(ЕСЛИ(И(МЕСЯЦ(A2:A100)=МЕСЯЦ(A2); A2:A100<>""); A2:A100))

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

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

Алгоритм действий:

  1. Выделите исходную таблицу с датами и нажмите Данные → Из таблицы/диапазона (или Data → From Table/Range в английской версии).
  2. В открывшемся редакторе Power Query выберите столбец с датами, перейдите на вкладку Добавить столбец (Add Column) и нажмите Даты → Месяц → Конец месяца (Date → Month → End of Month).
  3. Сохраните изменения и загрузите данные обратно в Excel.

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

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

Способ 5: VBA-макрос для автоматизации

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

Код макроса:

Sub LastDayOfMonth()

Dim rng As Range

Dim cell As Range

Dim lastRow As Long

' Определяем выделенный диапазон

Set rng = Selection

' Добавляем столбец справа

rng.Offset(0, 1).EntireColumn.Insert

rng.Offset(0, 1).Value = "Последний день"

' Заполняем формулой

For Each cell In rng

If IsDate(cell.Value) Then

cell.Offset(0, 1).Formula = "=EOMONTH(" & cell.Address(False, False) & ",0)"

End If

Next cell

End Sub

Как использовать:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Выделите столбец с датами и запустите макрос (F5).

⚠️ Внимание: Макросы работают только если в настройках Excel разрешено их выполнение (Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Настройки макросов). В корпоративных сетях этот доступ может быть ограничен.

Способ 6: Условное форматирование для визуализации

Иногда нужно не просто найти последний день месяца, а выделить его в таблице (например, чтобы отметить дедлайны). Для этого подойдёт условное форматирование:

  1. Выделите диапазон с датами.
  2. Перейдите в Главная → Условное форматирование → Создать правило.
  3. Выберите Использовать формулу для определения форматируемых ячеек.
  4. Введите формулу:
    =И(A1<>""; ДЕНЬ(A1)=ДЕНЬ(EOMONTH(A1; 0)))
  5. Задайте формат (например, красный текст или жёлтый фон).

Теперь все последние дни месяцев в выделенном диапазоне будут подсвечены.

Ячейки содержат даты, а не текст|Диапазон не включает заголовки|Формула адаптирована под первую ячейку диапазона (например, A1 → B2)|Установлен контрастный цвет для визуального выделения

-->

Сравнение методов: какой выбрать?

Выбор способа зависит от версии Excel, объёма данных и частоты использования. Ниже таблица с сравнением:

Метод Сложность Скорость Подходит для больших данных Требует макросов Работает в Excel 2003
EOMONTH ⚡ Мгновенно ❌ Нет ❌ Нет ❌ Нет
ДАТА+МЕСЯЦ+0 ⭐⭐ ⚡ Мгновенно ❌ Нет ❌ Нет ✅ Да
Формула массива ⭐⭐⭐ 🐢 Медленно для >10к строк ⚠️ Ограниченно ❌ Нет ✅ Да
Power Query ⭐⭐ ⚡ Быстро ✅ Да ❌ Нет ❌ Нет
VBA-макрос ⭐⭐⭐ ⚡ Быстро ✅ Да ✅ Да ✅ Да

Критическая рекомендация: Для одноразовых задач используйте EOMONTH или ДАТА+МЕСЯЦ+0. Для регулярной обработки больших данных (от 10 000 строк) — только Power Query или VBA.

FAQ: Частые вопросы и ошибки

❓ Почему функция EOMONTH возвращает #ИМЯ? вместо даты?

Ошибка #ИМЯ? означает, что Excel не распознаёт имя функции. Это происходит в двух случаях:

  1. Вы используете Excel 2003 или более старую версию, где EOMONTH отсутствует. Решение: применяйте метод с ДАТА+МЕСЯЦ+0.
  2. В вашей версии Excel отключена надстройка Analysis ToolPak (редко, но бывает). Включите её через Файл → Параметры → Надстройки → Управление надстройками Excel → Analysis ToolPak.
❓ Как найти последний рабочий день месяца (исключая выходные)?

Для этого используйте комбинацию EOMONTH и РАБДЕНЬ():

=РАБДЕНЬ(EOMONTH(СЕГОДНЯ(); 0); -1)

Функция РАБДЕНЬ вернёт предыдущий рабочий день (пятницу, если последний день месяца — суббота или воскресенье).

❓ Можно ли использовать эти методы в Google Sheets?

Да, но с поправками:

  • EOMONTH работает и в Google Sheets.
  • Формула ДАТА+МЕСЯЦ+0 тоже поддерживается, но вместо СЕГОДНЯ() используйте TODAY().
  • Вместо РАБДЕНЬ() применяйте WORKDAY().

⚠️ Внимание: В Google Sheets нет Power Query, но есть аналогичный инструмент — Apps Script.

❓ Почему формула возвращает 31 декабря вместо последнего дня текущего месяца?

Это типичная ошибка при использовании ДАТА(ГОД(дата); МЕСЯЦ(дата)+1; 0), если исходная дата — декабрь. При добавлении +1 к месяцу получается 13, что Excel интерпретирует как январь следующего года. Решение:

=ЕСЛИ(МЕСЯЦ(дата)=12; ДАТА(ГОД(дата)+1; 1; 0); ДАТА(ГОД(дата); МЕСЯЦ(дата)+1; 0))
❓ Как автоматически обновлять последний день месяца при изменении исходной даты?

Все приведённые формулы (кроме Power Query и VBA) обновляются автоматически при изменении исходных данных. Если обновление не происходит:

  1. Проверьте настройки вычислений: Формулы → Вычисление → Автоматически.
  2. Для Power Query нажмите Данные → Обновить все.
  3. Для VBA-макроса запустите его повторно или свяжите с событием (например, изменением ячейки).