Работа с датами в Microsoft Excel часто требует нестандартных решений — особенно когда нужно определить количество дней в конкретном месяце. На первый взгляд задача кажется простой: в феврале 28 (или 29) дней, в апреле — 30, а в августе — 31. Но как автоматизировать этот расчёт для сотен строк данных? Или учесть високосные годы без ручного контроля? А что если месяц указан не числом, а названием (например, "январь")?
В этой статье вы найдёте 5 рабочих формул для любых сценариев: от базового подсчёта дней в фиксированном месяце до динамических расчётов с учётом года. Мы разберём типичные ошибки (вроде #ЧИСЛО! при неверном формате даты), покажем, как обойти ограничения функций ДЕНЬ() и КОНМЕСЯЦА(), и даже научимся извлекать количество дней из текстового названия месяца. Все примеры протестированы в Excel 2019–2023 и Excel Online.
Если вы часто работаете с отчётами по периодам, планируете графики или анализируете временные ряды — эти формулы сэкономят часы ручной работы. А для тех, кто предпочитает готовые решения, в конце статьи есть FAQ с шаблонами для копирования.
1. Базовая формула: ДЕНЬ(КОНМЕСЯЦА) для фиксированного месяца
Самый простой способ — использовать комбинацию функций ДЕНЬ() и КОНМЕСЯЦА(). Эта пара возвращает последний день месяца, а функция ДЕНЬ() извлекает из него номер дня (то есть количество дней в месяце).
Синтаксис:
=ДЕНЬ(КОНМЕСЯЦА(дату_или_месяц;0))
Примеры:
- 📅 Для текущего месяца:
=ДЕНЬ(КОНМЕСЯЦА(СЕГОДНЯ();0))→ вернёт 31 (если сегодня июль) или 28/29 (если февраль). - 🔢 Для конкретного месяца (например, мая 2026):
=ДЕНЬ(КОНМЕСЯЦА(ДАТА(2026;5;1);0))→ результат 31. - 📊 Для динамической даты в ячейке
A1:=ДЕНЬ(КОНМЕСЯЦА(A1;0)).
⚠️ Внимание: Если в ячейке A1 указано только название месяца (например, "март") без года, формула вернёт ошибку #ЗНАЧ!. Для текстового формата нужен другой подход — см. раздел 4.
2. Учёт високосных лет: формула с ДАТА()
Функция КОНМЕСЯЦА() автоматически учитывает високосные годы, но если вам нужно явно указать год (например, для исторических данных), используйте конструкцию с ДАТА():
=ДЕНЬ(ДАТА(год;месяц+1;1)-1)
Как это работает:
- Функция
ДАТА(год;месяц+1;1)создаёт дату первого дня следующего месяца. - Вычитаем 1 день, чтобы получить последний день текущего месяца.
ДЕНЬ()извлекает номер дня из этой даты.
Пример для февраля 2026 (високосный год):
=ДЕНЬ(ДАТА(2026;3;1)-1) → вернёт 29
Преимущества метода:
- 🔄 Работает для любого года, включая до 1900-го (в отличие от
КОНМЕСЯЦА, которая может давать сбои). - 📈 Позволяет массово рассчитывать дни для списка месяцев в столбце.
=ЕСЛИ(ИЛИ(ОСТАТ(год;400)=0; И(ОСТАТ(год;4)=0; ОСТАТ(год;100)<>0)); "Високосный"; "Не високосный")-->
3. Динамический расчёт для диапазона дат
Допустим, у вас есть столбец с датами (например, A2:A100), и нужно для каждой из них определить количество дней в соответствующем месяце. Вместо ручного ввода используйте протягиваемую формулу:
=ДЕНЬ(КОНМЕСЯЦА(A2;0))
Как протянуть формулу правильно:
- Введите формулу в ячейку
B2. - Наведите курсор на правый нижний угол ячейки (появится чёрный крестик).
- Дважды кликните по крестику — формула автоматически заполнит столбец до последней заполненной ячейки в
A.
⚠️ Внимание: Если в столбце A есть пустые ячейки или текстовые значения (например, "Нет данных"), формула вернёт ошибку. Чтобы избежать этого, оберните её в ЕСЛИОШИБКА():
=ЕСЛИОШИБКА(ДЕНЬ(КОНМЕСЯЦА(A2;0)); "")
- Убедитесь, что все даты в одном формате (например, ДД.ММ.ГГГГ)
- Удалите пустые ячейки или замените их на 0
- Проверьте, нет ли текста вместо дат (например, "январь" вместо "01.01.2026")
- Примените формат "Дата" к ячейкам с исходными данными-->
4. Расчёт для текстового названия месяца
Если месяц указан словом (например, "апрель" или "июль 2023"), стандартные формулы не сработают. Здесь поможет комбинация функций ПОИСКПОЗ(), ДАТАЗНАЧ() и ЗАМЕНИТЬ().
Формула для формата "месяц год" (например, "февраль 2026"):
=ДЕНЬ(ДАТАЗНАЧ("1 " & A1) + 32 - ДЕНЬ(ДАТАЗНАЧ("1 " & A1)))
Как это работает:
ДАТАЗНАЧ("1 " & A1)преобразует текст в дату (1-е число указанного месяца).- Прибавляем 32 дня — получаем дату в следующем месяце.
- Вычитаем номер дня (1) — получаем последний день текущего месяца.
ДЕНЬ()извлекает количество дней.
Для формата "только месяц" (например, "март"):
=ДЕНЬ(ДАТА(2026; ПОИСКПОЗ(A1; {"январь";"февраль";...;"декабрь"}; 0); 1) + 32 - ДЕНЬ(ДАТА(2026; ПОИСКПОЗ(A1; {"январь";"февраль";...;"декабрь"}; 0); 1)))
⚠️ Внимание: В втором случае обязательно укажите актуальный год (в примере — 2026), иначе расчёт февраля будет неверным для високосных лет.
Если месяц указан сокращённо (например, "янв", "фев"), используйте функцию Альтернативный способ для текста
ВЫБРАТЬ():=ДЕНЬ(КОНМЕСЯЦА(ДАТА(2026; ВЫБРАТЬ(ЛЕВСИМВ(A1;3); "янв";1; "фев";2; ...; "дек";12); 1); 0))
5. Продвинутый метод: пользовательская функция VBA
Если вам часто приходится работать с нестандартными форматами дат, имеет смысл создать собственную функцию на VBA. Она будет универсальной и сможет обрабатывать любые входные данные.
Код функции (для вставки в редактор VBA):
Function DaysInMonth(input As Variant) As Integer
Dim d As Date
On Error Resume Next
If IsNumeric(input) Then
d = CDate(input)
Else
d = CDate("1 " & input)
End If
If Err.Number <> 0 Then
DaysInMonth = CVErr(xlErrValue)
Else
DaysInMonth = Day(DateSerial(Year(d), Month(d) + 1, 1) - 1)
End If
End Function
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в модуль (меню
Insert → Module). - Сохраните файл как
.xlsm(с поддержкой макросов). - Теперь в Excel можно использовать
=DaysInMonth(A1), гдеA1— ячейка с датой или текстом (например, "май 2023" или 44355).
Преимущества VBA-решения:
- 🔧 Работает с любым форматом (числа, текст, серийные номера).
- 🚀 Единственный метод, который корректно обрабатывает неполные данные (например, "февраль" без года, используя текущий год).
- 📁 Можно расширить функционал (например, добавить проверку на будущие даты).
6. Типичные ошибки и как их избежать
Даже с правильными формулами можно получить неожиданные результаты. Разберём самые частые проблемы и их решения:
| Ошибка | Причина | Решение |
|---|---|---|
#ЗНАЧ! |
Ячейка содержит текст вместо даты (например, "январь"). | Используйте формулу для текстового формата (раздел 4) или преобразуйте данные в даты через ДАТАЗНАЧ(). |
#ЧИСЛО! |
Неверный номер месяца (например, 13) или год до 1900. | Проверьте исходные данные. Для годов до 1900 используйте формулу с ДАТА() (раздел 2). |
| Неправильное количество дней для февраля | Год не указан или указан неверно (например, 1900 ошибочно считается високосным). | Явно укажите год в формуле или используйте СЕГОДНЯ() для текущего года. |
| Формула возвращает 0 | Ячейка пустая или содержит 0. | Добавьте проверку ЕСЛИ(A1=""; ""; формула). |
⚠️ Внимание: Функция КОНМЕСЯЦА() в Excel для Mac может вести себя иначе, чем в Windows-версии. Например, для даты "31.01.2026" формула =КОНМЕСЯЦА(A1;1) вернёт "29.02.2026" в Windows, но может выдавать ошибку на Mac. Тестируйте формулы на своей версии программы!
FAQ: Частые вопросы и готовые решения
🔹 Как посчитать дни в месяце для диапазона дат в Google Таблицах?
В Google Sheets используйте ту же формулу, что и в Excel: =ДЕНЬ(КОНМЕСЯЦА(A2;0)). Альтернатива — =ДЕНЬ(ДАТА(ГОД(A2); МЕСЯЦ(A2)+1; 1)-1).
⚠️ Обратите внимание: в Google Таблицах нет функции ДАТАЗНАЧ() — для текста используйте =ДАТА(2026; ПОИСКПОЗ(A1; {"январь";"февраль";...}); 1).
🔹 Можно ли получить количество дней в месяце без указания года?
Технически да, но результат будет неточным для февраля. Формула =ДЕНЬ(ДАТА(2026;МЕСЯЦ(СЕГОДНЯ());1)+32-ДЕНЬ(ДАТА(2026;МЕСЯЦ(СЕГОДНЯ());1))) вернёт 28 или 29 в зависимости от того, високосный ли текущий год.
Для точного расчёта год указывать обязательно!
🔹 Как выделить ячейки с количеством дней = 31?
Используйте условное форматирование:
- Выделите диапазон с результатами (например,
B2:B100). - Перейдите в
Главная → Условное форматирование → Создать правило. - Выберите
Форматировать только ячейки, которые содержат. - Установите условие:
Значение = 31и задайте цвет заливки.
🔹 Почему формула возвращает 30 для апреля, хотя там 30 дней?
Скорее всего, вы используете =ДЕНЬ(КОНМЕСЯЦА(A1;1)) вместо =ДЕНЬ(КОНМЕСЯЦА(A1;0)). Параметр 0 означает "текущий месяц", а 1 — "следующий месяц". Для апреля КОНМЕСЯЦА(дата;1) вернёт 31 мая, а ДЕНЬ() извлечёт 31, что неверно.
🔹 Как посчитать рабочие дни в месяце (исключая выходные)?
Используйте функцию ЧИСТРАБДНИ():
=ЧИСТРАБДНИ(ДАТА(год;месяц;1); КОНМЕСЯЦА(ДАТА(год;месяц;1);0))
Пример для марта 2026: =ЧИСТРАБДНИ(ДАТА(2026;3;1); КОНМЕСЯЦА(ДАТА(2026;3;1);0)) → вернёт 21 рабочий день.