Як автоматично оновити автоматичний фільтр Excel при зміні даних?


15

Як автоматично оновити автоматичний фільтр Excel при зміні даних?

Випадок використання: я змінюю значення однієї комірки на значення, яке було відфільтровано. Я хочу бачити, як поточний рядок зникає, не роблячи нічого іншого.


3
Мені вдалося змусити його працювати, коли я помістив цей код у події Worksheet_Change () замість події Worksheet_Calculate ().
F106дарт

1
поставте це як відповідь і прийміть це, щоб інші знали, що ви зробили, і щоб питання було вирішено.
jzd

Мені довелося внести ще одну модифікацію, тому що Calculate очікував параметр. Тепер це працює !.
sorin

Відповіді:


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, щоб повернутися до подання електронних таблиць.

Це дозволить автоматично оновити. Не забудьте зберегти файл у форматі з макрою підтримкою брехні .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 / макрос на основі 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


0

Просто для закріплення відповіді:

Сорін каже:

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

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

І Кріс використав цей код (що я щойно зробив у 2010 році):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Якщо ви не розширюєте публікацію, ви бачите лише довгу відповідь! ;)


-1

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

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

danicotra використав спрощений приклад. Насправді ви можете це зробити більш загально. Припустимо з ActiveSheet для наступного (або якогось іншого об'єкта аркуша):

  1. Збережіть діапазон автофільтра. У ньому є стовпці .AutoFilter.Filters.Count та (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) рядки, збережені в rngAutofilter

  2. Зберіть в масиві myAutofilters кожне з 4 властивостей кожного з елементів .AutoFilter.Filters.Count автофільтра, обережно, щоб уникнути "помилок, визначених додатком", коли .On або .Operator помилковий. (myAutofilters буде переведено на кількість рядків і стовпців на кроці 1)

  3. Вимкніть фільтр, але збережіть спадні файли за допомогою .ShowAllData

  4. Для кожного елемента фільтра, який був .За збереженим масивом, скиньте 3 з 4 властивостей кожного з елементів .AutoFilter.Filters.Count автофільтра. Знову подбайте про те, щоб уникнути "помилок, визначених додатком", коли .Operator помилковий, тому для кожного елемента "i",
    rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
    або
    rngAutofilter.AutoFilter Field: = 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

2
Принаймні, майте b___s прокоментувати, якщо ви зволікаєте, і я можу використовувати зворотній зв'язок, щоб краще служити громаді. Адміністратори, це я б хотів зробити. Усі суботні матеріали потребують пояснювального коментаря. Я бачив багато очевидних чудових постів, незрозуміло скажених, що справді, здається, є епідемією суперусера - і ніде більше.
MicrosoftShouldBeKickedInNuts

+1 для "Усі судноводства потребують пояснювального коментаря."
Гравітація

-1
використовуючи "дані, з таблиці" / запит на потужність у excel, що дає нам можливість оновити дані під час відкриття файлу.
(також автоматичне сортування та індексний стовпець (кількість фільтрованих рядків автоматично))

Це створить результат на іншому аркуші.

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

щоб знову відредагувати, натисніть на вкладку запитів, а потім на редагування

натисніть на вкладку дизайну в excel, на стрілку нижче оновити, властивості підключення,
оновити дані під час відкриття файлу.


адаптовано з: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
частина: 3. Сортування випадаючих списків за допомогою запиту на владу


Ви також можете скопіювати дані з sheet1, якщо вони не порожні, наприклад, поле a1.
скопіюйте це в поле a1 на аркуші2:
= ЯКЩО (Sheet1! A1 ""; Sheet1! A1; "")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.