Работа с датами в Microsoft Excel — одна из самых востребованных задач при ведении отчётности, планировании проектов или анализе временных рядов. Но статичные даты быстро теряют актуальность: вчерашний отчёт с фиксированной датой "01.01.2026" уже сегодня вводит в заблуждение. Решение — динамическая привязка к текущей дате, которая автоматически обновляется при каждом открытии файла или пересчёте формул.
В этой статье разберём все способы привязки к актуальной дате — от элементарной функции СЕГОДНЯ() до сложных конструкций с Power Query и VBA. Вы узнаете, как:
- 🔹 Вставлять текущую дату, которая обновляется автоматически
- 🔹 Фиксировать дату создания файла, но показывать актуальный день недели
- 🔹 Создавать динамические диапазоны для отчётов "за последние 7 дней"
- 🔹 Обходить ограничения Excel с помощью макросов
Особое внимание уделим скрытым ловушкам Excel: почему функция СЕГОДНЯ() может "зависнуть" в shared-режиме, как формат ячейки влияет на отображение даты, и почему в некоторых версиях Office 365 дата обновляется только после ручного пересчёта.
1. Базовый способ: функция СЕГОДНЯ() и её аналоги
Самый простой метод — использовать встроенную функцию =СЕГОДНЯ() (или =TODAY() в английской версии). Она возвращает текущую дату в формате последовательного номера, который Excel автоматически преобразует в привычный вид (например, "15.05.2026").
Как это работает:
- Выделите ячейку, где должна отображаться дата
- Введите формулу:
=СЕГОДНЯ() - Нажмите
Enter— ячейка покажет сегодняшнюю дату
Важные нюансы:
- 📅 Дата обновляется только при пересчёте листа (открытие файла, изменение любой ячейки, нажатие
F9) - ⏱️ Время не отображается — для этого нужна функция
ТДАТА()(NOW()) - 🔄 В Google Sheets работает аналогично, но обновляется чаще (каждые 30 минут)
⚠️ Внимание: Если вы сохраните файл в формате.xls(Excel 97-2003), функцияСЕГОДНЯ()перестанет обновляться при открытии в новых версиях Office. Используйте.xlsxили.xlsm.
Для отображения времени вместе с датой используйте:
=ТДАТА()
=СЕГОДНЯ()+СЕЙЧАС()-ЦЕЛОЕ(СЕЙЧАС())
2. Динамические диапазоны: "Последние 7 дней" и подобные
Частая задача — создать отчёт, который всегда показывает данные за последнюю неделю, текущий месяц или другой динамический период. Здесь пригодится комбинация функций СЕГОДНЯ() с арифметическими операциями.
Примеры формул для фильтрации:
| Задача | Формула | Пример результата (15.05.2026) |
|---|---|---|
| Последние 7 дней | =И(A2>=СЕГОДНЯ()-7; A2<=СЕГОДНЯ()) | 08.05.2026–15.05.2026 |
| Текущий месяц | =И(МЕСЯЦ(A2)=МЕСЯЦ(СЕГОДНЯ()); ГОД(A2)=ГОД(СЕГОДНЯ())) | 01.05.2026–31.05.2026 |
| Последний квартал | =И(A2>ДАТА(ГОД(СЕГОДНЯ()); МЕСЯЦ(СЕГОДНЯ())-3; 1); A2<=СЕГОДНЯ()) | 01.02.2026–15.05.2026 |
| Будущие 30 дней | =И(A2>=СЕГОДНЯ(); A2<=СЕГОДНЯ()+30) | 15.05.2026–14.06.2026 |
Чтобы применить эти формулы:
- Создайте столбец с датами (например, столбец
A) - В соседнем столбце введите одну из формул выше
- Растяните формулу на весь диапазон
- Примените автофильтр и отфильтруйте по значению
ИСТИНА
Формула возвращает ИСТИНА/ЛОЖЬ|
Диапазон дат корректно фильтруется|
При изменении текущей даты фильтр обновляется|
Формат ячеек с датами — "Дата" (не "Общий")-->
Для создания динамического именованного диапазона (например, для графиков):
- Перейдите на вкладку
Формулы → Диспетчер имён → Создать - В поле "Имя" введите
ПоследняяНеделя - В поле "Диапазон" введите:
=СМЕЩ($A$1;0;0;СЧЁТЕСЛИ($A:$A;">="&СЕГОДНЯ()-7);1) - Теперь в формулах можно ссылаться на
=ПоследняяНеделя
3. Фиксированная дата создания + текущий день недели
Иногда нужно зафиксировать дату создания файла или начала проекта, но при этом показывать актуальный день недели. Например: "Проект стартовал 10.05.2026 (среда), сегодня 15.05.2026 (понедельник)".
Решение:
- 📌 Для фиксированной даты используйте
CTRL+;(горячие клавиши для вставки статической даты) - 🔄 Для динамического дня недели:
=ТЕКСТ(СЕГОДНЯ();"dddd")=ВЫБР(НЕДЕЛЯ(СЕГОДНЯ());"вс";"пн";"вт";"ср";"чт";"пт";"сб")
Пример комбинированной формулы для ячейки:
"Проект стартовал "&ТЕКСТ(B2;"dd.mm.yyyy")&" ("&ТЕКСТ(B2;"dddd")&"), сегодня "&ТЕКСТ(СЕГОДНЯ();"dd.mm.yyyy")&" ("&ТЕКСТ(СЕГОДНЯ();"dddd")&")"
⚠️ Внимание: ФункцияТЕКСТ()зависит от региональных настроек Windows. Если вместо "понедельник" отображается "Monday", измените язык системы или используйтеВЫБР()с ручным перечислением дней.
Как сделать многоязычную дату?
Используйте конструкцию:
=ЕСЛИ(ЯЗЫК()="ru"; ТЕКСТ(СЕГОДНЯ();"dddd"); ЕСЛИ(ЯЗЫК()="en"; TEXT(TODAY();"dddd"); ""))
Это позволит автоматически подставлять день недели на русском или английском в зависимости от настроек Excel.
4. Автоматизация через VBA: обновление по таймеру
Функции СЕГОДНЯ() и ТДАТА() обновляются только при пересчёте листа. Если вам нужно обновление даты каждую минуту (например, для дашборда в реальном времени), потребуется макрос.
Код для автоматического обновления каждую минуту:
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:01:00"), "UpdateTime"
End Sub
Sub UpdateTime()
Application.CalculateFull
Application.OnTime Now + TimeValue("00:01:00"), "UpdateTime"
End Sub
Как установить:
- Нажмите
ALT+F11для открытия редактора VBA - В окне
ProjectнайдитеThisWorkbookи дважды кликните - Вставьте первый код в открывшееся окно
- В меню выберите
Insert → Moduleи вставьте второй код - Сохраните файл как
.xlsm(с поддержкой макросов)
Теперь дата будет обновляться каждую минуту, даже если файл не редактировать.
Sub StopAutoUpdate()
On Error Resume Next
Application.OnTime Now + TimeValue("00:01:00"), "UpdateTime", , False
On Error GoTo 0
End Sub
И запускайте её перед закрытием файла.-->
5. Power Query: динамические даты в импортированных данных
Если вы работаете с внешними источниками данных (SQL, CSV, веб), привязка к текущей дате через Power Query позволит фильтровать данные на этапе загрузки.
Пошаговая инструкция:
- Загрузите данные через
Данные → Получить данные - В редакторе Power Query добавьте столбец с текущей датой:
= DateTime.LocalNow() - Создайте параметр для динамической фильтрации:
(StartDate as date, EndDate as date) =>let
Source = YourDataSource,
Filtered = Table.SelectRows(Source, each [DateColumn] >= StartDate and [DateColumn] <= EndDate)
in
Filtered
- Примените параметр с аргументами:
= YourFunction(DateTime.LocalNow().AddDays(-7), DateTime.LocalNow())
Преимущества этого метода:
- 🔄 Дата обновляется при каждом обновлении запроса (не зависит от пересчёта листа)
- 📊 Подходит для больших наборов данных (миллионы строк)
- 🔗 Легко интегрируется с Power BI и другими инструментами
⚠️ Внимание: В бесплатной версии Power Query для Excel 2016 и старше функцияDateTime.LocalNow()может возвращать дату последнего обновления запроса, а не текущую. Для точного времени используйтеExcel.CurrentWorkbook(){[Name="Sheet1"]}[Content]{0}[TimeColumn], где в ячейке листа лежит=ТДАТА().
6. Распространённые ошибки и их решения
Даже опытные пользователи сталкиваются с проблемами при работе с динамическими датами. Разберём типичные ошибки:
| Проблема | Причина | Решение |
|---|---|---|
| Дата не обновляется при открытии файла | Отключён автоматический пересчёт (Формулы → Параметры вычислений → Вручную) |
Включите Автоматически или нажмите F9 |
Функция СЕГОДНЯ() возвращает ###### |
Слишком узкий столбец или неверный формат ячейки | Расширьте столбец и установите формат Дата |
| В shared-файле дата "зависает" | Excel не пересчитывает функции в режиме совместного доступа | Используйте VBA или Power Query |
#ИМЯ? вместо даты |
Опечатка в названии функции (например, СЕГОДНЯ без скобок) |
Проверьте синтаксис: =СЕГОДНЯ() |
| Дата сбивается на 1-2 дня | Неверные региональные настройки (формат мм/дд/гггг вместо дд.мм.гггг) |
Измените формат в Файл → Параметры → Дополнительно → Разделители |
Ещё одна частая проблема — разница во времени между СЕГОДНЯ() и ТДАТА(). Например, если файл открыт ночью, СЕГОДНЯ() может показывать вчерашнюю дату, а ТДАТА() — сегодняшнюю с временем "00:01". Чтобы синхронизировать их:
=ЕСЛИ(ТДАТА()-СЕГОДНЯ()<1/24; СЕГОДНЯ(); СЕГОДНЯ()+1)
FAQ: Ответы на частые вопросы
Можно ли сделать так, чтобы дата обновлялась каждую секунду?
Технически да, но это требует VBA с таймером и сильно нагружает Excel. Оптимальный интервал — 1-5 минут. Пример кода для обновления каждую секунду:
Sub UpdateEverySecond()
Application.OnTime Now + TimeValue("00:00:01"), "UpdateEverySecond"
Range("A1").Value = Now
End Sub
⚠️ Предупреждение: Частые обновления могут привести к зависанию файла, особенно если в нём много формул.
Как зафиксировать дату создания файла, но показывать текущую дату в отчёте?
Используйте два столбца:
- В ячейке
B1введите статическую дату создания (нажмитеCTRL+;) - В ячейке
C1введите=СЕГОДНЯ() - В отчёте ссылайтесь на
C1для текущей даты и наB1для даты создания
Почему в Google Sheets дата обновляется чаще, чем в Excel?
Google Sheets использует серверное время и обновляет функции TODAY()/NOW() каждые 30 минут (или при любом изменении листа). В Excel обновление происходит только при:
- Открытии файла
- Ручном пересчёте (
F9) - Изменении любой ячейки
- Выполнении макроса
Чтобы приблизить поведение Excel к Google Sheets, используйте VBA-таймер (см. раздел 4).
Как сделать так, чтобы дата обновлялась только в определённое время (например, в 9:00)?
Модифицируйте VBA-код из раздела 4:
Sub ScheduleUpdate()
Dim NextRun As Date
NextRun = Date + TimeValue("09:00:00")
If NextRun < Now Then NextRun = NextRun + 1
Application.OnTime NextRun, "DoUpdate"
End Sub
Sub DoUpdate()
Range("A1").Value = Now
ScheduleUpdate ' запланировать следующее обновление
End Sub
Запустите ScheduleUpdate один раз (например, в Workbook_Open), и дата будет обновляться ежедневно в 9:00.
Можно ли привязать дату к времени в другой временной зоне?
Да, с помощью формулы с учётом разницы во времени. Например, для московского времени (UTC+3) в файле, который ведётся по GMT:
=СЕГОДНЯ()+ВРЕМЯ(3;0;0)
Для автоматизации с учётом перехода на зимнее/летнее время используйте Power Query с API временных зон или VBA с библиотекой Windows Time Zone.