Почему расчёт дат в Excel — это не так просто, как кажется
На первый взгляд, работа с датами в Microsoft Excel или Google Таблицах кажется тривиальной: ввёл число в формате ДД.ММ.ГГГГ, и готово. Но стоит попытаться прибавить к дате 30 дней, вычесть 2 месяца или посчитать количество рабочих дней между двумя датами — и начинаются проблемы. Excel хранит даты как последовательные числа (начиная с 1 января 1900 года = 1), а это означает, что любые операции с ними требуют знания специальных функций.
Ошибки здесь чреваты серьёзными последствиями. Например, если вы рассчитываете сроки поставок, графики платежей или дедлайны проектов, неверный расчёт даже на один день может привести к штрафам или срыву контрактов. В этой статье мы разберём 10 практических способов работы с датами — от базовых арифметических операций до сложных формул с учётом выходных и праздников.
1. Базовая арифметика: прибавление и вычитание дней
Самый простой способ изменить дату — сложить или вычесть количество дней. Excel автоматически преобразует результат в корректный формат даты, если ячейка отформатирована соответствующим образом.
Примеры формул:
- 📅 Прибавить 15 дней к дате в ячейке
A1:=A1+15 - 🗓️ Вычесть 7 дней из текущей даты:
=TODAY()-7 - 🔄 Узнать дату через 90 дней от сегодня:
=TODAY()+90
⚠️ Внимание: Если результат отображается как число (например, 45678), проверьте формат ячейки. Выделите её, нажмите Ctrl+1 (или правой кнопкой → Формат ячеек) и выберите категорию Дата.
| Формула | Результат (если сегодня 15.05.2026) | Пояснение |
|---|---|---|
=A1+30 (где A1 = 10.05.2026) | 09.06.2026 | Прибавление 30 дней с учётом количества дней в мае |
=TODAY()-365 | 15.05.2023 | Дата ровно год назад |
=DATE(2026;12;31)-TODAY() | 230 | Количество дней до Нового года |
2. Работа с месяцами и годами: функции EDATE и DATE
Прибавление или вычитание месяцев — более сложная задача из-за разного количества дней в них. Здесь на помощь приходят специализированные функции:
- 📆
EDATE(стартовая_дата; количество_месяцев)— сдвигает дату на указанное количество месяцев, сохраняя день. Если в целевом месяце меньше дней (например, 31 января + 1 месяц), функция вернёт последнее число месяца (28/29 февраля). - 🗂️
DATE(год; месяц; день)— создаёт дату из отдельных компонентов. Полезно для динамического построения дат.
Примеры:
=EDATE("15.01.2026"; 3) → 15.04.2026
=EDATE("31.01.2026"; 1) → 29.02.2026 (високосный год)
=DATE(2026; 12; 31) → 31.12.2026
⚠️ Внимание: Функция EDATE доступна только в Excel 2007 и новее. В старых версиях используйте комбинацию DATE с вычислениями:
=ДАТА(ГОД(A1); МЕСЯЦ(A1)+3; ДЕНЬ(A1))
Убедитесь, что целевой месяц существует (не 13-й или 0-й)
Проверьте високосный год для февраля
Сравните результат с календарём для краевых случаев (31-е число)
Используйте EDATE вместо ручных вычислений, если возможно-->
3. Расчёт рабочих дней: функция WORKDAY
Если вам нужно посчитать сроки с учётом только рабочих дней (исключая субботу, воскресенье и праздники), используйте функцию WORKDAY:
=WORKDAY(стартовая_дата; количество_дней; [праздники])
Примеры:
- 🏢 Рассчитать дату через 10 рабочих дней от сегодня:
=WORKDAY(TODAY(); 10) - 🎉 Учесть праздники (например, в ячейках
D1:D5):=WORKDAY("01.05.2026"; 5; D1:D5)
Для обратного расчёта (сколько рабочих дней между двумя датами) используйте NETWORKDAYS:
=NETWORKDAYS("01.05.2026"; "31.05.2026"; D1:D5)
Ежедневно
1-2 раза в неделю
Редко, но метко
Никогда не использовал-->
4. Разница между датами: функции DATEDIF и DAYS
Чтобы узнать, сколько дней, месяцев или лет прошло между двумя датами, используйте:
- 📏
DATEDIF(дата1; дата2; "единица")— универсальная функция для расчёта разницы в днях ("d"), месяцах ("m") или годах ("y"). Пример:
вернёт количество полных лет.=DATEDIF("01.01.2020"; TODAY(); "y") - 📅
DAYS(дата2; дата1)— возвращает разницу в днях (аналогDATEDIF(;;"d")).
⚠️ Внимание: Функция DATEDIF не документирована в официальной справке Excel, но работает во всех версиях. Она чувствительна к порядку аргументов: первая дата должна быть раньше второй!
| Формула | Результат (на 15.05.2026) | Пояснение |
|---|---|---|
=DATEDIF("01.01.2026"; TODAY(); "d") | 136 | Дней с начала года |
=DATEDIF("15.05.2023"; TODAY(); "m") | 12 | Полных месяцев с прошлого мая |
=DAYS(TODAY(); "31.12.2026") | -230 | Отрицательное значение = дата в будущем |
5. Продвинутые сценарии: последний день месяца, возраст, кварталы
Для нестандартных задач потребуются комбинации функций:
- Последний день месяца:
=ДАТА(ГОД(A1); МЕСЯЦ(A1)+1; 0)Пример: для
15.05.2026вернёт31.05.2026. - Возраст в годах (с учётом дня рождения):
=DATEDIF("15.05.1990"; TODAY(); "y")Вернёт
34, если сегодня до 15.05.2026, и35после. - Номер квартала:
=ROUNDUP(MONTH(A1)/3; 0)Для мая (
5) вернёт2(II квартал).
💡 Лайфхак: Чтобы выделить ячейки с датами, которые уже прошли, используйте Условное форматирование → Правила выделения ячеек → Дата → Прошедшая.
Как Excel хранит даты внутренне?
Excel преобразует даты в последовательные числа, где 1 = 1 января 1900 года (в Windows) или 1904 года (в Mac по умолчанию). Например, 45396 — это 15.05.2026. Время хранится как дробная часть: 45396,5 = полдень 15.05.2026.
6. Ошибки и их исправление
Типичные проблемы при работе с датами:
- ❌
#ЗНАЧ!— неправильный формат данных (например, текст вместо даты). Решение: проверьте формат ячейки или используйте=ДАТАЗНАЧ("15.05.2026")для преобразования текста в дату. - ❌
#ЧИСЛО!— недопустимая дата (например, 30 февраля). Решение: проверьте корректность вводимых значений. - ❌ Дата отображается как число — ячейка имеет общий формат. Решение: измените формат на
Дата.
🔍 Диагностика: Чтобы проверить, распознаёт ли Excel значение как дату, используйте функцию ТИП(A1). Если результат 1 — это число (включая даты), 2 — текст.
7. Динамические даты: автоматическое обновление
Если вам нужны даты, которые обновляются при каждом открытии файла (например, "сегодня", "конец месяца"), используйте:
- 🔄
TODAY()— текущая дата (обновляется автоматически). - ⏰
NOW()— текущие дата и время. - 📅
=EOMONTH(TODAY(); 0)— последний день текущего месяца.
⚠️ Внимание: Эти функции пересчитываются при каждом изменении книги или открытии файла. Если вам нужна фиксированная дата (например, дата создания отчёта), введите её вручную (Ctrl+;) или используйте =SECOND(NOW()) в скрытой ячейке — это заставит Excel "зафиксировать" момент.
FAQ: Частые вопросы о расчёте дат в Excel
Как прибавить к дате 1 год, если год високосный?
Используйте функцию DATE с учётом года:
=ДАТА(ГОД(A1)+1; МЕСЯЦ(A1); ДЕНЬ(A1)). Для 29.02.2026 результат будет 28.02.2026 (невисокосный год). Чтобы всегда получать 29 февраля, добавьте проверку: =ЕСЛИ(И(МЕСЯЦ(A1)=2; ДЕНЬ(A1)=29); ДАТА(ГОД(A1)+4; 2; 29); ДАТА(ГОД(A1)+1; МЕСЯЦ(A1); ДЕНЬ(A1))).
Можно ли в Excel посчитать дату Пасхи?
Да, для этого есть сложная формула, основанная на алгоритме Гаусса. Пример для григорианского календаря (XIX–XXI века):
=ЦЕЛОЕ(A1/100)
=ОСТАТ(A1;19)
=ОСТАТ(A1;4)
=ОСТАТ(A1;7)
=ЦЕЛОЕ((19*B2+M)/30)
=ЦЕЛОЕ((2*C2+4*D2+6*E2+N)/7)
=ЕСЛИ(И(E2+F2>9; A1>1999); E2+F2-7; E2+F2)+22
=ДАТА(A1;3;G2)
Где A1 — год. Формула вернёт дату Пасхи в этом году.
Как посчитать количество будних дней между датами без учёта праздников?
Используйте функцию NETWORKDAYS без третьего аргумента:
=NETWORKDAYS("01.05.2026"; "31.05.2026")
Для мая 2026 года (где 1, 8, 9 мая — праздники, но не учтены) результат будет 21 (23 календарных дня минус 4 выходных).
Почему функция DATEDIF возвращает неверный результат?
Проверьте:
- Порядок аргументов: первая дата должна быть раньше второй.
- Формат ячеек: обе даты должны быть в формате
Дата(не текст!). - Единица измерения: для дней используйте
"d", для месяцев —"m", для полных лет —"y".
Пример ошибки: =DATEDIF("31.12.2026"; "01.01.2026"; "d") вернёт #ЧИСЛО!.
Как вычесть из даты 1 месяц, если это 31 января?
Функция EDATE автоматически скорректирует дату на последнее число предыдущего месяца:
=EDATE("31.01.2026"; -1) → 31.12.2023
Если нужно сохранить номер дня (например, получить 31.12.2023 вместо 30.11.2023), используйте:
=ДАТА(ГОД(A1); МЕСЯЦ(A1)-1; ДЕНЬ(A1))
Но в декабре результат будет ошибочным (31.11.2023), поэтому лучше комбинировать с проверкой:
=ЕСЛИ(ДЕНЬ(A1)>ДЕНЬ(ДАТА(ГОД(A1);МЕСЯЦ(A1);0)); ДАТА(ГОД(A1);МЕСЯЦ(A1);0); ДАТА(ГОД(A1);МЕСЯЦ(A1)-1;ДЕНЬ(A1)))