Почему подсчёт дней в Excel — это не так просто, как кажется
На первый взгляд, вычисление разницы между двумя датами в Microsoft Excel или Google Таблицах кажется элементарной задачей. Однако на практике пользователи сталкиваются с массой нюансов: учёт выходных, игнорирование праздников, ошибки при работе с временными зонами или некорректным форматом ячеек. Например, если просто вычесть одну дату из другой, результат может оказаться в виде странного числа вместо ожидаемых дней — это происходит из-за того, что Excel хранит даты как последовательные номера, начиная с 1 января 1900 года (система дат 1900).
Более того, задачи бывают разные: кому-то нужно посчитать календарные дни между двумя событиями, кому-то — только рабочие дни (исключая субботу и воскресенье), а кому-то требуется учесть конкретные праздники или производственный календарь. В этой статье мы разберём все возможные сценарии — от базовых формул до продвинутых функций, которые помогут автоматизировать расчёты даже в самых сложных случаях. Вы узнаете, как избежать типичных ошибок и почему иногда простая разница дат даёт неверный результат.
Способ 1: Простое вычитание дат (базовый метод)
Самый очевидный способ посчитать дни между двумя датами — это вычесть одну дату из другой. Excel автоматически преобразует разницу в количество дней, так как внутренне хранит даты как числа. Например, если в ячейке A1 указана дата начала проекта (15.05.2026), а в B1 — дата окончания (30.05.2026), то формула будет выглядеть так:
=B1-A1
Результат — 15 дней. Но здесь есть подводные камни:
- 🔹 Формат ячеек: Если ячейки с датами отформатированы как текст, Excel вернёт ошибку
#ЗНАЧ!. Проверьте формат черезГлавная → Формат → Формат ячеек → Дата. - 🔹 Отрицательные значения: Если дата окончания раньше начальной, результат будет отрицательным. Используйте
=ABS(B1-A1), чтобы получить модуль. - 🔹 Время в датах: Если в ячейках указано не только число, но и время (например,
15.05.2026 14:30), разница будет дробной. Чтобы округлить, используйте=ЦЕЛОЕ(B1-A1).
⚠️ Внимание: Если вы копируете даты из внешних источников (например, с сайтов), Excel может воспринимать их как текст. Используйте функцию=ДАТАЗНАЧ(), чтобы преобразовать текст в дату:=ДАТАЗНАЧ("15.05.2026").
Способ 2: Функция РАЗНДАТ (DATEDIF) — гибкость и точность
Функция РАЗНДАТ (или DATEDIF в английской версии) — это скрытая жемчужина Excel, которой нет в списке функций, но она работает. Её синтаксис:
=РАЗНДАТ(нач_дата; кон_дата; единица)
Где единица может принимать следующие значения:
| Единица | Описание | Пример результата |
|---|---|---|
"D" |
Количество дней между датами | =РАЗНДАТ("1.01.2026"; "10.01.2026"; "D") → 9 |
"M" |
Количество полных месяцев | =РАЗНДАТ("15.01.2026"; "10.03.2026"; "M") → 1 |
"Y" |
Количество полных лет | =РАЗНДАТ("15.01.2020"; "10.03.2026"; "Y") → 4 |
"YM" |
Количество месяцев без учёта лет | =РАЗНДАТ("15.01.2020"; "10.03.2026"; "YM") → 2 |
"MD" |
Количество дней без учёта месяцев и лет | =РАЗНДАТ("15.01.2026"; "10.02.2026"; "MD") → 26 |
Важно: функция РАЗНДАТ не учитывает високосные годы при расчёте месяцев ("M") и лет ("Y"). Например, разница между 28.02.2026 и 01.03.2026 будет 1 месяц, даже если в феврале 2026 года 29 дней.
Способ 3: Функция ЧИСТРАБДНИ для рабочих дней
Если вам нужно посчитать только рабочие дни (исключая субботу и воскресенье), используйте функцию ЧИСТРАБДНИ (или NETWORKDAYS в английской версии). Её синтаксис:
=ЧИСТРАБДНИ(нач_дата; кон_дата; [праздники])
Необязательный параметр [праздники] позволяет указать диапазон ячеек с датами праздников, которые также нужно исключить. Например:
- 📅 Без праздников:
=ЧИСТРАБДНИ("01.05.2026"; "10.05.2026")→ 7 дней (исключены 4 и 5 мая — выходные). - 🎉 С учётом праздников: Если в ячейках
D1:D3указаны даты01.05.2026,09.05.2026и10.05.2026, формула будет=ЧИСТРАБДНИ("01.05.2026"; "10.05.2026"; D1:D3)→ 4 дня.
⚠️ Внимание: ФункцияЧИСТРАБДНИсчитает субботу и воскресенье выходными по умолчанию. Если у вас другой график (например, выходной — пятница), используйте функциюЧИСТРАБДНИ.МЕЖД(илиNETWORKDAYS.INTL), где можно задать собственные выходные дни.
Убедитесь, что даты в формате даты, а не текста|Создайте отдельный столбец для праздников|Проверьте регион (в некоторых странах выходные — пятница и суббота)|Используйте абсолютные ссылки для диапазона праздников (например, $D$1:$D$10)
-->
Способ 4: Функция ТДАТА для динамических расчётов
Функция ТДАТА (или TODAY) возвращает текущую дату и обновляется автоматически при каждом открытии файла. Это удобно для расчёта дней от сегодняшнего дня до какой-либо даты в будущем или прошлом. Например:
- 📅 Дни до дедлайна:
=B1-ТДАТА(), гдеB1— дата дедлайна. - ⏳ Дни с момента события:
=ТДАТА()-A1, гдеA1— дата события. - 🔄 Автообновление: Если файл открыт,
ТДАТА()всегда покажет актуальную дату. Чтобы зафиксировать дату на момент первого открытия, используйте=СЕГОДНЯ()(в некоторых версиях Excel это синонимТДАТА).
Пример использования с РАЗНДАТ:
=РАЗНДАТ(ТДАТА(); "31.12.2026"; "D")
Эта формула покажет, сколько дней осталось до Нового года. Обратите внимание, что ТДАТА() не учитывает время — только дату. Если вам нужно текущее время, используйте СЕЙЧАС() (или NOW).
Чем отличается ТДАТА от СЕЙЧАС?
Функция ТДАТА() возвращает только текущую дату без времени (например, 15.05.2026), тогда как СЕЙЧАС() включает и время (например, 15.05.2026 14:30:45). Если вам нужна разница в днях без учёта времени, используйте ТДАТА(), иначе Excel может вернуть дробное число (например, 1.5 дня).
Способ 5: Продвинутые сценарии — учёт праздников и кастомных выходных
Если ваша компания работает по нестандартному графику (например, выходные — среда и четверг) или вам нужно исключить конкретные праздники, стандартные функции Excel могут не подойти. В таких случаях используйте:
- Функция
ЧИСТРАБДНИ.МЕЖД: Позволяет задать собственные выходные дни через числовой код. Например, код11означает, что выходные — суббота и воскресенье (стандарт), а код7— только воскресенье. Пример:=ЧИСТРАБДНИ.МЕЖД("01.05.2026"; "10.05.2026"; 7; D1:D3)Здесь
7— выходной только воскресенье, аD1:D3— диапазон с праздниками. - Пользовательская функция на VBA: Если логика слишком сложная, можно написать собственную функцию. Например, для учёта праздников по регионам или производственному календарю. Пример кода:
Примечание: Для использования VBA нужно включить поддержку макросов в настройках Excel.Function CustomWorkDays(start_date, end_date, holidays_range)' Логика подсчёта с учётом кастомных правил
End Function
Для автоматизации можно создать производственный календарь на отдельном листе, где будут перечислены все рабочие и выходные дни, а затем ссылаться на него в формулах. Например:
=СУММПРОИЗВ(--(ДиапазонДат>=A1); --(ДиапазонДат<=B1); --(СтатусДня="Рабочий"))
Где ДиапазонДат — столбец с датами, а СтатусДня — столбец с пометками "Рабочий"/"Выходной".
Типичные ошибки и как их избежать
Даже опытные пользователи Excel иногда допускают ошибки при работе с датами. Вот самые распространённые из них и способы их решения:
- 🚫 Ошибка #ЗНАЧ!: Возникает, если ячейка содержит текст вместо даты. Решение — используйте
=ДАТАЗНАЧ()или измените формат ячейки наДата. - 🚫 Некорректная разница: Если результат вычитания дат — дробное число (например,
15.5), значит, в датах указано время. Используйте=ЦЕЛОЕ(B1-A1)или=ОКРВНИЗ(B1-A1; 0). - 🚫 Проблемы с високосными годами: Функция
РАЗНДАТс единицей"Y"может давать неточный результат. Например, разница между28.02.2023и28.02.2026будет 1 год, хотя фактически прошло 366 дней. Для точности используйте"D". - 🚫 Автообновление
ТДАТА(): Если файл открыт, функция пересчитывается при каждом изменении. Чтобы зафиксировать дату, скопируйте результат и вставьте как значение (Ctrl+Shift+V).
Ещё одна частая проблема — разные системы дат в Excel. По умолчанию используется система 1900, где 1 соответствует 1 января 1900 года. Однако в некоторых версиях (особенно на Mac) может использоваться система 1904. Проверить текущую систему можно так:
=ДАТА(1900;1;1)
Если результат — 1, у вас система 1900. Если 0 — система 1904. Чтобы изменить систему, перейдите в Файл → Параметры → Дополнительно → При переходе на эту книгу → Использовать систему дат 1904.
Практические примеры: задачи из реальной жизни
Рассмотрим несколько типичных задач, с которыми сталкиваются пользователи при работе с датами в Excel:
| Задача | Формула | Пример |
|---|---|---|
| Сколько дней осталось до Нового года? | =ДАТА(ГОД(ТДАТА())+1;1;1)-ТДАТА() |
Если сегодня 15.05.2026, результат — 230 дней. |
| Сколько рабочих дней до дедлайна? | =ЧИСТРАБДНИ(ТДАТА(); B1; Праздники) |
Если дедлайн 30.05.2026, а праздники — 09.05.2026 и 10.05.2026, результат — 11 дней. |
| Возраст сотрудника в годах и месяцах | =РАЗНДАТ(A1; ТДАТА(); "Y") & " лет и " & РАЗНДАТ(A1; ТДАТА(); "YM") & " месяцев" |
Если дата рождения 15.06.1990, результат — "33 лет и 11 месяцев". |
| Дни просрочки платежа | =ЕСЛИ(ТДАТА()>B1; ТДАТА()-B1; 0) |
Если платеж до 10.05.2026, а сегодня 15.05.2026, результат — 5 дней просрочки. |
| Дата через N рабочих дней | =РАБДЕНЬ(ТДАТА(); 10; Праздники) |
Если сегодня 15.05.2026, результат — 29.05.2026 (учитывая выходные). |
Для автоматизации отчётов можно создать динамические диапазоны с датами. Например, чтобы всегда показывать данные за последний месяц:
=ФИЛЬТР(ДиапазонДанных; МЕСЯЦ(ДиапазонДат)=МЕСЯЦ(ТДАТА())-1)
Эта формула работает в Excel 365 и Google Таблицах. Для старых версий Excel используйте комбинацию ИНДЕКС и ПОИСКПОЗ.
FAQ: Ответы на частые вопросы
Как посчитать дни между датами, если одна из них пустая?
Если в ячейке нет даты, Excel вернёт ошибку. Используйте функцию ЕСЛИ для проверки:
=ЕСЛИ(И(NOT(ЕПУСТО(A1)); NOT(ЕПУСТО(B1))); B1-A1; "Данные неполные")
Эта формула вернёт разницу только если обе ячейки заполнены.
Почему разница между 01.03.2026 и 31.03.2026 равна 29, а не 30?
Excel считает количество дней между датами, а не включает обе границы. Чтобы включить обе даты, добавьте 1:
=B1-A1+1
Теперь результат будет 30 дней.
Как посчитать дни с учётом только будни (понедельник-пятница)?
Используйте функцию ЧИСТРАБДНИ без указания праздников:
=ЧИСТРАБДНИ("01.05.2026"; "10.05.2026")
Результат — 7 дней (исключены 4, 5 (выходные) и 1, 9, 10 мая, если они попадают на праздники).
Можно ли посчитать дни между датами в разных временных зонах?
Excel не поддерживает временные зоны напрямую. Преобразуйте обе даты к одной временной зоне (например, UTC) перед вычитанием. Для этого:
- Добавьте или вычтите разницу в часах (например, для Москвы UTC+3:
=B1-A1+3/24). - Используйте
=ЦЕЛОЕ(), чтобы получить целые дни.
Для точных расчётов лучше использовать специализированные инструменты, например, Google Apps Script или Power Query.
Как сделать так, чтобы даты автоматически обновлялись при открытии файла?
Функции ТДАТА() и СЕЙЧАС() обновляются автоматически. Если нужно, чтобы дата фиксировалась при первом открытии, используйте VBA:
Private Sub Workbook_Open()
Sheets("Лист1").Range("A1").Value = Date
End Sub
Этот код запишет текущую дату в ячейку A1 при каждом открытии файла. Чтобы добавить код, нажмите Alt+F11, найдите ThisWorkbook в проекте и вставьте код в окно.