Почему простой вычитание дат не работает (и что делать вместо этого)
Вы когда-нибудь пытались в Microsoft Excel просто вычесть дату рождения из текущей даты, чтобы получить возраст? Если да, то наверняка сталкивались с тем, что результат выходит в формате 45.678 вместо привычных 45 лет. Это происходит потому, что Excel хранит даты как последовательные числа (начиная с 1 января 1900 года), а не как календарные значения. Чтобы получить корректный возраст в годах, месяцах или днях, нужны специальные формулы.
В этой статье мы разберём 5 рабочих способов преобразования даты рождения в возраст — от простейших функций до автоматизированных решений с учётом текущей даты. Вы узнаете, как:
- 🔹 Использовать функцию
ДАТАРАЗНдля точного расчёта с учётом месяцев и дней - 🔹 Применять
ГОДСЕГОДНЯиДАТАдля динамического обновления возраста - 🔹 Автоматизировать процесс с помощью Power Query (для больших таблиц)
- 🔹 Избежать ошибок при работе с високосными годами и неполными месяцами
Все методы протестированы в Excel 2010–2026 (включая Microsoft 365) и работают как на Windows, так и на macOS. Если вы работаете с Google Sheets, majority формул также применимы с минимальными правками.
Способ 1: Функция ДАТАРАЗН — самый точный метод
Функция ДАТАРАЗН (или DATEDIF в английской версии) специально создана для вычисления разницы между двумя датами в годах, месяцах или днях. Её главный плюс — учёта неполных периодов. Например, если человек родился 15 марта, а сегодня 10 марта, функция правильно покажет, что полных лет ещё не исполнилось.
Синтаксис функции:
=ДАТАРАЗН(дата_рождения; сегодня; "Y")
Где:
- 📅
дата_рождения— ячейка с датой (например,A2) - 📅
сегодня— текущая дата (можно использоватьСЕГОДНЯ()) - 🔤
"Y"— код для возврата полных лет (другие варианты:"M"— месяцы,"D"— дни)
Пример для ячейки B2:
=ДАТАРАЗН(A2; СЕГОДНЯ(); "Y")
Формат ячейки с датой рождения — "Дата" (не "Текст")|Текущая дата обновляется автоматически (используйте СЕГОДНЯ())|Для месяцев и дней используйте "YM" и "MD" соответственно|Проверьте региональные настройки (в некоторых версиях Excel функция скрыта)
-->
⚠️ Внимание: В Excel 2016 и новее функция ДАТАРАЗН может не отображаться в списке автозаполнения, но она работает! Введите её вручную.
| Код | Значение | Пример результата |
|---|---|---|
"Y" |
Полные годы | 25 (если разница 25 лет и 3 месяца) |
"M" |
Полные месяцы | 305 (25 лет и 5 месяцев) |
"D" |
Полные дни | 9131 (25 лет) |
"YM" |
Месяцы без учёта лет | 5 (если разница 25 лет и 5 месяцев) |
"MD" |
Дни без учёта месяцев и лет | 15 (если разница 25 лет, 5 месяцев и 15 дней) |
Способ 2: Комбинация ГОДСЕГОДНЯ и ДАТА — для динамического возраста
Если вам нужно, чтобы возраст автоматически обновлялся при открытии файла, используйте сочетание функций ГОДСЕГОДНЯ() (или YEAR(TODAY())) и ДАТА(). Этот метод проще, чем ДАТАРАЗН, но не учитывает месяцы и дни — только полные годы.
Формула:
=ГОД(СЕГОДНЯ()) - ГОД(A2)
Где A2 — ячейка с датой рождения. Однако у этого способа есть критическая ошибка: если день рождения ещё не наступил в текущем году, формула покажет завышенный возраст (например, 26 вместо 25). Чтобы исправить это, добавьте проверку:
=ГОД(СЕГОДНЯ()) - ГОД(A2) - ЕСЛИ(ИЛИ(МЕСЯЦ(СЕГОДНЯ())<МЕСЯЦ(A2); И(МЕСЯЦ(СЕГОДНЯ())=МЕСЯЦ(A2); ДЕНЬ(СЕГОДНЯ())<ДЕНЬ(A2))); 1; 0)
Эта формула проверяет:
- Если текущий месяц меньше месяца рождения → вычитает 1 год
- Если месяцы равны, но день текущий меньше дня рождения → тоже вычитает 1 год
⚠️ Внимание: В Excel для Mac функцияДЕНЬ()может конфликтовать с форматом даты. Если получаете ошибку, используйтеДЕНЬМЕС(A2)вместоДЕНЬ(A2).
Способ 3: Формула массива для возраста в годах, месяцах и днях
Если вам нужно вывести возраст в формате 25 лет, 3 месяца, 15 дней, используйте формулу массива. Она сложнее предыдущих, но даёт максимально детализированный результат.
Введите эту формулу в ячейку и завершите нажатием Ctrl+Shift+Enter (в новых версиях Excel просто Enter):
=ТЕКСТ(ЦЕЛОЕ((СЕГОДНЯ()-A2)/365);"0") & " лет, " & ТЕКСТ(ЦЕЛОЕ(ОСТАТ((СЕГОДНЯ()-A2);365)/30,44);"0") & " мес., " & ТЕКСТ(ОСТАТ(ОСТАТ(СЕГОДНЯ()-A2;365);30,44);"0") & " дн."
Разберём компоненты:
- 🔢
(СЕГОДНЯ()-A2)/365— разница в годах (приблизительно) - 🔢
ОСТАТ(...,365)— остаток дней после вычитания полных лет - 🔢
30,44— среднее количество дней в месяце (учитывает високосные годы) - 📝
ТЕКСТ(..., "0")— преобразует числа в текст без десятичных знаков
Почему именно 30,44 дня в месяце?
Этот коэффициент учитывает, что в году 365.25 дней (с учётом високосных лет), а в среднем месяце — 365.25/12 ≈ 30.44 дня. Это точнее, чем просто делить на 30.
Для упрощения можно разбить формулу на отдельные ячейки:
| Ячейка | Формула | Результат |
|---|---|---|
B2 |
=ЦЕЛОЕ((СЕГОДНЯ()-A2)/365) |
25 (лет) |
C2 |
=ЦЕЛОЕ(ОСТАТ((СЕГОДНЯ()-A2);365)/30,44) |
3 (месяца) |
D2 |
=ОСТАТ(ОСТАТ(СЕГОДНЯ()-A2;365);30,44) |
15 (дней) |
Способ 4: Power Query для массовой обработки дат
Если у вас таблица с тысячами записей (например, база клиентов или сотрудников), ручной расчёт возраста займёт часы. В этом случае используйте Power Query — инструмент для автоматизации обработки данных.
Пошаговая инструкция:
- Выделите таблицу с датами рождения → вкладка
Данные→Из таблицы/диапазона(в Excel 2016+). - В открывшемся редакторе Power Query выберите столбец с датой рождения →
Добавить столбец→Настраиваемый столбец. - Введите формулу:
Date.From(DateTime.LocalNow()) - [Дата рождения](где
[Дата рождения]— название вашего столбца). - Нажмите
OK, затемЗакрыть и загрузить.
Результат: новый столбец с разницей в днях. Чтобы преобразовать его в годы, добавьте ещё один настраиваемый столбец с формулой:
= Number.RoundDown([Разница в днях]/365)
Преимущества метода:
- ⚡ Обрабатывает миллионы строк за секунды
- 🔄 Автоматически обновляет возраст при изменении исходных данных
- 📊 Позволяет добавлять дополнительные вычисления (например, категоризацию по возрастным группам)
Способ 5: VBA-скрипт для автоматизации (для продвинутых пользователей)
Если вам нужно не только рассчитать возраст, но и автоматизировать другие действия (например, отправлять уведомления о днях рождения), используйте VBA (Visual Basic for Applications). Этот метод требует базовых знаний программирования, но даёт максимальную гибкость.
Пример скрипта для добавления столбца с возрастом:
Sub CalculateAge()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Добавляем заголовок столбца "Возраст"
ws.Range("B1").Value = "Возраст"
' Рассчитываем возраст для каждой строки
For i = 2 To lastRow
ws.Range("B" & i).Value = Application.WorksheetFunction.DatedIf(ws.Range("A" & i).Value, Date, "Y")
Next i
End Sub
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в новый модуль (
Insert → Module). - Запустите макрос кнопкой
F5.
⚠️ Внимание: Перед запуском макроса сохраните файл в формате.xlsm(с поддержкой макросов), иначе скрипт не сработает. Также проверьте, что даты в столбцеAимеют формат "Дата", а не "Текст".
Для расширенной функциональности (например, вывода возраста в формате 25 лет, 3 мес.) модифицируйте скрипт:
ws.Range("B" & i).Value = "Год(а): " & Application.WorksheetFunction.DatedIf(ws.Range("A" & i).Value, Date, "Y") & _
", Мес.: " & Application.WorksheetFunction.DatedIf(ws.Range("A" & i).Value, Date, "YM")
Типичные ошибки и как их избежать
Даже опытные пользователи Excel допускают ошибки при работе с датами. Вот наиболее распространённые проблемы и их решения:
| Ошибка | Причина | Решение |
|---|---|---|
#ЗНАЧ! в ячейке с возрастом |
Ячейка с датой рождения пустая или содержит текст | Проверьте данные функцией =ЕТЕКСТ(A2). Если возвращает ИСТИНА, исправьте формат ячейки на "Дата". |
| Возраст на 1 год больше реального | Не учтён день рождения в текущем году | Используйте формулу с проверкой (см. Способ 2) или ДАТАРАЗН. |
Даты отображаются как числа (например, 44927) |
Ячейка имеет общий формат, а не "Дата" | Выделите ячейку → Формат ячеек → выберите "Дата". |
Функция ДАТАРАЗН не работает |
Опечатка в названии или региональные настройки | Введите функцию вручную на английском: =DATEDIF(A2,TODAY(),"Y"). |
| Возраст не обновляется при открытии файла | Отключено автоматическое пересчёта формул | Перейдите в Формулы → Параметры вычислений → Автоматически. |
Ещё одна частая проблема — високосные годы. Например, если человек родился 29 февраля, а текущий год не високосный, Excel может неправильно рассчитать возраст. Чтобы избежать этого, используйте ДАТАРАЗН с кодом "Y" — она корректно обрабатывает такие случаи.
=ЕСЛИ(ИЛИ(ОСТАТ(ГОД(A2);400)=0; И(ОСТАТ(ГОД(A2);4)=0; ОСТАТ(ГОД(A2);100)<>0)); "Да"; "Нет")
-->
FAQ: Ответы на частые вопросы
Можно ли рассчитать возраст без учёта текущей даты (например, на конкретную дату в прошлом)?
Да! Замените СЕГОДНЯ() на фиксированную дату в формате ДАТА(год;месяц;день). Например, для расчёта возраста на 31 декабря 2023 года:
=ДАТАРАЗН(A2; ДАТА(2023;12;31); "Y")
Как посчитать возраст в Excel Online или Google Sheets?
В Excel Online и Google Sheets работают те же формулы, но:
- 🔹 В Google Sheets функция
ДАТАРАЗНназывается=DATEDIF(английская версия). - 🔹 Для текущей даты используйте
=TODAY()(вместоСЕГОДНЯ()). - 🔹 Формулы массива в Google Sheets не требуют
Ctrl+Shift+Enter.
Как вывести возраст в формате "25 лет и 3 месяца" без дней?
Используйте комбинацию ДАТАРАЗН с конкатенацией:
=ДАТАРАЗН(A2; СЕГОДНЯ(); "Y") & " лет и " & ДАТАРАЗН(A2; СЕГОДНЯ(); "YM") & " мес."
Для корректного склонения ("год", "года", "лет") добавьте функцию ВЫБОР:
=ДАТАРАЗН(A2; СЕГОДНЯ(); "Y") & " " & ВЫБОР(ДАТАРАЗН(A2; СЕГОДНЯ(); "Y") MOD 100; "год"; ВЫБОР(ДАТАРАЗН(A2; СЕГОДНЯ(); "Y") MOD 10; 1; "год"; 2; "года"; 3; "года"; 4; "года"; "лет"); "лет")
Как рассчитать возраст для даты рождения в формате "дд.мм.гггг" (текст)?
Если дата хранится как текст (например, "15.05.1990"), сначала преобразуйте её в формат "Дата" с помощью:
=ДАТАЗНАЧ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;".";"/"); " "; ""))
Затем используйте полученное значение в формулах для расчёта возраста.
Можно ли автоматически обновлять возраст в Excel при изменении даты в другой ячейке?
Да! Если текущая дата хранится не в СЕГОДНЯ(), а в отдельной ячейке (например, C1), все формулы будут пересчитываться при её изменении. Например:
=ДАТАРАЗН(A2; C1; "Y")
Это полезно для моделирования ситуаций (например, "каким будет возраст через 5 лет").