Работа с датами в Excel часто превращается в головоломку, особенно когда нужно связать данные из разных таблиц. Представьте: у вас есть список отдельных дней отсутствия сотрудников и календарь рабочих недель с границами (понедельник-воскресенье). Задача – автоматически посчитать, сколько уникальных дат отсутствия попадает в каждую неделю, игнорируя дубликаты. Звучит сложно, но решение есть – и оно не требует макросов.
Подготовка данных: проверяем основы
Перед тем, как бросаться писать формулы, убедитесь, что:
- Все даты в листе
Absence
имеют формат ГГГГ-ММ-ДД (например, 2025-12-31). Если Excel воспринимает их как текст, формулы не сработают – щёлкните по ячейке и проверьте, отображается ли значение в правом верхнем углу как дата. - В столбце
Status
листаAvailability
достаточно пустых ячеек для заполнения (если тянете формулу вниз, не забудьте про абсолютные ссылки – об этом ниже).
Кстати, если пользователь случайно ввёл дату дважды (например, 2025-01-01 в строках 5 и 10), формула должна считать это как одно отсутствие. Именно поэтому мы используем функцию UNIQUE
– она убирает повторы до обработки.
Формула-помощник: разбираем по шагам
Вот вариант, который подойдёт даже новичкам:
=LET(
_abs, UNIQUE(Absence!$D$2:$D$365),
_FILTER, FILTER(_abs, (_abs>=C2)*(_abs<=D2), ""),
COUNT(_FILTER)
)
Давайте «разжуём» каждую часть:
LET
– объявляет переменные внутри формулы, чтобы не повторять одни и те же вычисления. Как будто говорите Excel: «Запомни это как _abs, а это как _FILTER».UNIQUE(Absence!$D$2:$D$365)
– берёт диапазон дат из листа отсутствий и удаляет дубликаты. Знак доллара ($) фиксирует диапазон (чтобы при протягивании формулы он не смещался).FILTER(_abs, (_abs>=C2)*(_abs<=D2), "")
– фильтрует уникальные даты, оставляя только те, которые попадают между началом недели (C2) и концом (D2). Умножение (*
) здесь работает как оператор И – дата должна быть больше или равна началу И меньше или равна концу.COUNT(_FILTER)
– подсчитывает количество оставшихся дат. Если фильтр ничего не нашёл, COUNT вернёт 0.
Если не использовать LET
, формула станет длиннее, но тоже будет работать:
=COUNT(FILTER(UNIQUE(Absence!$D$2:$D$365), (UNIQUE(Absence!$D$2:$D$365)>=C2)*(UNIQUE(Absence!$D$2:$D$365)<=D2), ""))
Совет: Если границы недели могут меняться (например, вместо воскресенья – пятница), просто укажите в столбцах C и D актуальные даты начала и конца. Формула динамически подстроится под новые значения.
Тонкости, которые сэкономят нервы
- Диапазон дат в Absence. В примере используется $D$2:$D$365 – предположение, что данные занимают не больше года. Если список длиннее, расширьте диапазон (например, $D$2:$D$1000), но не делайте его избыточным – это замедлит вычисления.
- Ошибка #ЗНАЧ! — возникает, если фильтр не нашёл подходящих дат. Чтобы вместо ошибки отображался 0, добавьте
IFERROR
:=IFERROR([ваша_формула], 0)
- Проверка на пустые ячейки. Если в диапазоне Absence есть пустые строки, функция UNIQUE их проигнорирует. Но если там мусор (например, текст), формула сломается – очистите данные заранее.
Пример теста: Возьмите календарную неделю с 2025-01-06 по 2025-01-12. Добавьте в Absence даты 2025-01-06, 2025-01-07 и дважды 2025-01-08. Формула должна вернуть 3 – потому что 06, 07 и 08 (дубликат не считается). Если получили 4 – проверьте, применили ли UNIQUE.
И последнее: не бойтесь экспериментировать с формулой. Например, если хотите выделять недели с отсутствиями цветом, используйте условное форматирование на основе столбца Status (но это уже тема для отдельного разговора). Главное – начать с правильно настроенного подсчёта, и всё остальное приложится.