Почему стандартное вычитание дат не работает
На первый взгляд, расчёт возраста в Microsoft Excel кажется тривиальной задачей: достаточно вычесть дату рождения из текущей даты. Однако такой подход даёт некорректный результат — вместо полных лет программа вернёт общее количество дней между датами. Например, если сегодня 15 мая 2026 года, а дата рождения — 10 мая 1990 года, простое вычитание покажет 12 780 дней, а не 33 года.
Проблема кроется в формате хранения дат: Excel оперирует ими как числовыми значениями, где 1 соответствует 1 января 1900 года. Чтобы получить возраст в годах, месяцах или днях, требуются специальные функции обработки дат — ДАТА(), ГОД(), ДОЛЯГОДА() и другие. Более того, нужно учитывать високосные годы, разную продолжительность месяцев и даже временные зоны (если даты рождения привязаны к разным регионам).
В этой статье мы разберём 5 надёжных способов расчёта возраста — от базовых формул до динамических решений с автоматическим обновлением при изменении текущей даты. Все примеры протестированы в Excel 2010–2023 и Office 365, включая веб-версию.
Способ 1: Простая формула с функцией ГОД
Самый распространённый метод — использование комбинации функций ГОД() и СЕГОДНЯ(). Формула выглядит так:
=ГОД(СЕГОДНЯ()) - ГОД(A2)
где A2 — ячейка с датой рождения. Эта формула вернёт разницу в полных годах, но с одной оговоркой: если день рождения ещё не наступил в текущем году, результат будет завышен на 1. Например, если сегодня 15 мая, а дата рождения — 20 декабря, Excel покажет возраст на год больше реального.
Чтобы исправить это, добавьте проверку с функцией ЕСЛИ():
=ГОД(СЕГОДНЯ()) - ГОД(A2) - ЕСЛИ(ДАТА(ГОД(СЕГОДНЯ()); МЕСЯЦ(A2); ДЕНЬ(A2)) > СЕГОДНЯ(); 1; 0)
Убедитесь, что дата рождения введена в формате ДД.ММ.ГГГГ|Проверьте региональные настройки (в русских версиях Excel разделитель — точка)|Используйте СЕГОДНЯ() только для динамического расчёта (при печати она не обновится)-->
Способ 2: Функция ДОЛЯГОДА для точного возраста
Если вам нужен возраст не только в полных годах, но и с учётом месяцев/дней, используйте функцию ДОЛЯГОДА(). Она возвращает долю года между двумя датами в виде десятичного числа (например, 33,25 для 33 лет и 3 месяцев). Базовая формула:
=ДОЛЯГОДА(A2; СЕГОДНЯ(); 1)
Аргумент 1 в конце указывает на метод расчёта (по фактическим дням). Чтобы преобразовать результат в годы, месяцы и дни, добавьте дополнительные вычисления:
=ЦЕЛОЕ(ДОЛЯГОДА(A2; СЕГОДНЯ(); 1)) & " лет, " & ОСТАТ(ЦЕЛОЕ(ДОЛЯГОДА(A2; СЕГОДНЯ(); 1)*12); 12) & " мес."
⚠️ Внимание: ФункцияДОЛЯГОДА()может давать погрешность в 1 день из-за особенностей обработки високосных годов. Для критических расчётов (например, в страховых компаниях) используйте альтернативный метод с функциейДАТАРАЗН().
| Формула | Результат для даты 15.05.1990 (на 15.05.2026) |
Особенности |
|---|---|---|
=ГОД(СЕГОДНЯ())-ГОД(A2) |
34 |
Завышает на 1 год, если ДР не наступил |
=ДОЛЯГОДА(A2;СЕГОДНЯ();1) |
34,0 |
Точный расчёт с дробной частью |
=РАЗНДАТ(A2;СЕГОДНЯ();"y") |
34 |
Работает только в английских версиях Excel |
Способ 3: Функция РАЗНДАТ (DATEDIF) — скрытая возможность Excel
Функция РАЗНДАТ() (или DATEDIF в английской версии) специально создана для расчёта разницы между датами, но по умолчанию не отображается в списке функций. Она поддерживает 6 режимов вывода:
- 📅
"y"— полные годы (=РАЗНДАТ(A2;СЕГОДНЯ();"y")) - 📆
"m"— полные месяцы (=РАЗНДАТ(A2;СЕГОДНЯ();"m")) - ⏳
"d"— полные дни (=РАЗНДАТ(A2;СЕГОДНЯ();"d")) - 🔄
"ym"— месяцы с учётом годов (=РАЗНДАТ(A2;СЕГОДНЯ();"ym")) - 📏
"yd"— дни с учётом годов (=РАЗНДАТ(A2;СЕГОДНЯ();"yd")) - 📊
"md"— разница в днях без учёта месяцев и лет
Пример комплексного расчёта возраста в формате "X лет, Y месяцев, Z дней":
=РАЗНДАТ(A2;СЕГОДНЯ();"y") & " лет, " & РАЗНДАТ(A2;СЕГОДНЯ();"ym") & " мес., " & РАЗНДАТ(A2;СЕГОДНЯ();"md") & " дн."
Почему РАЗНДАТ не видна в списке функций?
Функция РАЗНДАТ() была добавлена в Excel для совместимости с Lotus 1-2-3 и официально не документирована. Она работает во всех версиях, но не отображается в мастер-функций. Введите её вручную или используйте автозаполнение после первых символов.
⚠️ Внимание: В русских версиях Excel до 2016 года функция может требовать английского названияDATEDIF. Если формула возвращает ошибку#ИМЯ?, заменитеРАЗНДАТнаDATEDIF.
Способ 4: Динамический расчёт с учётом временных зон
Если даты рождения привязаны к разным часовым поясам (например, в международных базах данных), стандартные формулы могут давать погрешность ±1 день. Для точного расчёта используйте комбинацию функций ДАТАЗНАЧ() и ВРЕМЯЗНАЧ():
=РАЗНДАТ(ДАТАЗНАЧ(A2)&ВРЕМЯЗНАЧ(B2); СЕГОДНЯ(); "y")
где A2 — дата рождения, а B2 — время (например, "12:00"). Этот метод актуален для:
- 🌍 Медицинских систем с данными пациентов из разных стран
- ✈️ Авиационных компаний (расчёт возраста экипажа)
- 🏦 Банковских приложений (верификация клиентов)
Для упрощения создайте пользовательскую функцию на VBA:
Function ВОЗРАСТ_ПОЛНЫЙ(датарожд As Date) As String
Dim годы As Integer, месяцы As Integer, дни As Integer
годы = DateDiff("yyyy", датарожд, Date)
месяцы = DateDiff("m", DateSerial(Year(датарожд), Month(датарожд), Day(датарожд)), Date) Mod 12
дни = DateDiff("d", DateSerial(Year(Date), Month(датарожд), Day(датарожд)), Date)
ВОЗРАСТ_ПОЛНЫЙ = годы & " лет, " & месяцы & " мес., " & дни & " дн."
End Function
После добавления этого кода в редактор VBA (Alt+F11) вы сможете использовать функцию =ВОЗРАСТ_ПОЛНЫЙ(A2).
Ctrl+; — вставляет сегодняшнюю дату,
Ctrl+Shift+; — текущее время.-->
Способ 5: Расчёт возраста на конкретную дату (не сегодня)
Если нужно узнать возраст человека на определённую дату в прошлом или будущем (например, на момент трудоустройства), замените СЕГОДНЯ() на фиксированную дату. Формула примет вид:
=РАЗНДАТ(A2; ДАТА(2026;12;31); "y")
где ДАТА(2026;12;31) — целевая дата (31 декабря 2026 года). Этот метод полезен для:
- 📅 Планирования выходов на пенсию
- 🎓 Расчёта возраста учеников на 1 сентября
- 🏆 Определения спортивных категорий по возрасту
Чтобы автоматизировать процесс, создайте таблицу с колонками:
| Дата рождения | Целевая дата | Формула | Результат |
|---|---|---|---|
15.05.1990 |
01.09.2026 |
=РАЗНДАТ(A2;B2;"y") |
34 |
10.12.2000 |
31.12.2030 |
=РАЗНДАТ(A3;B3;"y") |
30 |
Типичные ошибки и как их избежать
Даже опытные пользователи Excel сталкиваются с проблемами при расчёте возраста. Вот самые распространённые ошибки и их решения:
- Ошибка #ИМЯ? — возникает при опечатках в названиях функций. Проверьте регистр и языковые настройки. В русских версиях Excel используйте
РАЗНДАТ, в английских —DATEDIF. - Неправильный формат ячейки — если дата отображается как число (например,
45341), измените формат наДатачерезГлавная → Формат → Формат ячеек. - Погрешность в 1 день — появляется из-за различия в обработке времени. Используйте
ЦЕЛОЕ()для округления:=ЦЕЛОЕ(ДОЛЯГОДА(A2;СЕГОДНЯ();1)). - Зависание файла — при работе с большими массивами дат (10 000+ строк) отключите автоматический пересчёт:
Формулы → Параметры вычислений → Вручную.
Особое внимание уделите региональным настройкам. В американских версиях Excel даты по умолчанию вводятся как ММ/ДД/ГГГГ, а в российских — ДД.ММ.ГГГГ. Если формула возвращает неверный результат, проверьте формат ячейки:
ПКМ по ячейке → Формат ячеек → Число → Дата → Выберите "14.03.2012"
FAQ: Ответы на частые вопросы
Можно ли рассчитать возраст без использования функций?
Технически да, но это потребует ручного ввода промежуточных данных. Например:
- Создайте колонку с текущим годом (
=ГОД(СЕГОДНЯ())). - Вычтите год рождения из текущего года.
- Добавьте колонку с проверкой "прошёл ли день рождения в этом году" (используйте
ЕСЛИ).
Однако такой подход занимает больше времени и подвержен ошибкам при копировании формул.
Почему функция ДОЛЯГОДА даёт результат 33,99 вместо 34?
Это связано с методом расчёта (аргумент базис). По умолчанию (базис=0) используется американская система (30/360), где каждый месяц считается как 30 дней, а год — как 360. Для точного расчёта используйте базис=1 (фактическое количество дней):
=ДОЛЯГОДА(A2; СЕГОДНЯ(); 1)
Как рассчитать возраст в годах, месяцах и днях отдельно?
Используйте комбинацию функций РАЗНДАТ с разными аргументами:
- Годы:
=РАЗНДАТ(A2;СЕГОДНЯ();"y") - Месяцы:
=РАЗНДАТ(A2;СЕГОДНЯ();"ym") - Дни:
=РАЗНДАТ(A2;СЕГОДНЯ();"md")
Для вывода в одной ячейке объедините их через &:
=РАЗНДАТ(A2;СЕГОДНЯ();"y") & " г. " & РАЗНДАТ(A2;СЕГОДНЯ();"ym") & " м. " & РАЗНДАТ(A2;СЕГОДНЯ();"md") & " д."
Работает ли РАЗНДАТ в Google Sheets?
Да, но с синтаксическими различиями. В Google Таблицах используйте английскую версию функции:
=DATEDIF(A2; TODAY(); "y")
Также доступны дополнительные аргументы, например "y*m" для вывода в формате "34y 2m".
Как автоматически обновлять возраст при открытии файла?
Функция СЕГОДНЯ() пересчитывается при каждом открытии книги или изменении ячейки. Если обновление не происходит:
- Проверьте настройки:
Формулы → Параметры вычислений → Автоматически. - Убедитесь, что файл не открыт в режиме
Только для чтения. - Для принудительного пересчёта нажмите
F9.
В макросах используйте Application.CalculateFull для принудительного обновления всех формул.