Автоматическая смена автозамен на основе связанной ячейки

Вопрос или проблема

Кратко: Как мне заставить скрипт 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: Размещение кода в нужных местах

  1. Откройте Excel и откройте редактор VBA, нажав Alt + F11.
  2. Найдите ваш лист tab1 в окне проекта, обычно отображаемом слева. Дважды щелкните по нему, чтобы открыть окно кода.
  3. Скопируйте и вставьте приведенный выше код в это окно.

Шаг 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: Тестирование

  1. Измените значение в ячейке I2 на любой из ваших вкладок (tab1, tab2, или tab3).
  2. Убедитесь, что значения в других вкладках обновляются автоматически, и фильтры применяются на всех листах, показывая только те строки, которые соответствуют вашему критерию.

Заключение

Теперь вы настроили автоматическую фильтрацию данных на нескольких вкладках в Excel в зависимости от изменений в ячейке I2. Этот подход позволяет поддерживать данные актуальными, без необходимости вручную изменять фильтры на каждом листе. Не забывайте сохранять ваши изменения и регулярно проверять функциональность скрипта при внесении изменений в структуру таблиц.

Оцените материал
Добавить комментарий

Капча загружается...