01 Что делает макрос
Когда у вас есть большая таблица с множеством столбцов, которые не отфильтрованы, иногда трудно сказать, какие столбцы фильтруются, а какие — нет. Конечно, можно прокручивать столбцы, всматриваясь в каждый выпадающий список, но это очень долго.
Этот макрос помогает показать все фильтры в строке состояния. Панель состояния находится в нижней части окна Excel.
Этот макрос перебирает поля в наборе данных автофильтра. После того, как цикл завершен, мы проходим заключительную строку к свойству StatusBar.
02 Код макроса
Private
Sub
Worksheet_Calculate()
'Шаг 1: объявляем переменные
Dim
AF
As
AutoFilter
Dim
TargetField
As
String
Dim
strOutput
As
String
Dim
i
As
Integer
'Шаг 2: Проверить, если фильтр существует, если нет – выходим из макроса
If
ActiveSheet.AutoFilterMode =
False
Then
Application.StatusBar =
False
Exit
Sub
End
If
'Шаг 3: Установить фильтр и начать цикл
Set
AF = ActiveSheet.AutoFilter
For
i = 1
To
AF.Filters.Count
'Шаг 4: Захватить отфильтрованные имена полей
If
AF.Filters(i).
On
Then
TargetField = AF.Range.Cells(1, i).Value
strOutput = strOutput &
" | "
& TargetField
End
If
Next
'Шаг 5: Показать фильтры, если они есть
If
strOutput =
""
Then
Application.StatusBar =
False
Else
Application.StatusBar =
"ДАННЫЕ ОТФИЛЬТРИРОВАНЫ ПО "
& strOutput
End
If
End
Sub
03 Как работает макрос
1. Шаг 1 объявляет четыре переменные. AF является переменной автофильтр, которая используется для манипулирования объектом AutoFilter. TargetField переменная строка, которую мы используем, чтобы держать заголовки столбцов с фильтрами. strOutput переменная строка, которую мы используем для построения окончательного текста, который идет в строке состояния. И, наконец, переменная i служит как простой счетчик, что позволяет нам выполнять итерацию по полям в нашем Автофильтре.
2. Шаг 2 проверяет свойство AutoFilterMode, чтобы увидеть, есть ли на листе фильтры. Если нет, то мы устанавливаем свойство StatusBar в значение False. Это имеет эффект очистки строки состояния. Затем мы выходим из процедуры.
3. Шаг 3 устанавливает переменную AF к фильтру на активном листе. Затем мы устанавливаем наш счетчик от 1 до максимального количества столбцов в диапазоне AutoFiltered. Объект AutoFilter отслеживает столбцы с номерами индексов. Столбец 1 индекс 1; столбец 2 - индекс 2 и т.д. Идея заключается в том, что цикл проходит каждый столбец в фильтре, используя переменную (I), как номер индекса.
4. Шаг 4 проверяет статус AF.Filters объекта для каждого (I) — порядковый номер столбца. Если Автофильтр фильтрует столбец, то статус этого столбца Вкл. Если столбец отфильтрован, то захватываем имя поля в TargetField. Мы на самом деле можем получить имя поля с помощью ссылки на диапазон нашего объекта AF Автофильтр. С помощью этого диапазона, мы можем использовать элемент ячейки, чтобы определить имя поля.
Ячейка (1,1) фиксирует значение в первой строке, первом столбце. Ячейка (1,2) фиксирует значение в первой строке, втором столбце и т.д. Как видите на шаге 4 закодирована строка 1 и используется переменная (I), чтобы указать индекс столбца. Это означает, что, как Макрос проводит итерацию через столбцы, она всегда захватывает значение в строке в качестве имени TargetField.
После того, как у нас есть имя TargetField, мы можем передать эту информацию (strOutput в нашем случае). strOutput просто находит имена и сцепляет их в удобном виде для чтения текстовой строки.
5. Шаг 5 сначала проверяет, есть ли что-то в строке strOutput. Если strOutput пуст, это означает, что макрос не нашел ни одного столбца в фильтре. В этом случае Шаг 5 просто устанавливает свойство StatusBar False, передавая управление обратно Excel. Если strOutput не пуст, шаг 5 устанавливает свойство StatusBar равным некоторому вспомогательному тексту вместе с нашей строкой strOutput.
04 Как использовать
В идеале нужно, чтобы этот макрос запускался каждый раз, когда поле фильтруется. Однако Excel не имеет событие OnAutoFilter. Ближе всего к этому является событие Worksheet_Calculate. Фильтры сами по себе не вычисляют ничего, так что вам нужно ввести «непостоянную» функцию на листе, которая содержит ваши отфильтрованные данные. Непостоянная функция та, которая делает перерасчет при внесении любых изменений на рабочем листе. Можно использовать функцию ТДАТА(). Функция ТДАТА является непостоянной функцией, которая возвращает дату и время. При этом ее нужно обязательно пересчитывать каждый раз, когда фильтр изменяется. Поместите ТДАТА в любом месте на листе (введя = ТДАТА() в любой клетке).
Затем скопируйте и вставьте макрос в окно Worksheet_Calculate
1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
2. В окне проекта, найдите свой проект / рабочую книгу и нажмите на знак плюс рядом с ней, чтобы увидеть все листы.
3. Нажмите на лист, из которого вы хотите вызвать код.
4. В верхнем левом меню выберите Worksheet, а в правом событие Calculate.
5. Введите или вставьте код нашего макроса, а ниже добавьте следующие два кода:
Private
Sub
Worksheet_Deactivate()
Application.StatusBar =
False
End
Sub
Private
Sub
Worksheet_Activate()
Call
Worksheet_Calculate
End
Sub
Кроме того, можно добавить этот кусок кода в книгу BeforeClose :
Private
Sub
Workbook_BeforeClose(Cancel
As
Boolean
)
Application.StatusBar =
False
End
Sub
Событие Worksheet_Deactivate очищает строку состояния при переходе на другой лист или книги. Это позволит избежать путаницы при перемещении между листами. Событие Worksheet_Activate запускает макрос в Worksheet_Calculate и возвращает показатели Строки состояния при переходе обратно к листу с фильтром. Событие Workbook_BeforeClose очищает строку состояния при закрытии книги. Это позволит избежать путаницы при перемещении между книгами.
05 Скачать файл
Автор проекта
Дмитрий Якушев
Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель - помочь вам эффективнее работать в Excel.
Изучайте наши статьи с примерами формул, сводных таблиц, условного форматирования, диаграмм и макросов. Записывайтесь на наши курсы или заказывайте обучение в корпоративном формате.
Сайт https://akademia-excel.ru/
ИП Якушев Дмитрий Александрович
ОГРНИП: 314501721200022
ИНН: 501706813807
Образовательная лицензия № Л035-01255-50/01194039
Почта: info@akademia-excel.ru
Телефон для связи: + 7 (958) 697-73-88, + 7 (495) 145-23-86
Регистрация на сайте означает согласие с пользовательским соглашением и на получение рассылки и рекламных материалов.
Политика в отношении обработки и защиты персональных данных.
Банковские реквизиты:
Расчетный счет 40802810500000003597
Банк АО «Тинькофф Банк»
Юридический адрес Банка Москва, 123060,1-й Волоколамский проезд, д. 10, стр. 1
Корр. счет Банка 30101810145250000974
ИНН Банка 7710140679
БИК Банка 044525974
Подписывайтесь на нас в соц.сетях:
Сайт https://akademia-excel.ru/
ИП Якушев Дмитрий Александрович
ОГРНИП: 314501721200022
ИНН: 501706813807
Образовательная лицензия № Л035-01255-50/01194039
Банковские реквизиты:
Расчетный счет 40802810500000003597
Банк АО «Тинькофф Банк»
Юридический адрес Банка Москва, 123060,1-й Волоколамский проезд, д. 10, стр. 1
Корр. счет Банка 30101810145250000974
ИНН Банка 7710140679
БИК Банка 044525974
Регистрация на сайте означает согласие с пользовательским соглашением и на получение рассылки и рекламных материалов.
Политика в отношении обработки и защиты персональных данных.
Почта: info@akademia-excel.ru
Телефон для связи: + 7 (958) 697-73-88, + 7 (495) 145-23-86
Написать в тех.поддержку
Подписывайтесь:
авторизуйтесь