Расчёт просроченных дней в Microsoft Excel — одна из самых востребованных задач в бухгалтерии, логистике и управлении проектами. Неверный подсчёт может привести к штрафам, нарушению договорных обязательств или искажению отчётности. Но даже опытные пользователи часто сталкиваются с ошибками: формулы возвращают отрицательные значения, игнорируют выходные или неправильно учитывают текущую дату.
В этой статье разберём 5 проверенных способов посчитать просрочку — от простых формул до сложных вычислений с учётом рабочих дней и праздников. Вы узнаете, как автоматизировать процесс, избежать типичных ошибок и адаптировать решения под свои задачи. Все примеры актуальны для Excel 2019–2026 и Excel Online.
Особое внимание уделим динамическим расчётам, где дата проверки обновляется автоматически (например, с функцией СЕГОДНЯ()), а также статическим отчётам, где фиксируется конкретный день анализа. В конце статьи — FAQ с ответами на частые вопросы и таблица сравнения методов.
1. Базовый расчёт: функция ДАТАРАЗН для простых случаев
Если вам нужно быстро посчитать количество дней между двумя датами — например, сроком оплаты и фактической датой платежа — достаточно функции ДАТАРАЗН (или её английского аналога DATEDIF). Она скрыта в списке функций, но работает во всех версиях Excel.
Формула имеет синтаксис:
=ДАТАРАЗН(начальная_дата; конечная_дата; "D")
Где "D" — код для вычисления разницы в днях. Например, если срок оплаты был 15.05.2026, а клиент заплатил 20.05.2026, формула вернёт 5 дней просрочки.
- ✅ Плюсы: простая, не требует дополнительных настроек.
- ❌ Минусы: не учитывает выходные и праздники, может возвращать ошибку
#ЧИСЛО!при неверном формате дат.
Пример для ячейки C2, где A2 — дата дедлайна, а B2 — дата выполнения:
=ЕСЛИ(B2>A2; ДАТАРАЗН(A2; B2; "D"); 0)
Эта формула вернёт количество дней просрочки, если задача выполнена позже срока, или 0, если в срок.
2. Динамический расчёт с функцией СЕГОДНЯ()
Когда нужно отслеживать просрочку на текущий момент (например, для мониторинга долгов или задач), используйте комбинацию СЕГОДНЯ() и ДАТАРАЗН. Функция СЕГОДНЯ() автоматически обновляет дату при каждом пересчёте листа.
Формула для ячейки D2, где C2 — дата дедлайна:
=ЕСЛИ(C2<СЕГОДНЯ(); ДАТАРАЗН(C2; СЕГОДНЯ(); "D"); 0)
⚠️ Внимание: Если книга сохранена в формате.xls(Excel 97–2003), функцияСЕГОДНЯ()не будет обновляться при открытии файла. Используйте формат.xlsxили.xlsm.
- 📅 Пример: Если дедлайн был
10.06.2026, а сегодня15.06.2026, формула вернёт5. - ⚡ Нюанс: Чтобы отключить автоматическое обновление, перейдите в
Формулы → Параметры вычислений → Вручную.
3. Учёт рабочих дней: функция ЧИСТРАБДНИ
В бизнес-задачах просрочка часто считается только по рабочим дням (понедельник–пятница). Для этого в Excel есть функция ЧИСТРАБДНИ (англ. NETWORKDAYS). Она исключает субботы, воскресенья иoptional праздничные даты.
Синтаксис:
=ЧИСТРАБДНИ(начальная_дата; конечная_дата; [праздники])
Где [праздники] — необязательный диапазон с датами праздников (например, A1:A10).
Пример для просрочки с учётом выходных:
=ЕСЛИ(B2>A2; ЧИСТРАБДНИ(A2; B2); 0)
Как добавить праздники в расчёт?
Создайте отдельный столбец с датами праздников (например, 01.01.2026, 07.01.2026 и т.д.). Затем укажите этот диапазон третьим аргументом в функции: =ЧИСТРАБДНИ(A2; B2; $D$2:$D$10)
| Функция | Учитывает выходные | Учитывает праздники | Динамический расчёт |
|---|---|---|---|
ДАТАРАЗН |
❌ Нет | ❌ Нет | ✅ Да (с СЕГОДНЯ()) |
ЧИСТРАБДНИ |
✅ Да | ✅ Да (опционально) | ✅ Да |
РАЗНДАТ |
❌ Нет | ❌ Нет | ✅ Да |
4. Продвинутый метод: функция РАЗНДАТ
Функция РАЗНДАТ (англ. DAYS в новых версиях) возвращает разницу между датами в днях, но в отличие от ДАТАРАЗН, она более гибкая и поддерживает отрицательные значения. Это удобно, если нужно отобразить "опережение" (например, задача выполнена раньше срока).
Формула:
=РАЗНДАТ(A2; B2; "d")
Где "d" — код для дней. Для просрочки используйте:
=МАКС(0; РАЗНДАТ(B2; A2; "d"))
Эта формула вернёт 0, если задача выполнена в срок или раньше, и количество дней просрочки в противном случае.
⚠️ Внимание: В Excel 2016 и новееРАЗНДАТможет выдавать ошибку при неверном формате дат. Преобразуйте данные в формат даты черезФормат ячеек → Дата.
- 🔄 Преимущество: Работает с отрицательными значениями (например,
-3означает опережение на 3 дня). - 📊 Применение: Идеально для аналитики, где важно видеть как просрочки, так и опережения.
5. Расчёт просрочки с учётом времени (часы и минуты)
Если дедлайн задан не только датой, но и временем (например, 15.06.2026 14:00), используйте комбинацию функций ДАТАЗН и ВРЕМЗН (англ. TIME). Это актуально для логистики, где важны даже часы задержки.
Формула для ячейки E2:
=ЕСЛИ((B2+C2)>(A2+D2); (B2+C2)-(A2+D2); 0)
Где:
A2— дата дедлайна,D2— время дедлайна (например,14:00),B2— фактическая дата,C2— фактическое время.
Чтобы результат отображался в днях и часах, примените пользовательский формат ячейки:
[d] "дн." h"ч." mm"мин."
Убедитесь, что даты и время в одном формате (например, дд.мм.гггг чч:мм)
Объедините дату и время в одной ячейке через формулу =A2+B2
Примените формат Дата к итоговым ячейкам
Проверьте настройки региональных параметров (Файл → Параметры → Язык)
-->
6. Типичные ошибки и как их избежать
Даже простые формулы могут давать сбои из-за неочевидных нюансов. Вот TOP-5 ошибок при расчёте просрочки:
- Неверный формат ячеек. Если дата хранится как текст (например,
"15.05.2026"в кавычках), формулы вернут ошибку. Исправляйте черезФормат ячеек → Датаили функциюДАТАЗНАЧ. - Пустые ячейки. Формулы вроде
ДАТАРАЗНвозвращают#ЗНАЧ!, если одна из дат отсутствует. ИспользуйтеЕСЛИОШИБКА: - Разные временные зоны. Если данные импортированы из внешних источников (например, 1С или CRM), даты могут сдвигаться на ±1 день. Проверяйте исходные данные.
- Округление. Функции вроде
ЧИСТРАБДНИмогут округлять результаты. Для точности используйтеОКРУГЛВВЕРХ: - Забытые праздники. Если не указать диапазон праздников в
ЧИСТРАБДНИ, они будут учитываться как рабочие дни.
=ЕСЛИОШИБКА(ДАТАРАЗН(A2; B2; "D"); "")
=ОКРУГЛВВЕРХ(ЧИСТРАБДНИ(A2; B2); 0)
Критическая ошибка: функция СЕГОДНЯ() не обновляется в защищённых листах. Чтобы это исправить, снимите защиту (Рецензирование → Снять защиту листа) или используйте VBA-скрипт для принудительного пересчёта.
7. Автоматизация: VBA-скрипт для массового расчёта
Если вам нужно обработать тысячи строк (например, в отчёте по просроченным платежам), ручной ввод формул займёт часы. Решение — макрос на VBA, который заполнит столбец с просрочкой автоматически.
Пример скрипта для столбца E (просрочка в днях), где C — дата дедлайна, D — дата выполнения:
Sub CalculateOverdue()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, "D").Value > ws.Cells(i, "C").Value Then
ws.Cells(i, "E").Value = DateDiff("d", ws.Cells(i, "C").Value, ws.Cells(i, "D").Value)
Else
ws.Cells(i, "E").Value = 0
End If
Next i
End Sub
Чтобы запустить макрос:
- Нажмите
Alt + F11для открытия редактора VBA. - Вставьте код в модуль (
Insert → Module). - Вернитесь в Excel и запустите макрос через
Разработчик → Макросы(илиAlt + F8).
⚠️ Внимание: Перед запуском макроса сохраните книгу в формате .xlsm (с поддержкой макросов), иначе скрипт не сработает.
FAQ: Ответы на частые вопросы
Как посчитать просрочку, если дата дедлайна пустая?
Используйте функцию ЕСЛИ с проверкой на пустоту:
=ЕСЛИ(ИЛИ(A2=""; B2=""); ""; ЕСЛИ(B2>A2; ДАТАРАЗН(A2; B2; "D"); 0))
Эта формула вернёт пустую ячейку, если хотя бы одна из дат отсутствует.
Можно ли посчитать просрочку в часах, а не в днях?
Да, умножьте результат ДАТАРАЗН на 24 (количество часов в сутках):
=ДАТАРАЗН(A2; B2; "D") * 24
Для минут умножьте на 1440 (24×60).
Почему функция ЧИСТРАБДНИ возвращает неверное количество дней?
Скорее всего, не указан диапазон праздников или неправильно задан формат дат. Проверьте:
- Формат ячеек с датами (
Формат → Дата). - Диапазон праздников (должен быть в формате даты).
- Региональные настройки (
Файл → Параметры → Язык).
Как зафиксировать текущую дату, чтобы она не обновлялась?
Замените СЕГОДНЯ() на статическое значение:
- Введите в ячейку
=СЕГОДНЯ(). - Скопируйте ячейку (
Ctrl + C). - Выделите её же и выполните
Специальная вставка → Значения(Ctrl + Alt + V → В).
Теперь дата не будет меняться при пересчёте.
Можно ли посчитать просрочку с учётом рабочих часов (например, только с 9:00 до 18:00)?
Стандартных функций для этого нет, но можно написать VBA-скрипт или использовать комбинацию:
=ЕСЛИ(И(B2>A2; ЧАС(B2)>=9; ЧАС(B2)<=18); ЧИСТРАБДНИ(A2; B2) - 1; 0)
Эта формула учитывает только полные рабочие дни (с 9:00 до 18:00). Для точного расчёта часов потребуется кастомизация.