2013-03-11 2 views
1

У меня в настоящее время есть макрос для автофильтра моих данных. Я не могу заставить его работать автоматически при изменении ячейки. Я хочу, чтобы макрос запускался всякий раз, когда значение в ячейке менялось. Был бы благодарен за любую помощь. Я задаюсь вопросом, лежит ли проблема в том, на каком листе я размещаю свой код.Макрос для расширенного фильтра не работает автоматически

Мой код выглядит следующим образом.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 

    ' The variable KeyCells contains the cells that will 
    ' cause an alert when they are changed. In this case, 
    ' Cell B2 will be changed when a value is selected on 
    ' another worksheet. 
    Set KeyCells = Range("B1:B2") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
     Is Nothing Then 

    ' Perform advanced filter on data 
    ' Place your code here. 
    Range("B4:H976").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ 
     Range("SalesByLocation!Criteria"), Unique:=False 

End If 
End Sub 
+0

Вы пытались его отладить? Установите точку останова в 'Set KeyCells = Range (« B1: B2 »)' и посмотрите, попадает ли он. – nunzabar

+0

Привет, что вы имеете в виду, установив точку останова? – sychia2010sis

+0

Чтобы установить точку останова, поместите курсор в строку 'Set KeyCells = ...' и нажмите F9. Когда код запускается, то есть событие срабатывает, VBA останавливает выполнение - и вы можете выполнить код с F8, чтобы посмотреть, что происходит. Попробуйте и дайте понять, как все прошло. PS: Пожалуйста, используйте @username в любом комментарии, поэтому, пожалуйста, получите уведомление по вашему отзыву! –

ответ

0

Я решил проблему! Я закончил разделение кодов на разные формы, а затем вызвал расширенный макрос фильтра. Я думаю, что с моими кодами впереди была небольшая проблема.Изменил это на что-то подобное.

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Range("C4")) Is Nothing Then 
     Exit Sub 
    Else 
     Call Sheet4.AFilter 
    End If 
End Sub 
0

Добро пожаловать в SO!

Вам необходимо поместить свой код в рабочий лист, на котором вы будете применять изменения. То есть не размещайте его ни в одном модуле, но дважды щелкните SheetX вашего проекта (X - номер листа).

Глядя на ваш код, вы, вероятно, также следует вставить

 
Application.EnableEvents = False 

после пункта IF, а затем

 
Application.EnableEvents = True 

перед тем End If. Еще один код события может вызвать событие снова, что приведет к фактическому переполнению стека.

+0

Я поместил его в модуль рабочего листа, как вы сказали, и ввел оба выражения в мой код, но он все еще не запускает макрос, когда значение изменяется. – sychia2010sis

+1

... также, хотя у меня возникло бы желание использовать Immediate Window для запуска этой строки кода «Application.EnableEvents = True», чтобы убедиться, что события находятся на – whytheq

0

Работает отлично для меня.

Попробуйте открыть Immediate Window (Ctrl + G) и введите следующую команду, а затем нажмите клавишу ВВОД:

Application.EnableEvents = True 

Теперь посмотрим, если код работает?
Это гарантирует, что приложение будет прослушивать события для запуска.

В качестве теста я использую следующее и в окне сообщения появляется тонкая:

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim KeyCells As Range 
    Set KeyCells = Range("B1:B2") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then 

      ' Perform advanced filter on data 
      ' Place your code here. 
      MsgBox "Hello Event" 

    End If 

End Sub 

Как значения в B1: B2 изменилось? - через формулу, которая находится в ячейках? Или пользователь переходит в ячейку, меняет значение и затем нажимает клавишу ввода? ... второй вариант - это то, что было реализовано.


Редактировать

Я думаю, что вы должны будете исследовать worksheet_calculate событие

REFERENCE TO OTHER SO ARTICLE


Дальнейшее редактирование

Возможно, вам лучше создать процедуру события для события изменения в комбинированном поле, которое подает значения в B1:B2. Это закрытый вопрос на самом деле является хорошей отправной точкой, как это имеет довольно много ссылок на другие вопросы:

REFERENCE TO OTHER SO ARTICLE ABOUT COMBOBOX EVENTS

+0

. Я попытался использовать ваши коды в качестве теста, а msgbox не появляются. связано ли это с изменением значений в В2? так как он через формулу, которая принимает то, что пользователь выбирает из выпадающего списка на другом листе? – sychia2010sis

+0

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

+0

Я считаю, что это проблема с точкой запуска рабочего листа. Я выбираю из выпадающего списка на листе 1, и расширенный фильтр выполняется на рабочем листе2. Я думаю, поэтому первая часть кода не запускается. – sychia2010sis

Смежные вопросы