Автоматический пересчет при Сортировке на vba

Рейтинг: -1Ответов: 1Опубликовано: 14.08.2025

Как настроить автоматический пересчет при сортировке на vba или как событие?

Ответы

▲ 1

"Сортировка фильтрами" немного сбивает с толку. Хотя в автофильтре и есть сортировка, но в общем случае сортировка не имеет отношения к фильтрации.

Решение для фильтрации данных с помощью автофильтра.

Сначала приведу решение с помощью формул рабочего листа. В Excel существует единственная функция, насколько я знаю, которая может реагировать на скрытие ячеек посредством автофильтра, а также, опционально, и ручное. Это функция SUBTOTAL:

введите сюда описание изображения

То есть её можно использовать для пересчёта шапки таблицы без вовлечения VBA. Если возможностей этой функции не хватит, тогда нужно использовать VBA. Метод SpecialCells объекта Range позволяет получить только видимые ячейки диапазона. Вот простейший пример, который помещает в "D1" сумму отфильтрованных ячеек:

Private Sub Worksheet_Calculate()
  Application.EnableEvents = False
  [D1] = Application.Sum([B2:B8].SpecialCells(xlCellTypeVisible))
  Application.EnableEvents = True
End Sub

Для того, чтобы событие Worksheet_Calculate вызывалось при изменении критериев фильтрации, необходимо вставить на рабочий лист любую функцию с фильтруемым диапазоном или одним из его столбцов в качестве аргумента. Можно это сделать в скрытом столбце или ряду, чтобы она не влияла на внешний вид листа.

Решение для сортировки данных.

Точно также, как и при фильтрации, для того, чтобы событие Worksheet_Calculate вызывалось при сортировке диапазона, необходимо вставить на рабочий лист любую функцию с сортируемым диапазоном или одним из его столбцов в качестве аргумента.

Если в обработчике события Worksheet_Calculate нужно отличить сортировку диапазона от других причин вызова обработчика, то используйте это решение.