Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2009, 19:07   #1
GES
Пользователь
 
Регистрация: 27.08.2008
Сообщений: 23
По умолчанию Поймать автофильтр

Привет коллеги.
Вопрос наверное сложный...
Как перехватить событие изменения автофильтра на листе?
Например, процедура Change объекта Worksheet перехватывает событие изменения ячейки на листе, а мне нужно перехватить событие изменения автофильтра...
GES вне форума Ответить с цитированием
Старый 30.06.2009, 20:40   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Вопрос наверное сложный...
Да, действительно.
Штатными средствами Excel этого сделать не получится - событие изменения автофильтра не отлавливается.

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

Вот что у меня получилось:

Стандартный модуль:
Код:
Public nextTime As Date
Public LastCriteria As String, IsOn As Boolean

Sub CheckAutofilter()
    Dim af As AutoFilter: Set af = ActiveSheet.AutoFilter
    If Not af Is Nothing Then
        If af.Filters(2).On Then
            If Not IsOn Then MsgBox "Фильтрация включена", vbInformation
            IsOn = True
            If af.Filters(2).Criteria1 <> LastCriteria Then
                LastCriteria = af.Filters(2).Criteria1
                MsgBox "Параметры автофильтра изменены!", vbInformation
            End If
        Else
            If IsOn Then IsOn = False: MsgBox "Фильтрация выключена", vbExclamation
        End If
    End If

    nextTime = Now + TimeValue("00:00:01")
    Application.OnTime nextTime, "CheckAutofilter"
End Sub

Модуль книги:
Код:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Year(nextTime) = Year(Now) Then Application.OnTime nextTime, "CheckAutofilter", , False
End Sub

Private Sub Workbook_Open()
    CheckAutofilter
End Sub

Sub StopMacro()
    If Year(nextTime) = Year(Now) Then Application.OnTime nextTime, "CheckAutofilter", , False
End Sub

Проверял - вроде всё работает как надо.
Измените параметры фильтра во втором столбце:
EducatedFool вне форума Ответить с цитированием
Старый 01.07.2009, 04:55   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
событие изменения автофильтра не отлавливается.
Действительно. Но т.к. изменение автофильтра приводит к пересчету формул, то можно этим воспользоваться. Посмотрите пример во вложении.
Вложения
Тип файла: rar EventAutoFilter.rar (7.2 Кб, 62 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 01.07.2009, 10:14   #4
GES
Пользователь
 
Регистрация: 27.08.2008
Сообщений: 23
По умолчанию

Спасибо за ответ
Вариант с таймером - не проходит, т.к. у меня много других макросов работает...и при переходе на другой лист он обваливается, нужно еще кучу проверок к нему дописывать
GES вне форума Ответить с цитированием
Старый 01.07.2009, 10:20   #5
GES
Пользователь
 
Регистрация: 27.08.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Действительно. Но т.к. изменение автофильтра приводит к пересчету формул, то можно этим воспользоваться. Посмотрите пример во вложении.
Такой вариант я уже писал, только к нему тоже пришлось кучу проверок цеплять, т.к. каждый пересчет запускает макрос и получается замкнутый круг....потому, что мне нужно чтобы на 2х одинаковых листах фильтры были в одном состоянии, и когда я меняю фильтр на 1м листе, запускается макрос и меняет фильтр на втором листе, что в свою очередь вызывает пересчет формул...пришлось запоминать все данные фильтров и сравнивать на входе в Calculation...
GES вне форума Ответить с цитированием
Старый 01.07.2009, 11:00   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
пришлось запоминать все данные фильтров и сравнивать
А какие в этом проблемы? Например, в предложенном варианте критерий фильтра хранится в глобальной переменной. Пусть их будет с десяток. И еще: если пользователь меняет критерий автофильтра, то запустив при это макрос, мы всегда знаем какой при этом лист активный, т.е. в каком листе изменился критерий фильтра. Поэтому не такая уж большая "куча" сравнений, а два - три штуки.

Цитата:
что в свою очередь вызывает пересчет формул
Если Вам это не нужно, то в начале кода макроса запретите обработчик событий, а в конце включите.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 01.07.2009, 14:01   #7
GES
Пользователь
 
Регистрация: 27.08.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
А какие в этом проблемы? Например, в предложенном варианте критерий фильтра хранится в глобальной переменной. Пусть их будет с десяток. И еще: если пользователь меняет критерий автофильтра, то запустив при это макрос, мы всегда знаем какой при этом лист активный, т.е. в каком листе изменился критерий фильтра. Поэтому не такая уж большая "куча" сравнений, а два - три штуки.
Если Вам это не нужно, то в начале кода макроса запретите обработчик событий, а в конце включите.
Обработчик событий отключен
Просто хотелось бы не через Calculate это все решить, для Calculate у меня есть другая задача
Я уже литературу полистал, по-моему нашел способ. Нужно написать свой класс автофильтра и можно будет отлавливать через событие класса....
Спасибо за советы
GES вне форума Ответить с цитированием
Старый 04.12.2010, 21:00   #8
SuperLisenok
Новичок
Джуниор
 
Регистрация: 25.11.2010
Сообщений: 2
Подмигивание

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Действительно. Но т.к. изменение автофильтра приводит к пересчету формул, то можно этим воспользоваться. Посмотрите пример во вложении.
Подскажите, пожалуйста, (я в ВБА абсолютный чайник), а как сделать на изменение не в одном столбце, а больше, 5 или 6...
SuperLisenok вне форума Ответить с цитированием
Старый 04.12.2010, 21:15   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

что сделать на изменение?
какого рода изменения?
в каких столбцах (перечислите по-именно)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 04.12.2010, 21:37   #10
SuperLisenok
Новичок
Джуниор
 
Регистрация: 25.11.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
что сделать на изменение?
какого рода изменения?
в каких столбцах (перечислите по-именно)
да на изменение. пример взят с этой же темы, с добавлением нескольких столбцов
Вложения
Тип файла: rar 1.rar (9.5 Кб, 27 просмотров)
SuperLisenok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListView: как поймать CDDS_POSTERASE в NM_CUSTOMDRAW instance Win Api 0 12.05.2008 16:33
Как поймать событие в COM? den303 Общие вопросы Delphi 0 13.09.2007 12:06
автофильтр zetrix Microsoft Office Excel 0 31.10.2006 07:58