Как автоматически обновить автофильтр Excel при изменении данных?

15

Как автоматически обновить автофильтр Excel при изменении данных?

Вариант использования: я изменяю значение одной ячейки на значение, которое было отфильтровано. Я хочу, чтобы текущая строка исчезла без необходимости делать что-либо еще.

Сорин
источник
3
Я смог заставить его работать, когда я поместил этот код в событие Worksheet_Change () вместо события Worksheet_Calculate ().
F106dart
1
поставьте это как ответ и примите это, чтобы другие знали, что вы сделали, и чтобы вопрос был решен.
JZD
Мне пришлось сделать еще одну модификацию, потому что Calculate ожидал параметр. Теперь это работает!
Сорин

Ответы:

7

Обмен кода с этим, похоже, тоже помогает (по крайней мере, в Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Крис
источник
4

Я обнаружил, что когда я работал с таблицами, это не сработало. Фильтр был не на листе, а на столе. этот код добился цели

Private Sub Worksheet_Change(ByVal Target As Range)
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
         .AutoFilter.ApplyFilter
    End With
End Sub

Я нашел информацию здесь: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp

Нет больше хаков
источник
1

Щелкните правой кнопкой мыши по имени вашего листа, выберите «Просмотр кода» и вставьте код ниже. После вставки щелкните значок Excel под «Файл» в левом верхнем углу или введите Alt-F11, чтобы вернуться к представлению электронной таблицы.

Это включит автообновление. Не забудьте сохранить файл в формате с поддержкой макросов lie .xlsm.

Private Sub Worksheet_Change(ByVal Target As Range)

    If Me.FilterMode = True Then
        With Application
           .EnableEvents = False
           .ScreenUpdating = False
        End With

        With ActiveWorkbook
            .CustomViews.Add ViewName:="Mine", RowColSettings:=True
          Me.AutoFilterMode = False
            .CustomViews("Mine").Show
            .CustomViews("Mine").Delete
        End With


         With Application
           .EnableEvents = True
           .ScreenUpdating = True
        End With
    End If

End Sub
Сорин
источник
1

Я также использую VBA / Macro, основанный на Worksheet_Changeсобытии, но мой подход немного отличается ... Хорошо, сначала код, а затем объяснения:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' first remove filter
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1        
    ' then apply it again
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub

(Используйте комбинацию клавиш Alt+, F11чтобы появилась панель разработки, и вставьте код на лист, содержащий фильтр, который вы хотите автоматически обновить.)

В моем примере я предполагаю иметь простой фильтр для одного столбца (в моем случае L), и что мой диапазон данных находится в строках от 1 (даже если он может содержать заголовок) до 126 (выберите число, достаточно большое, чтобы конечно). Операция проста: когда что-то меняется на моем листе, фильтр в указанном диапазоне снова удаляется / повторно применяется, чтобы его обновить. Здесь нужно немного пояснений: поле и критерии .

Поле представляет собой целое смещение диапазона. В моем случае у меня только фильтр с одним столбцом, а диапазон создается одним столбцом (L), который является первым в диапазоне (поэтому я использую 1 в качестве значения).

Критерии является строкой , которая описывает фильтр для применения в диапазоне данных. В моем примере я хочу показать только те строки, где столбец L отличается от 0 (поэтому я использовал «<> 0»).

Это все. Дополнительные сведения о методе Range.AutoFilter см. По адресу : https://msdn.microsoft.com/en-us/library/office/ff193884.aspx.

danicotra
источник
0

Просто чтобы закрепить ответ (ы):

Сорин говорит:

Щелкните правой кнопкой мыши по имени вашего листа, выберите «Просмотр кода» и вставьте код ниже. После вставки щелкните значок Excel под «Файл» в левом верхнем углу или введите Alt-F11, чтобы вернуться к представлению электронной таблицы.

Это включит автообновление. Не забудьте сохранить файл в формате с поддержкой макросов lie .xlsm.

И Крис использовал этот код (который я только что сделал в 2010 году):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Если вы не расширите сообщение, вы увидите только длинный ответ! ;)

Случайный парень
источник
-1

Извините, недостаточно комментариев для комментирования. (Администраторы, не стесняйтесь разрезать это на комментарий выше.) Пользовательский ответ "danicotra" начинается с "Я использую VBA / Macro, основанный также на событии Worksheet_Change, но мой подход ..." с
"первым удаленным фильтром
", затем применяю его снова
является правильным решением при использовании Excel 2007+. Однако .AutoFilter.ApplyFilter недопустим в XL03 и более ранних версиях, поэтому я покажу путь ниже.

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

Даникотра использовал упрощенный пример. На самом деле, вы можете сделать это более широко. Предположим, с ActiveSheet для следующего (или некоторого другого объекта листа):

  1. Сохранить диапазон автофильтра. Он содержит столбцы .AutoFilter.Filters.Count и строки (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), сохраненные в rngAutofilter.

  2. Соберите в массив myAutofilters каждое из 4 свойств каждого из элементов автофильтра .AutoFilter.Filters.Count, следя за тем, чтобы избежать ошибок, определяемых приложением, когда .On или .Operator имеет значение false. (myAutofilters будет reDim'd на количество строк и столбцов в шаге 1)

  3. Отключите фильтр, но сохраните выпадающие списки с помощью .ShowAllData

  4. Для каждого элемента фильтра, который был .On в соответствии с сохраненным массивом, сбросьте 3 из 4 свойств каждого из элементов автофильтра .AutoFilter.Filters.Count. Опять же, позаботьтесь о том, чтобы избежать ошибок, определенных приложением, когда .Operator имеет значение false, поэтому для каждого элемента «i»
    поле rngAutofilter.AutoFilter: = i, Criteria1: = myAutofilters (i, 2)
    или
    поле rngAutofilter.AutoFilter: = i, Критерии1: = myAutofilters (i, 2), Оператор: = myAutofilters (i, 3), Критерии2: = myAutofilters (i, 4)

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

Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
  'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
  'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
  Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
  iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
  If iNumActiveAutofilters < 1 Then
      Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
      Exit Sub
  End If
  ActiveSheet.ShowAllData

  Rem Here optionally do stuff which can include changing data or toggling autofilter columns

  For i = 1 To iNumAutofilters
      If myAutofilters(i, 1) Then
          If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
          Else
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
          End If
          Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
      End If
      'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
  Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
  Dim i As Long, iRowsAutofiltered As Long
  SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
  iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
  If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
  ReDim myAutofilters(1 To iNumAutofilters, 4)
  For i = 1 To iNumAutofilters
      myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
      If myAutofilters(i, 1) Then
          SaveAutoFilterInfo = SaveAutoFilterInfo + 1
          myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
          myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
          If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
              myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
          End If
      End If
  Next i
  iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
  Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function
MicrosoftShouldBeKickedInNuts
источник
Зачем в МИРЕ кто-то отрицал бы этот полезный ответ, который даже включает в себя полный автономный код (и тщательно проверенный), и даже дает подробное объяснение кода? Я спрашиваю, серьезно. Люди хотят хорошую профессиональную помощь в суперпользователе, или я даже не беспокоюсь? Есть ли тролли, которые просто понижают голосование, чтобы относительно поддержать себя ??
MicrosoftShouldBeKickedInNuts
2
По крайней мере, у вас есть комментарии, если вы не согласны, чтобы я мог использовать обратную связь, чтобы лучше служить сообществу. Админы, это предложение, которое я хотел бы сделать. У всех отрицательных отзывов требуется пояснительный комментарий. Я видел много явно замечательных постов, которые необъяснимо опровергали, что действительно кажется эпидемией для суперпользователя - и нигде больше.
MicrosoftShouldBeKickedInNuts
+1 за «Все понижающие голоса требуют пояснительного комментария».
Гравитация
-1
используя «данные из таблицы» / Power запрос в Excel, что дает нам возможность обновить данные при открытии файла.
(также автоматическая сортировка и индексный столбец (количество фильтруемых строк автоматически))

Это создаст результат на другом листе.

-выбрать данные, необходимые с помощью мыши (строки и столбцы)
-нажмите на вкладке данных, из таблицы
-в последнем столбце исключить пробелы (необязательно, если вы хотите отображать только заполненные ячейки)
-add column, index column (необязательно, если вы хотите добавить номер строки к отфильтрованным результатам)
-Закройте и загрузите в

чтобы редактировать снова, нажмите на вкладку запроса, а затем на редактировать

нажмите на вкладку «Дизайн» в Excel, на стрелке ниже обновить, свойства подключения,
обновить данные при открытии файла.


адаптировано из: https://www.excelcampus.com/tips/sort-drop-down-lists-automatics/
часть: 3. Сортировка выпадающих списков с помощью Power Query


Вы также можете скопировать данные из листа sheet1, если они не пусты, например, поле a1.
скопируйте это в поле a1 в sheet2:
= IF (Лист1 A1 "!!"; Лист1 A1; "")

Боян Джурич
источник