Почему стандартный COUNT не работает с фильтрами и что делать
Вы применили фильтр в Microsoft Excel, оставили только нужные строки — и suddenly обнаруживаете, что функция COUNT или COUNTA упорно считает все данные, включая скрытые. Это не баг, а особенность работы: большинство функций Excel игнорируют состояние фильтра и оперируют исходным диапазоном. Но как тогда узнать, сколько строк реально отображается на экране после фильтрации?
Проблема становится критичной, когда вы готовите отчёты для руководства или клиентов: ошибка в одной цифре может исказить всю аналитику. К счастью, в Excel есть как минимум 5 способов решить эту задачу — от элементарных до продвинутых. Выбор метода зависит от версии программы (2010, 2016, 2019 или Microsoft 365), объёма данных и вашего уровня владения инструментом.
В этой статье разберём каждый вариант с практическими примерами, нюансами и лайфхаками. Начнём с самого универсального — функции SUBTOTAL, которая работает даже в Excel 2007, и дойдём до автоматизации через Power Query и VBA.
Способ 1: Функция SUBTOTAL — универсальное решение для любых фильтров
Функция SUBTOTAL — это «серебряная пуля» для подсчёта видимых строк. Она умеет игнорировать скрытые ячейки (в том числе отфильтрованные) и работает с 11 типами вычислений. Для нашей задачи важен аргумент 103 (или 3 в старых версиях), который означает подсчёт видимых ячеек.
Синтаксис простой:
=SUBTOTAL(103; диапазон)
Где диапазон — это столбец, по которому вы хотите посчитать строки. Например, для подсчёта видимых строк в столбце A (с заголовком) формула будет:
=SUBTOTAL(103; A2:A1000)
- ✅ Плюсы: работает во всех версиях Excel, не требует дополнительных настроек, обновляется автоматически при изменении фильтра.
- ⚠️ Минусы: если в диапазоне есть пустые ячейки, они не будут учтены (в отличие от
COUNTA). - 🔄 Альтернатива: для подсчёта непустых видимых ячеек используйте
SUBTOTAL(102; диапазон).
⚠️ Внимание: Если вы применяете несколько фильтров к разным столбцам (например, фильтр по дате в столбцеBи по категории в столбцеD), функцияSUBTOTALучтёт только строки, видимые одновременно по всем критериям.
Способ 2: Строка состояния — быстрый визуальный подсчёт
Не все знают, но Excel показывает количество выделенных строк автоматически — в строке состояния внизу окна. Этот метод не требует формул и идеален для разовых проверок:
- Примените фильтр к таблице.
- Выделите весь диапазон данных (включая заголовки).
- Посмотрите в левый нижний угол окна Excel — там появится надпись вида
"Выбрано: 15 из 100", где15— количество видимых строк.
Этот способ работает во всех версиях, включая Excel Online, но имеет ограничения:
- 📌 Подходит только для визуальной оценки — результат нельзя использовать в формулах или отчётах.
- 🔍 Если выделить часть диапазона, Excel покажет количество ячеек, а не строк.
- 🚫 Не работает, если в настройках отключён параметр
Количество(включается через правый клик по строке состояния).
Способ 3: Power Query — для больших данных и сложных фильтров
Если вы работаете с таблицами на десятки тысяч строк или нуждаетесь в динамическом подсчёте с учётом нескольких условий, Power Query (доступен в Excel 2016+) станет вашим лучшим помощником. Этот инструмент позволяет:
- 🔄 Автоматически обновлять результаты при изменении исходных данных.
- 📊 Применять многоуровневые фильтры (например, «продажи > 1000 И регион = Москва»).
- 📥 Импортировать данные из разных источников (SQL, CSV, веб) и считать строки уже после фильтрации.
Алгоритм действий:
- Выделите вашу таблицу и перейдите на вкладку
Данные → Получение данных → Из таблицы/диапазона. - В открывшемся редакторе Power Query примените нужные фильтры (через меню
Главная → Фильтр). - Добавьте столбец с подсчётом:
Добавление столбца → Статистика → Количество строк. - Нажмите
Главная → Закрыть и загрузить, чтобы вернуть данные в Excel.
⚠️ Внимание: Если ваши данные обновляются часто, не забудьте настроить автоматическое обновление запроса. Для этого кликните правой кнопкой по таблице с результатом и выберитеОбновитьили настройте расписание вСвойствах соединения.
Как вернуть исходные данные после фильтрации в Power Query?
Если вы применили фильтры в Power Query и хотите вернуть все строки, перейдите в раздел Применённые шаги (справа), найдите шаг с фильтром (обычно называется "Filtered Rows") и удалите его, нажав на крестик. После этого обновите запрос.
Способ 4: VBA-макрос — автоматизация для продвинутых пользователей
Если вам нужно регулярно подсчитывать отфильтрованные строки в десятках файлов или интегрировать этот процесс в более сложные сценарии, напишите простой макрос. Например, этот код считает видимые строки в выделенном диапазоне и выводит результат в сообщении:
Sub CountFilteredRows()
Dim rng As Range
Dim count As Long
Set rng = Selection
count = 0
For Each row In rng.Rows
If Not row.EntireRow.Hidden Then
count = count + 1
End If
Next row
MsgBox "Количество видимых строк: " & count, vbInformation
End Sub
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в новый модуль (
Insert → Module). - Вернитесь в Excel, выделите нужный диапазон и запустите макрос через
Alt + F8.
Для автоматизации можно связать макрос с кнопкой на листе или запускать его по событию (например, при изменении фильтра). Подробнее о событиях читайте в разделе про продвинутые техники.
Убедитесь, что вкладка "Разработчик" включена (Файл → Параметры → Настройка ленты)|Проверьте настройки безопасности макросов (Файл → Параметры → Центр управления безопасностью)|Сохраните файл в формате .xlsm (с поддержкой макросов)|Сделайте резервную копию данных перед запуском кода
-->
Способ 5: Функция AGGREGATE — альтернатива SUBTOTAL с расширенными возможностями
Функция AGGREGATE (появилась в Excel 2010) — это «старшая сестра» SUBTOTAL с дополнительными опциями. Она поддерживает 19 типов вычислений и позволяет игнорировать не только скрытые строки, но и строки с ошибками.
Для подсчёта видимых строк используйте синтаксис:
=AGGREGATE(3; 5; диапазон)
Где:
3— код операции (подсчёт ячеек, аналогичноCOUNTA).5— параметр, означающий «игнорировать скрытые строки и строки с ошибками».диапазон— ваш столбец с данными.
Преимущества AGGREGATE перед SUBTOTAL:
| Критерий | SUBTOTAL |
AGGREGATE |
|---|---|---|
| Игнорирует скрытые строки | ✅ Да | ✅ Да |
| Игнорирует строки с ошибками (#N/A, #VALUE!) | ❌ Нет | ✅ Да (при параметре 5 или 6) |
| Количество поддерживаемых операций | 11 | 19 |
| Совместимость с Excel 2007 | ✅ Да | ❌ Нет (только 2010+) |
Распространённые ошибки и как их избежать
Даже опытные пользователи Excel иногда сталкиваются с неожиданными результатами при подсчёте отфильтрованных строк. Вот топ-5 ошибок и способы их решения:
- Функция считает все строки, игнорируя фильтр
Причина: Вы используетеCOUNT,COUNTAилиROWSвместоSUBTOTAL/AGGREGATE.
Решение: Замените функцию на=SUBTOTAL(103; A2:A100). - Результат на 1 больше, чем видимых строк
Причина: В диапазон попала шапка таблицы (строка с заголовками).
Решение: Исключите заголовок из диапазона:=SUBTOTAL(103; A2:A100)вместоA1:A100. - Функция возвращает 0 при явно видимых строках
Причина: В диапазоне нет непустых ячеек (дляSUBTOTAL(103)) или все ячейки содержат ошибки (дляAGGREGATEс параметром 5).
Решение: ИспользуйтеSUBTOTAL(102)для подсчёта любых видимых ячеек (включая пустые).
Ещё одна типичная проблема — несовпадение результатов при использовании разных методов. Например, строка состояния показывает 15 строк, а SUBTOTAL возвращает 14. Это происходит, если:
- В диапазоне есть полностью пустые строки (их игнорирует
SUBTOTAL(103), но учитывает строка состояния). - Применён ручной фильтр (через меню
Данные → Фильтр) вместе с условным форматированием (скрывающим строки).
Продвинутые техники: динамические диапазоны и события VBA
Для автоматизации подсчёта на профессиональном уровне можно использовать:
- 🔄 Динамические именованные диапазоны:
Создайте диапазон, который автоматически расширяется при добавлении новых строк, и используйте его в
SUBTOTAL. Формула для диапазона:=СМЕЩ(Лист1!$A$2;0;0;СЧЁТЗ(Лист1!$A:$A)-1;1)Затем присвойте ему имя (например,
DynamicRange) и используйте в формуле:=SUBTOTAL(103; DynamicRange). - 📥 События VBA:
Напишите макрос, который будет срабатывать при изменении фильтра и обновлять результат подсчёта. Пример кода для события
Worksheet_Calculate:Private Sub Worksheet_Calculate()Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range("B1").Value = "Видимых строк: " & _
Application.WorksheetFunction.Subtotal(103, ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row))
End Sub
Этот код будет обновлять ячейку
B1при каждом пересчёте листа (включая изменение фильтра).
Для работы с сводными таблицами используйте функцию GETPIVOTDATA или настройте поле «Количество» в области значений. Это позволит динамически подсчитывать строки в разрезе фильтров сводной таблицы.
Как подсчитать уникальные значения в отфильтрованных строках?
Для подсчёта уникальных видимых значений используйте комбинацию функций:
=SUMPRODUCT(1/COUNTIFS(диапазон; диапазон; диапазон; "<>" & ""); --(SUBTOTAL(103; OFFSET(диапазон; ROW(диапазон)-MIN(ROW(диапазон)); 0; 1))))
Эта формула работает как массив и требует подтверждения Ctrl+Shift+Enter в старых версиях Excel.
Часто задаваемые вопросы
Можно ли посчитать отфильтрованные строки в Google Таблицах?
Да, в Google Sheets используется та же функция SUBTOTAL, но с другим синтаксисом: =SUBTOTAL(103; A2:A100). Также работает строка состояния (внизу экрана). Отличие от Excel: в Google Таблицах нет функции AGGREGATE, но можно использовать QUERY для сложных фильтров.
Почему SUBTOTAL считает неверно, если применён фильтр по цвету?
Функция SUBTOTAL игнорирует только строки, скрытые стандартным фильтром (через Данные → Фильтр). Если вы используете условное форматирование для скрытия строк (например, по цвету ячейки), эти строки не считаются «скрытыми» для SUBTOTAL. В этом случае поможет только VBA или ручной подсчёт.
Как посчитать отфильтрованные строки в защищённом листе?
Если лист защищён, но разрешено использование функций, SUBTOTAL и AGGREGATE будут работать. Если защита блокирует формулы, попробуйте:
- Снять защиту (если у вас есть пароль).
- Использовать Power Query — он работает поверх защиты.
- Скопировать данные на новый лист и применить фильтр там.
Можно ли посчитать строки, отфильтрованные по нескольким критериям?
Да, SUBTOTAL и AGGREGATE автоматически учитывают все применённые фильтры. Например, если вы фильтруете столбец B по дате и столбец D по категории, функция вернёт количество строк, соответствующих одновременно обоим критериям. Для сложных условий (например, «даты ИЛИ категории») используйте Power Query.
Как экспортировать только отфильтрованные строки в новый файл?
Самый простой способ:
- Примените фильтр.
- Выделите видимые строки (включая заголовки).
- Скопируйте их (
Ctrl+C) и вставьте в новый файл (Ctrl+V).
Для автоматизации используйте Power Query:
- Загрузите данные в
Power Query. - Примените фильтры.
- Нажмите
Главная → Закрыть и загрузить в → Новая книга.