Вопрос или проблема
Кратко: Как мне заставить скрипт Autofilter запускаться при изменении ячейки (вызванном другим скриптом, а не вводом пользователя) в ячейке I2?
(примечание: Excel 365, у меня нет конкретной метки для этой версии, но не стесняйтесь корректировать, если я что-то упустил!)
У меня есть связанные ячейки на разных вкладках, которые изменяют значение каждый раз, когда одно из них меняет свое значение. Если установить 5 на одной вкладке, это изменит другие ячейки на других вкладках на такое же значение. Это пример из вкладки tab1 (другие вкладки в данный момент идентичны по содержанию и макету, с локально скорректированными версиями этого скрипта):
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("F2").Address Then
Range("A5:E120").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab2").Range("I2").Value <> Target.Value Then
Sheets("tab2").Range("I2").Value = Target.Value
End If
End If
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab3").Range("I2").Value <> Target.Value Then
Sheets("tab3").Range("I2").Value = Target.Value
End If
End If
End If
End Sub
Я пытаюсь отфильтровать строки на двух из этих вкладок в зависимости от этого значения: если установлено значение 5, оно должно показывать все строки в колонке A, которые содержат значение 5 или меньше (или 3 или меньше, или 2 или меньше и т.д.). Я создал вспомогательный столбец для этой цели, который проверяет значение в I2 и сравнивает значения в колонке A:
=IF(A5<=$I$2,"yes","no")
Идея заключается в том, что все, что имеет ‘yes’, будет показано, а все, что имеет ‘no’, будет скрыто.
В настоящее время я вручную использую AutoFilter на каждой вкладке, но хотел бы автоматизировать изменения фильтра. Хотя я довольно продвинут в связке сложных таблиц с помощью встроенных формул, в VBA я все еще новичок.
Это кажется многообещающим (также упомянуто выше): https://www.tutorialspoint.com/how-to-autofilter-rows-based-on-cell-values-in-excel, который, похоже, не использует полные выпадающие меню AutoFilter, но тем не менее работает:
Private Sub Worksheet_Change(ByVal Target As Range)
'Обновлено Нирмалом
If Target.Address = Range("F2").Address Then
Range("A5:E120").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")
End If
End Sub
Это берет значение из E2 и скрывает строки с значением в столбце, заголовок которого совпадает с E1. Выпадающие меню AutoFilter недоступны, но это нормально, так как фильтрация – это наиболее важная часть.
С чем я сталкиваюсь, так это то, что этот скрипт, похоже, не реагирует на изменения связанных ячеек, а только после ввода пользователя. Таким образом, вам нужно будет снова внести изменения на каждой вкладке, что именно это я пытаюсь избежать (т.е. изменить значение в одном месте, чтобы фильтры менялись повсюду)…
Фокус в добавлении еще одной проверки для этой второй ячейки (см. вторую строку ниже):
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("F2").Address Or Target.Address = Range("I2").Address Then
Range("A5:E120").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab2").Range("I2").Value <> Target.Value Then
Sheets("tab2").Range("I2").Value = Target.Value
End If
End If
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab3").Range("I2").Value <> Target.Value Then
Sheets("tab3").Range("I2").Value = Target.Value
End If
End If
End If
End Sub
Небольшие изменения в этом скрипте (изменение ‘tab1’ и ‘tab2’) теперь имеются на каждой из трех вкладок. Изменение значения с помощью выпадающего меню на любых из вкладок теперь приводит к тому, что автофильтр применяется ко всем трем вкладкам автоматически.
Спасибо gns100 за то, что указал мне правильное направление!
Ответ или решение
Для автоматического изменения фильтров в Excel на основе значения в связанной ячейке, вам потребуется использовать VBA и событие Worksheet_Change
. Ваша задача заключается в том, чтобы фильтры применялись к нескольким вкладкам в зависимости от изменения значений в указанной ячейке. Вот пошаговое руководство для решения данной задачи:
Шаг 1: Создание скрипта фильтрации
Используя следующий код, вы сможете автоматически фильтровать данные в зависимости от значения в ячейке I2
на вашей первой вкладке (например, tab1
):
Private Sub Worksheet_Change(ByVal Target As Range)
' Проверяем изменение в ячейках F2 или I2
If Not Intersect(Target, Me.Range("F2")) Is Nothing Or Not Intersect(Target, Me.Range("I2")) Is Nothing Then
' Применяем автофильтр на текущей вкладке
Me.Range("A5:E120").AutoFilter Field:=1, Criteria1:="<=" & Me.Range("I2").Value
' Обновляем значения I2 на других вкладках
If Sheets("tab2").Range("I2").Value <> Me.Range("I2").Value Then
Sheets("tab2").Range("I2").Value = Me.Range("I2").Value
End If
If Sheets("tab3").Range("I2").Value <> Me.Range("I2").Value Then
Sheets("tab3").Range("I2").Value = Me.Range("I2").Value
End If
End If
End Sub
Шаг 2: Размещение кода в нужных местах
- Откройте Excel и откройте редактор VBA, нажав
Alt + F11
. - Найдите ваш лист
tab1
в окне проекта, обычно отображаемом слева. Дважды щелкните по нему, чтобы открыть окно кода. - Скопируйте и вставьте приведенный выше код в это окно.
Шаг 3: Копирование кода для других вкладок
Чтобы фильтры работали на всех вкладках (например, tab2
и tab3
), вам нужно вставить аналогичный код в модули каждого из соответствующих листов. Измените соответствующие ссылки на листы таким образом:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("I2")) Is Nothing Then
If Sheets("tab1").Range("I2").Value <> Me.Range("I2").Value Then
Sheets("tab1").Range("I2").Value = Me.Range("I2").Value
End If
If Sheets("tab3").Range("I2").Value <> Me.Range("I2").Value Then
Sheets("tab3").Range("I2").Value = Me.Range("I2").Value
End If
End If
End Sub
Шаг 4: Тестирование
- Измените значение в ячейке
I2
на любой из ваших вкладок (tab1
,tab2
, илиtab3
). - Убедитесь, что значения в других вкладках обновляются автоматически, и фильтры применяются на всех листах, показывая только те строки, которые соответствуют вашему критерию.
Заключение
Теперь вы настроили автоматическую фильтрацию данных на нескольких вкладках в Excel в зависимости от изменений в ячейке I2
. Этот подход позволяет поддерживать данные актуальными, без необходимости вручную изменять фильтры на каждом листе. Не забывайте сохранять ваши изменения и регулярно проверять функциональность скрипта при внесении изменений в структуру таблиц.