Как посчитать отфильтрованные строки в Excel: от SUBTOTAL до VBA

Фильтрация данных в Microsoft Excel — один из самых востребованных инструментов для анализа таблиц. Но что делать, если после применения фильтра нужно узнать количество видимых строк? Стандартная функция СЧЁТ или COUNT вернёт общее число ячеек, игнорируя скрытые фильтром. А вам требуется точное значение — например, чтобы рассчитать процент отобранных записей или проверить корректность выборки.

В этой статье разберём 5 проверенных способов подсчёта отфильтрованных строк — от простых формул до автоматизации через Power Query и VBA. Каждый метод проиллюстрирован скриншотами (в текстовом формате) и адаптирован под разные версии Excel (2010–2023, включая Excel Online). Особое внимание уделим типичным ошибкам, которые искажают результаты, и нюансам работы с большими массивами данных (100 000+ строк).

Если вы регулярно работаете с отчётами, где фильтрация — ежедневная рутина, эта инструкция сэкономит вам часы в месяц. Например, бухгалтеру нужно посчитать количество клиентов с просрочкой платежа после фильтра по дате, а маркетологу — число лидов из конкретного региона. Все эти задачи решаются за 1–2 клика, если знать правильные инструменты.

1. Функция SUBTOTAL: универсальный метод для видимых строк

Функция СУММЕСЛИМН (или SUBTOTAL в английской версии) — главный помощник при работе с отфильтрованными данными. Её ключевое преимущество: игнорирует скрытые строки, в отличие от СЧЁТ или COUNTIF. Синтаксис прост:

=СУММЕСЛИМН(диапазон; [критерий1]; ...)

где первый аргумент — это номер функции (от 1 до 11 для включения скрытых строк или от 101 до 111 для их игнорирования). Для подсчёта видимых строк используем 102 (аналог СЧЁТ) или 103 (аналог СЧЁТЗ).

Пример: подсчитаем количество видимых строк в столбце A2:A100 после фильтра:

=СУММЕСЛИМН(102; A2:A100)

Если нужно применить дополнительный критерий (например, посчитать только строки со значением "Да" в столбце B), расширяем формулу:

=СУММЕСЛИМН(102; A2:A100; B2:B100; "Да")

Распространённая ошибка: использование 102 вместо 2 (или 103 вместо 3). В этом случае функция посчитает все строки, включая скрытые. Всегда проверяйте первый аргумент!

Сравнение аргументов SUBTOTAL

АргументОписаниеУчитывает скрытые строки?
1СРЗНАЧДа
2СЧЁТДа
101СРЗНАЧ (только видимые)Нет
102СЧЁТ (только видимые)Нет
103СЧЁТЗ (только видимые)Нет

2. Функция СЧЁТЕСЛИ + фильтр: когда SUBTOTAL не подходит

Если вам нужно посчитать отфильтрованные строки с учётом дополнительного условия, которое не покрывает SUBTOTAL, используйте комбинацию СЧЁТЕСЛИ (или COUNTIF) с динамическим диапазоном. Этот метод полезен, когда фильтр применён к нескольким столбцам, а считать нужно по одному критерию.

Алгоритм:

  1. Скопируйте видимые строки в новый диапазон (например, с помощью Специальная вставка → Видимые ячейки).
  2. Примените СЧЁТЕСЛИ к скопированным данным.

Пример: подсчитаем количество видимых строк в столбце A, где значение равно "Активен":

=СЧЁТЕСЛИ(диапазон_видимых_ячеек; "Активен")

Чтобы автоматизировать копирование видимых ячеек, используйте макрос (см. раздел 5) или Power Query (раздел 4).

📊 Какой метод подсчёта вы используете чаще?
SUBTOTAL
СЧЁТЕСЛИ + копирование
Power Query
Макросы
Не знаю
⚠️ Внимание: Если в данных есть пустые ячейки, СЧЁТЕСЛИ их проигнорирует. Для учёта пустых строк используйте СЧИТАТЬПУСТОТЫ (или COUNTBLANK) с тем же диапазоном.

3. Счётчик строк в статусной строке: быстрый визуальный метод

Не всегда нужно использовать формулы. Excel показывает количество выделенных строк прямо в статусной строке (внизу окна). Этот способ подходит для разовых проверок, когда не требуется сохранять результат в ячейке.

Как это работает:

  1. Примените фильтр к таблице.
  2. Выделите диапазон с данными (например, A2:D1000).
  3. Посмотрите на статусную строку — там отобразится текст вида: "Количество: 45 из 1000", где 45 — это число видимых строк после фильтра.

Преимущества метода:

  • ⚡ Мгновенный результат без формул.
  • 🔍 Работает даже в защищённых листах.
  • 📊 Подходит для проверки корректности фильтра.

Ограничения:

  • 🚫 Нельзя использовать результат в дальнейших вычислениях.
  • 📉 Неудобно для больших таблиц (придётся прокручивать вниз).
Как включить отображение счётчика в статусной строке?

Если счётчик не показывается, кликните правой кнопкой по статусной строке и выберите "Количество" (или "Count" в английской версии).

4. Power Query: подсчёт отфильтрованных строк для продвинутых пользователей

Если вы работаете с большими данными (100 000+ строк) или нуждаетесь в автоматизированном подсчёте после фильтрации, Power Query (или Get & Transform в Excel 2016+) — оптимальное решение. Этот инструмент позволяет:

  • 🔄 Обновлять результаты одним кликом.
  • 📂 Сохранять шаги фильтрации для повторного использования.
  • 🔗 Подключаться к внешним источникам (SQL, CSV, веб).

Пошаговая инструкция:

  1. Выделите таблицу и перейдите на вкладку Данные → Из таблицы/диапазона.
  2. В редакторе Power Query примените фильтр (например, по столбцу "Статус" = "Активен").
  3. Добавьте новый столбец с формулой = Table.RowCount(#"Отфильтрованные строки").
  4. Нажмите Закрыть и загрузить — результат появится на новом листе.

Пример кода на языке M для подсчёта строк после фильтра:

let

Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

Фильтр = Table.SelectRows(Источник, each ([Статус] = "Активен")),

Количество = Table.RowCount(Фильтр)

in

Количество

⚠️ Внимание: Если после обновления данных в исходной таблице количество строк не изменилось, проверьте настройки Свойства запроса → Обновление при открытии файла.

Выделить исходный диапазон как таблицу (Ctrl+T)|Проверить отсутствие пустых заголовков|Удалить объединённые ячейки|Сохранить файл перед импортом-->

5. Макросы VBA: автоматизация для повторяющихся задач

Если подсчёт отфильтрованных строк — часть вашей ежедневной рутины, стоит написать простой макрос на VBA. Этот метод подходит для:

  • 📅 Еженедельных отчётов с одинаковой структурой.
  • 🔄 Многократного применения фильтров к одним и тем же данным.
  • 📊 Интеграции с другими процессами (например, отправка результата по email).

Пример макроса для подсчёта видимых строк в выделенном диапазоне:

Sub CountFilteredRows()

Dim rng As Range

Dim count As Long

On Error Resume Next

Set rng = Selection.SpecialCells(xlCellTypeVisible)

On Error GoTo 0

If Not rng Is Nothing Then

count = rng.Rows.Count

MsgBox "Количество видимых строк: " & count, vbInformation

Else

MsgBox "Нет видимых ячеек в выделении!", vbExclamation

End If

End Sub

Как использовать:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Вернитесь в Excel, выделите диапазон и запустите макрос (Alt + F8 → CountFilteredRows).

Для автоматизации с учётом конкретного фильтра (например, по значению в столбце B), модифицируйте код:

Sub CountFilteredRowsByCriteria()

Dim ws As Worksheet

Dim rng As Range

Set ws = ActiveSheet

' Применяем фильтр по столбцу B (значение "Да")

ws.Range("A1").AutoFilter Field:=2, Criteria1:="Да"

' Считаем видимые строки в столбце A (исключая заголовок)

Set rng = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row).SpecialCells(xlCellTypeVisible)

MsgBox "Отфильтровано строк: " & rng.Rows.Count, vbInformation

End Sub

6. Динамические массивы (Excel 365): современный подход

В Excel 365 и Excel 2021 появилась поддержка динамических массивов, которые упрощают работу с отфильтрованными данными. Функция ФИЛЬТР (или FILTER) позволяет создавать автоматически обновляемые диапазоны, а СТРОКИ (или ROWS) — подсчитывать их количество.

Пример: подсчитаем количество строк в столбце A, где значение в столбце B равно "Да":

=СТРОКИ(ФИЛЬТР(A2:A100; B2:B100="Да"))

Преимущества метода:

  • 🔄 Автоматическое обновление при изменении исходных данных.
  • 📊 Нет нужды в ручном применении фильтров.
  • 🔗 Легко интегрируется с другими функциями (например, СУММ или СРЗНАЧ).

Ограничения:

  • 🚫 Работает только в Excel 365 и Excel 2021.
  • 🐢 Может тормозить при больших массивах (50 000+ строк).

Для ускорения работы с большими таблицами комбинируйте ФИЛЬТР с INDEX:

=СТРОКИ(INDEX(ФИЛЬТР(A2:A100000; B2:B100000="Да");;1))

Сравнение методов: какой выбрать?

Выбор способа подсчёта отфильтрованных строк зависит от размера данных, версии Excel и частоты использования. Ниже таблица сравнения ключевых параметров:

МетодСложностьАвтоматизацияРаботает в Excel OnlineОграничения
SUBTOTALНе поддерживает сложные критерии
СЧЁТЕСЛИ + копирование⭐⭐Ручные действия требуют времени
Статусная строкаНельзя использовать в формулах
Power Query⭐⭐⭐Требует изучение языка M
VBA⭐⭐⭐⭐Не работает в защищённых файлах
Динамические массивы⭐⭐Только Excel 365/2021

Рекомендации по выбору:

  • 📌 Для разовых задач подойдёт SUBTOTAL или статусная строка.
  • 📊 Для еженедельных отчётов настройте Power Query или макрос.
  • 🚀 Для Excel 365 используйте динамические массивы — это будущее анализа данных.

FAQ: Частые вопросы по подсчёту отфильтрованных строк

Почему SUBTOTAL возвращает 0, хотя строки видимые?

Вероятные причины:

  • 🔹 В диапазоне есть пустые ячейкиSUBTOTAL их игнорирует по умолчанию. Используйте 103 вместо 102.
  • 🔹 Фильтр применён не ко всему диапазону. Проверьте границы в формуле.
  • 🔹 В настройках фильтра включён параметр "Выделить цветом вместо скрытия". В этом случае строки не скрываются, а только подсвечиваются.
Можно ли посчитать отфильтрованные строки в сводной таблице?

Да, но только косвенно:

  1. Добавьте в сводную таблицу поле с подсчётом (например, перетащите любое текстовое поле в область "Значения" и выберите "Количество").
  2. Примените фильтр к сводной таблице.
  3. Результат отобразится в ячейке с итогом.

Обратите внимание: если в исходных данных есть дубли, сводная таблица посчитает их как отдельные строки. Используйте Удалить дубликаты перед созданием сводной.

Как посчитать уникальные значения в отфильтрованных строках?

Используйте комбинацию SUBTOTAL и ЕУНИК (или UNIQUE в Excel 365):

=СТРОКИ(ЕУНИК(ФИЛЬТР(A2:A100; (A2:A100<>"")*(ПОДСТАВИТЬ(A2:A100;"";"")<>""))))

Для старых версий Excel придётся копировать видимые ячейки в новый диапазон и применять Уникальные значения на вкладке Данные.

Почему макрос не считает строки после фильтра?

Частые ошибки в коде:

  • 🔹 Не указан диапазон: SpecialCells(xlCellTypeVisible) применяется к ActiveSheet, а не к конкретному диапазону.
  • 🔹 Фильтр не применён: перед подсчётом добавьте строку ActiveSheet.AutoFilterMode = True.
  • 🔹 Диапазон содержит объединённые ячейки: SpecialCells не работает с merged cells.

Решение: проверьте код на тестовом файле с простыми данными.

Как посчитать отфильтрованные строки в Google Sheets?

В Google Таблицах используйте функцию SUBTOTAL (аналогично Excel) или QUERY:

=COUNTA(QUERY(A2:B100; "SELECT A WHERE B = 'Да'"; 1))

Обратите внимание: QUERY не учитывает ручное скрытие строк (только фильтры).