Почему простая разность дат в Excel не даёт точный возраст в годах
Вы когда-нибудь пытались в Microsoft Excel вычесть одну дату из другой, ожидая получить количество лет, но вместо этого видели загадочное число вроде 4567? Это не ошибка программы — так работает внутренняя логика серийных номеров дат в Excel. Каждая дата здесь хранится как количество дней, прошедших с 1 января 1900 года. Когда вы выполняете операцию =B2-A2, где в ячейках даты, Excel возвращает именно эту разницу в днях, а не в годах.
Но что, если вам нужно рассчитать возраст человека, срок службы оборудования или период владения недвижимостью именно в полных годах? Обычное вычитание здесь не подходит: оно не учитывает месяцы и дни. Например, разница между 01.01.2020 и 31.12.2023 составит 3 полных года, но простое вычитание даст 3,997 года — а вам нужны целые единицы. В этой статье разберём 5 способов получить точный результат, включая скрытую функцию ДАТАРАЗН (DATEDIF), о которой многие не знают.
Способ 1: Функция DATEDIF (ДАТАРАЗН) — скрытый инструмент для точного расчёта
Функция DATEDIF (в русской версии — ДАТАРАЗН) специально создана для вычисления разницы между датами в годах, месяцах или днях. Несмотря на то, что она не отображается в списке функций Excel, её можно вводить вручную. Синтаксис:
=DATEDIF(начальная_дата; конечная_дата; "Y")
Где "Y" — это код для расчёта полных лет. Например, чтобы узнать, сколько лет прошло с 15.05.1990 до 10.08.2023, используйте:
=ДАТАРАЗН("15.05.1990"; "10.08.2023"; "Y")
Результат — 33, потому что 10 августа 2023 года ещё не наступил день рождения (15 мая). Эта функция автоматически округляет вниз до целого числа лет, что идеально для расчёта возраста.
Убедитесь, что даты введены как даты (не текст)|Используйте точный формат ДД.ММ.ГГГГ|Проверьте регистр буквы "Y" (должна быть заглавной)|Для месяцев используйте код "M", для дней — "D"-->
⚠️ Внимание: ФункцияДАТАРАЗНне работает с датами до01.01.1900. Если вам нужно рассчитать разницу для исторических дат (например,18.06.1812), используйте альтернативные методы из следующих разделов.
Способ 2: Комбинация YEAR и DAYS360 для финансовых расчётов
Если вы работаете с финансовыми отчётами или бухгалтерскими данными, где важна не календарная, а условная разница в годах (например, 360 дней = 1 год), используйте функцию YEARFRAC (ДОЛЯГОДА). Она возвращает дробное значение лет между двумя датами с учётом выбранного метода расчёта:
=ДОЛЯГОДА(начальная_дата; конечная_дата; [базис])
Параметр [базис] определяет способ подсчёта дней в году:
- 📅
0или опущен — метод "30/360" (используется в США) - 📅
1— фактическое количество дней / фактическое количество дней - 📅
2— фактическое количество дней / 360 - 📅
3— фактическое количество дней / 365 - 📅
4— европейский метод "30/360"
Пример для расчёта срока вклада с 01.01.2020 по 31.12.2023:
=ДОЛЯГОДА("01.01.2020"; "31.12.2023"; 1)
Результат — 4,0 (точные календарные годы). Если нужно округлить до целого, оберните функцию в ОКРУГЛВНИЗ:
=ОКРУГЛВНИЗ(ДОЛЯГОДА("01.01.2020"; "31.12.2023"; 1); 0)
Способ 3: Формула с YEAR и условием для дней рождения
Если вам нужно учитывать точную дату события (например, день рождения), когда полный год наступает только после прохождения месяца и дня, используйте эту комбинацию:
=ЕСЛИ(ИЛИ(МЕСЯЦ(конечная_дата)<МЕСЯЦ(начальная_дата); И(МЕСЯЦ(конечная_дата)=МЕСЯЦ(начальная_дата); ДЕНЬ(конечная_дата)<ДЕНЬ(начальная_дата)))); ГОД(конечная_дата)-ГОД(начальная_дата)-1; ГОД(конечная_дата)-ГОД(начальная_дата))
Разберём на примере: человек родился 29.02.2000, а сегодня 28.02.2023. Простое вычитание годов даст 23, но фактически полных лет ещё нет (день рождения в високосном дне). Формула вернёт 22.
| Начальная дата | Конечная дата | Простое вычитание годов | Формула с условием | Правильный результат |
|---|---|---|---|---|
| 15.05.1990 | 14.05.2023 | 33 | 32 | 32 (день рождения не наступил) |
| 29.02.2000 | 28.02.2023 | 23 | 22 | 22 (високосный день) |
| 31.12.2019 | 01.01.2023 | 3 | 3 | 3 (точная дата) |
Почему формула не работает для 29 февраля в невисокосные годы?
Excel автоматически преобразует 29.02.2023 в 01.03.2023, так как 2023 год не високосный. Чтобы избежать ошибок, используйте функцию ДАТА для корректировки даты:
=ЕСЛИ(ДЕНЬ(начальная_дата)=29; ЕСЛИ(МЕСЯЦ(начальная_дата)=2; ДАТА(ГОД(конечная_дата); 3; 1); начальная_дата); начальная_дата)
Способ 4: Power Query для массовой обработки дат
Если у вас тысячи строк с датами (например, база клиентов или инвентаризационные данные), ручной ввод формул займёт слишком много времени. В этом случае используйте Power Query — инструмент для преобразования данных, встроенный в Excel 2016 и новее.
Алгоритм действий:
- Выделите таблицу с датами.
- Перейдите на вкладку
Данные→Из таблицы/диапазона(илиGet Data → From Table/Rangeв английской версии). - В редакторе Power Query добавьте настраиваемый столбец с формулой:
=Date.Year([КонечнаяДата]) - Date.Year([НачальнаяДата]) - If Date.From([КонечнаяДата]) < Date.From(Date.StartOfYear([КонечнаяДата]) + #duration(Date.DaysInMonth(Date.StartOfYear([НачальнаяДата])) * [МесяцРождения] + [ДеньРождения])) then 1 else 0 - Замените
[КонечнаяДата]и[НачальнаяДата]на названия ваших столбцов. - Нажмите
Закрыть и загрузить.
Преимущество этого метода — автоматическое обновление результатов при изменении исходных данных. Например, если вы ежемесячно добавляете новые записи о клиентах, Power Query пересчитает возраст для всех строк без ручного вмешательства.
Ручные формулы (DATEDIF, YEAR)|Power Query|VBA-скрипты|Другие способы|Не рассчитывал раньше-->
Способ 5: VBA-скрипт для автоматизации расчётов
Для пользователей, работающих с макросами, есть ещё один способ — создать собственную функцию на VBA. Откройте редактор скриптов (Alt + F11), вставьте новый модуль и добавьте этот код:
Function FullYears(startDate As Date, endDate As Date) As Integer
Dim startYear As Integer, endYear As Integer
startYear = Year(startDate)
endYear = Year(endDate)
' Проверяем, прошёл ли день рождения в текущем году
If Month(endDate) > Month(startDate) Or _
(Month(endDate) = Month(startDate) And Day(endDate) >= Day(startDate)) Then
FullYears = endYear - startYear
Else
FullYears = endYear - startDate - 1
End If
End Function
Теперь в любой ячейке можно использовать эту функцию как стандартную:
=FullYears(A2; B2)
где A2 — начальная дата, B2 — конечная.
Преимущества VBA:
- 🔄 Гибкость: можно добавить обработку ошибок (например, если конечная дата раньше начальной).
- 📊 Производительность: скрипт работает быстрее, чем сложные формулы в больших таблицах.
- 🔒 Безопасность: код выполняется локально, без передачи данных в облако.
⚠️ Внимание: Перед использованием VBA убедитесь, что в настройках Excel разрешено выполнение макросов (Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов). В противном случае функция не будет работать.
Типичные ошибки и как их избежать
Даже опытные пользователи Excel иногда сталкиваются с неожиданными результатами при работе с датами. Вот самые распространённые ошибки и способы их исправления:
- Дата в формате текста: Если ячейка содержит текст (например,
"15.05.1990"вместо даты), Excel не сможет её обработать. Исправление:- 🔄 Используйте
ДАТАЗНАЧ(DATEVALUE):=ДАТАЗНАЧ("15.05.1990") - 🔄 Или преобразуйте столбец через
Текст по столбцам(Data → Text to Columns).
- 🔄 Используйте
MM/DD/YYYY, а в российском — DD.MM.YYYY. Если вы скопировали данные из иностранного источника, Excel может неправильно интерпретировать месяц и день. Проверьте формат ячейки (Ctrl + 1).ДАТАРАЗН и ДОЛЯГОДА вернут ошибку. Добавьте проверку:
=ЕСЛИ(B2
FAQ: Ответы на частые вопросы
Можно ли в Excel посчитать количество лет с учётом високосных годов?
Да, для этого используйте функцию ДОЛЯГОДА с базисом 1 (фактическое количество дней). Она автоматически учитывает високосные годы. Например:
=ДОЛЯГОДА("29.02.2020"; "28.02.2026"; 1)
вернёт 4,0, так как 2020 и 2026 годы — високосные.
Как посчитать возраст в годах, месяцах и днях одновременно?
Используйте функцию ДАТАРАЗН с разными кодами:
=ДАТАРАЗН(A2; B2; "Y") & " лет, " & ДАТАРАЗН(A2; B2; "YM") & " мес., " & ДАТАРАЗН(A2; B2; "MD") & " дн."
Где "YM" — месяцы без учёта лет, а "MD" — дни без учёта месяцев и лет.
Почему функция ДАТАРАЗН не работает в Excel Online?
Функция ДАТАРАЗН доступна в настольной версии Excel, но может отсутствовать в Excel Online или мобильных приложениях. Альтернатива — использовать комбинацию ГОД, МЕСЯЦ и ДЕНЬ, как описано в Способе 3.
Как посчитать количество лет между датами в Google Sheets?
В Google Таблицах функция DATEDIF работает аналогично Excel, но есть нюанс: её нужно вводить на английском, даже в русской версии. Пример:
=DATEDIF("15.05.1990"; "10.08.2023"; "Y")
Также доступны функции YEARFRAC и ARRAYFORMULA для массовых расчётов.
Можно ли посчитать возраст в годах с учётом только полных месяцев?
Да, для этого модифицируйте формулу из Способа 3, добавив проверку на месяц:
=ЕСЛИ(МЕСЯЦ(конечная_дата)<МЕСЯЦ(начальная_дата); ГОД(конечная_дата)-ГОД(начальная_дата)-1; ГОД(конечная_дата)-ГОД(начальная_дата))
Эта формула вернёт полные годы только если прошёл полный месяц с даты события (например, для расчёта стажа работы).