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