Почему стандартное вычитание не работает с месяцами
Возможно, вы уже пытались просто отнять 1 от даты в формате 15.05.2026 и получили 14.05.2026 вместо ожидаемого 15.04.2026. Это происходит потому, что Excel хранит даты как последовательные числа (начиная с 1 января 1900 года), где день — это основная единица измерения. При обычном вычитании программа оперирует именно днями, а не месяцами.
Проблема усложняется тем, что месяцы имеют разное количество дней: февраль может содержать 28 или 29 дней, апрель — 30, а май — 31. Простое вычитание 30 или 31 дней приведёт к ошибкам в 70% случаев. Например, если вычесть 31 день из 31.01.2026, Excel вернёт 31.12.2023, хотя правильный результат — 01.01.2026.
В этой статье мы разберём 5 надёжных методов, которые учитывают все нюансы календаря, включая високосные годы и переходы через границы месяцев. Вы узнаете, как использовать встроенные функции, формулы массива и даже VBA-скрипты для автоматизации задачи.
Метод 1: Функция ДАТАМЕС — самый простой способ
Функция ДАТАМЕС (англ. EDATE) специально создана для работы с месяцами. Она добавляет или вычитает указанное количество месяцев к дате, автоматически корректируя день, если он превышает количество дней в новом месяце.
Синтаксис функции:
=ДАТАМЕС(начальная_дата; количество_месяцев)
Примеры использования:
- 📅 Чтобы вычесть 1 месяц из даты в ячейке
A1:=ДАТАМЕС(A1; -1) - 📅 Чтобы вычесть 3 месяца из текущей даты:
=ДАТАМЕС(СЕГОДНЯ(); -3) - 📅 Чтобы получить дату через 6 месяцев вперед:
=ДАТАМЕС("15.05.2026"; 6)
Особенности функции:
- ✅ Автоматически обрабатывает переходы через годы (например,
ДАТАМЕС("31.12.2023"; -1)вернёт30.11.2023) - ✅ Учитывает високосные годы (29 февраля 2026 → 29 февраля 2023 при вычитании 12 месяцев)
- ❌ Не работает в Excel 2003 и более ранних версиях
Метод 2: Комбинация функций ДАТА, ГОД, МЕСЯЦ и ДЕНЬ
Если ДАТАМЕС недоступна, можно вручную разложить дату на компоненты, вычесть месяцы, а затем собрать обратно. Этот метод работает во всех версиях Excel, включая Excel 2003.
Формула для вычитания 1 месяца:
=ДАТА(ГОД(A1); МЕСЯЦ(A1)-1; ДЕНЬ(A1))
Разберём её пошагово:
ГОД(A1)— извлекает год из датыМЕСЯЦ(A1)-1— вычитает 1 из номера месяцаДЕНЬ(A1)— извлекает деньДАТА()— собирает всё обратно в дату
Проблемы и решения:
- ⚠️ Если месяц январь (номер 1), то
МЕСЯЦ(A1)-1даст 0 — Excel автоматически скорректирует это на декабрь предыдущего года. - ⚠️ Если день больше, чем дней в новом месяце (например, 31 января → 31 февраля), Excel вернёт
#ЧИСЛО!. Решение — использоватьМИН:
=ДАТА(ГОД(A1); МЕСЯЦ(A1)-1; МИН(ДЕНЬ(A1); ДЕНЬ(ДАТА(ГОД(A1); МЕСЯЦ(A1); 0))))
Почему формула возвращает #ЧИСЛО!?
Ошибка возникает, когда вы пытаетесь создать несуществующую дату, например 31 февраля или 31 апреля. Excel не может обработать такую комбинацию и выдаёт ошибку.
Метод 3: Использование функции КОНМЕСЯЦА (EOMONTH)
Функция КОНМЕСЯЦА (англ. EOMONTH) возвращает последний день месяца, отстоящего на заданное количество месяцев от начальной даты. Её можно адаптировать для вычитания месяцев.
Синтаксис:
=КОНМЕСЯЦА(начальная_дата; количество_месяцев)
Чтобы вычесть 1 месяц и получить ту же самую дату (а не последний день месяца), используйте комбинацию:
=ДАТАМЕС(A1; -1) + ДЕНЬ(A1) - ДЕНЬ(КОНМЕСЯЦА(A1; -1))
Пример работы:
| Исходная дата (A1) | Формула | Результат |
|---|---|---|
| 31.01.2026 | =ДАТАМЕС(A1; -1) | 31.12.2023 |
| 29.02.2026 | =ДАТАМЕС(A1; -1) | 29.01.2026 |
| 31.03.2026 | =КОНМЕСЯЦА(A1; -1)+1 | 29.02.2026 |
Критическая особенность: функция КОНМЕСЯЦА требует подключения надстройки Пакет анализа в Excel 2010 и более ранних версиях.
Метод 4: Формула массива для сложных случаев
Если вам нужно вычесть месяцы с учётом дополнительных условий (например, только для рабочих дней или с пропуском выходных), поможет формула массива. Она позволяет обрабатывать данные по специальным правилам.
Пример: вычесть 1 месяц, но если результат попадает на выходной, перенести на ближайший понедельник:
=РАБДЕНЬ(ДАТАМЕС(A1; -1); 1)
Более сложный вариант с проверкой на високосный год:
=ЕСЛИ(
И(МЕСЯЦ(A1)=3; ДЕНЬ(A1)=1);
ЕСЛИ(ГОД(A1)/4=ЦЕЛОЕ(ГОД(A1)/4); ДАТА(ГОД(A1); 2; 29); ДАТА(ГОД(A1); 2; 28));
ДАТАМЕС(A1; -1)
)
Как вводить формулу массива:
- Выделите ячейку для результата
- Введите формулу
- Нажмите
Ctrl + Shift + Enter(вместо обычногоEnter)
Ввели формулу в ячейку|
Нажали Ctrl+Shift+Enter (появились фигурные скобки {})|
Проверили результат на 2-3 тестовых датах|
Убедились, что нет ошибок #ЗНАЧ! или #ЧИСЛО!-->
Метод 5: VBA-скрипт для автоматизации
Если вам нужно вычесть месяцы в сотнях строк или интегрировать операцию в макрос, используйте Visual Basic for Applications. Этот метод требует начальных знаний VBA, но даёт максимальную гибкость.
Пример кода для вычитания 1 месяца из выделенных ячеек:
Sub SubtractMonth()
Dim cell As Range
For Each cell In Selection
If IsDate(cell.Value) Then
cell.Value = DateSerial(Year(cell.Value), Month(cell.Value) - 1, Day(cell.Value))
End If
Next cell
End Sub
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA - Вставьте код в новый модуль (
Insert → Module) - Выделите ячейки с датами в Excel
- Запустите макрос через
Alt + F8→ выберитеSubtractMonth→Выполнить
Преимущества VBA:
- 🚀 Обрабатывает тысячи строк за секунды
- 🔧 Можно добавить проверку на ошибки (например, пропускать некорректные даты)
- 📊 Интегрируется с другими макросами
Типичные ошибки и как их избежать
Даже опытные пользователи Excel сталкиваются с проблемами при работе с датами. Вот наиболее распространённые ловушки:
⚠️ Внимание: Если ваша дата хранится как текст (например, после импорта из CSV), Excel не распознаёт её как дату. Используйте =ДАТАЗНАЧ(A1), чтобы преобразовать текст в дату перед вычитанием месяцев.
Список типичных ошибок:
- 🔴 #ЗНАЧ! — возникает, если ячейка содержит текст вместо даты. Решение: проверьте формат ячейки (
Формат → Формат ячеек → Дата). - 🔴 #ЧИСЛО! — несуществующая дата (например, 31 февраля). Решение: используйте
МИНдля корректировки дня. - 🔴 Неправильный год — при вычитании месяцев из января Excel может вернуть 13-й месяц. Решение: используйте
ДАТАМЕСили проверяйте результат.
Как проверить формат ячейки:
- Выделите ячейку с датой
- Нажмите
Ctrl + 1(или правая кнопка →Формат ячеек) - Выберите категорию
Датаи укажите нужный формат (например,14.03.2001)
| Ошибка | Причина | Решение |
|---|---|---|
| ###### | Ячейка слишком узкая для отображения даты | Растяните столбец или измените формат на Краткий формат даты |
| 45678 | Дата отображается как число (внутренний формат Excel) | Измените формат ячейки на Дата |
| #ИМЯ? | Опечатка в названии функции (например, ДАТМЕС вместо ДАТАМЕС) | Проверьте синтаксис функции |
FAQ: Ответы на частые вопросы
Можно ли вычесть месяц из даты без использования функций?
Технически да, но это ненадёжно. Например, можно вычесть 30 дней: =A1-30. Однако такой метод даст ошибку для дат вроде 31.03.2026 (результат: 01.03.2026 вместо 29.02.2026). Используйте этот способ только для приблизительных расчётов.
Почему после вычитания месяца из 31 января получаю 31 декабря, а не 30 ноября?
Это особенность функции ДАТАМЕС: она сохраняет день месяца, даже если он превышает количество дней в новом месяце. Чтобы получить последний день предыдущего месяца, используйте =КОНМЕСЯЦА(A1; -1).
Как вычесть месяц в Google Sheets?
В Google Таблицах работает та же функция =ДАТАМЕС(A1; -1). Альтернатива — =ДАТА(ГОД(A1); МЕСЯЦ(A1)-1; ДЕНЬ(A1)), но она вернёт ошибку для несуществующих дат (например, 31 февраля).
Можно ли вычесть месяц с учётом только рабочих дней?
Да, комбинируйте ДАТАМЕС с РАБДЕНЬ:
=РАБДЕНЬ(ДАТАМЕС(A1; -1); 0)
Эта формула вернёт ближайший рабочий день до или в день результата.
Как сделать так, чтобы при вычитании месяца из 29 февраля получалось 28 февраля?
Используйте условную проверку:
=ЕСЛИ(
И(ДЕНЬ(A1)=29; МЕСЯЦ(A1)=2; НЕ(ГОД(ДАТАМЕС(A1;-12))=ГОД(A1)-1));
ДАТА(ГОД(A1)-1; 2; 28);
ДАТАМЕС(A1; -1)
)