Як автоматично оновити автоматичний фільтр Excel при зміні даних?
Випадок використання: я змінюю значення однієї комірки на значення, яке було відфільтровано. Я хочу бачити, як поточний рядок зникає, не роблячи нічого іншого.
Як автоматично оновити автоматичний фільтр Excel при зміні даних?
Випадок використання: я змінюю значення однієї комірки на значення, яке було відфільтровано. Я хочу бачити, як поточний рядок зникає, не роблячи нічого іншого.
Відповіді:
Я виявив, що коли я працював з таблицями, це не працювало. Фільтр був не на аркуші, а на столі. цей код зробив свою справу
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
Клацніть правою кнопкою миші на назві аркуша, виберіть "Переглянути код" і вставте код нижче. Після вставки натисніть значок 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
Я також використовую 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
Просто для закріплення відповіді:
Сорін каже:
Клацніть правою кнопкою миші на назві аркуша, виберіть "Переглянути код" і вставте код нижче. Після вставки натисніть значок Excel внизу "Файл" у верхньому лівому куті або введіть Alt-F11, щоб повернутися до подання електронних таблиць.
Це дозволить автоматично оновити. Не забудьте зберегти файл у форматі з підтримкою макросу lie .xlsm.
І Кріс використав цей код (що я щойно зробив у 2010 році):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
Якщо ви не розширюєте публікацію, ви бачите лише довгу відповідь! ;)
Вибачте, недостатня відповідь для коментарів. (Адміністратори, сміливо виріжте це на коментар вище.) Відповідь користувача "danicotra", починаючи з "Я також використовую VBA / макрос на основі події Worksheet_Change, але мій підхід ..." із
"спочатку видалити фільтр
", потім застосувати його знову
правильне рішення при використанні Excel 2007+. Однак .AutoFilter.ApplyFilter недійсний у XL03 і раніше, тому я показую спосіб нижче.
Я прошу, щоб справжні експерти та гуру читали код, бо я впевнений, що це матеріал верхньої полиці. Можливо, незрозуміле число голосів на цю відповідь можна змінити, коли люди побачать, що добре робиться нижче.
danicotra використав спрощений приклад. Насправді ви можете це зробити більш загально. Припустимо з ActiveSheet для наступного (або якогось іншого об'єкта аркуша):
Збережіть діапазон автофільтра. У ньому є стовпці .AutoFilter.Filters.Count та (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) рядки, збережені в rngAutofilter
Зберіть в масиві myAutofilters кожне з 4 властивостей кожного з елементів .AutoFilter.Filters.Count автофільтра, обережно, щоб уникнути "помилок, визначених додатком", коли .On або .Operator помилковий. (myAutofilters буде переведено на кількість рядків і стовпців на кроці 1)
Вимкніть фільтр, але збережіть спадні файли за допомогою .ShowAllData
Для кожного елемента фільтра, який був .За збереженим масивом, скиньте 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
використовуючи "дані, з таблиці" / запит на потужність у excel, що дає нам можливість оновити дані під час відкриття файлу. (також автоматичне сортування та індексний стовпець (кількість фільтрованих рядків автоматично)) Це створить результат на іншому аркуші. -вибір даних, необхідних за допомогою миші (рядки та стовпці) -натисніть на вкладку даних із таблиці -в останньому стовпці виключайте пробіли (необов’язково, якщо ви хочете відображати лише заповнені комірки) -add стовпець, стовпчик індексу (необов’язково, якщо ви хочете додати номер рядка до відфільтрованих результатів) -закрити і завантажити до щоб знову відредагувати, натисніть на вкладку запитів, а потім на редагування натисніть на вкладку дизайну в excel, на стрілку нижче оновити, властивості підключення, оновити дані під час відкриття файлу. адаптовано з: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ частина: 3. Сортування випадаючих списків за допомогою запиту на владу Ви також можете скопіювати дані з sheet1, якщо вони не порожні, наприклад, поле a1. скопіюйте це в поле a1 на аркуші2: = ЯКЩО (Sheet1! A1 ""; Sheet1! A1; "")