Автоматический пересчет при Сортировке на vba
Как настроить автоматический пересчет при сортировке на vba или как событие?
Как настроить автоматический пересчет при сортировке на vba или как событие?
"Сортировка фильтрами" немного сбивает с толку. Хотя в автофильтре и есть сортировка, но в общем случае сортировка не имеет отношения к фильтрации.
Сначала приведу решение с помощью формул рабочего листа. В 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 нужно отличить сортировку диапазона от других причин вызова обработчика, то используйте это решение.