Jak automatycznie odświeżyć automatyczny filtr Excela po zmianie danych?
Przypadek użycia: zmieniam wartość jednej komórki na wartość, która została odfiltrowana. Chcę, aby bieżący wiersz znikał bez konieczności robienia czegokolwiek innego.
Jak automatycznie odświeżyć automatyczny filtr Excela po zmianie danych?
Przypadek użycia: zmieniam wartość jednej komórki na wartość, która została odfiltrowana. Chcę, aby bieżący wiersz znikał bez konieczności robienia czegokolwiek innego.
Odpowiedzi:
Odkryłem, że kiedy pracowałem ze stołami, to nie działało. Filtr nie był na arkuszu, ale na stole. ten kod załatwił sprawę
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
Znalazłem informacje tutaj: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp
Kliknij prawym przyciskiem myszy nazwę arkusza, wybierz „Wyświetl kod” i wklej poniższy kod. Po wklejeniu kliknij ikonę Excela poniżej „Plik” w lewym górnym rogu lub wpisz Alt-F11, aby powrócić do widoku arkusza kalkulacyjnego.
Umożliwi to automatyczne odświeżanie. Nie zapomnij zapisać pliku w formacie z obsługą makr .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
Używam też VBA / Macro na podstawie Worksheet_Change
zdarzenia, ale moje podejście jest nieco inne ... Ok, najpierw kod, a potem wyjaśnienia:
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
(Użyj kombinacji klawiszy Alt+ F11, aby wyświetlić panel programowania i wklej kod do arkusza zawierającego filtr, który chcesz automatycznie odświeżać).
W moim przykładzie zakładam, że mam prosty filtr do pojedynczej kolumny (w moim przypadku L) i że mój zakres danych znajduje się w wierszach od 1 (nawet jeśli może zawierać nagłówek) do 126 (wybierz liczbę wystarczająco dużą, aby być pewnie). Operacja jest prosta: gdy coś zmienia się na moim arkuszu, filtr określonego zakresu zostaje usunięty / ponownie zastosowany, aby go odświeżyć. Trzeba tutaj trochę wyjaśnić pola i kryteriów .
Pole jest liczbą całkowitą przesunięcie zakresu. W moim przypadku mam tylko filtr jednokolumnowy, a zakres jest tworzony przez pojedynczą kolumnę (L), która jest pierwszą w zakresie (dlatego używam 1 jako wartości).
Kryteria to ciąg, który opisuje filtr, stosowany do zakresu danych. W moim przykładzie chcę pokazywać tylko wiersze, w których kolumna L różni się od 0 (stąd użyłem „<> 0”).
To wszystko. Więcej informacji na temat metody Range.AutoFilter można znaleźć na stronie : https://msdn.microsoft.com/en-us/library/office/ff193884.aspx
Wystarczy skonsolidować odpowiedzi:
Sorin mówi:
Kliknij prawym przyciskiem myszy nazwę arkusza, wybierz „Wyświetl kod” i wklej poniższy kod. Po wklejeniu kliknij ikonę Excela poniżej „Plik” w lewym górnym rogu lub wpisz Alt-F11, aby powrócić do widoku arkusza kalkulacyjnego.
Umożliwi to automatyczne odświeżanie. Nie zapomnij zapisać pliku w formacie z obsługą makr .xlsm.
Chris użył tego kodu (co właśnie zrobiłem w 2010 roku):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
Jeśli nie rozwiniesz posta, zobaczysz tylko długą odpowiedź! ;)
Przepraszamy, brak wystarczającej liczby przedstawicieli do skomentowania. (Administratorzy, zachęcamy do podzielenia tego na komentarz powyżej.) Odpowiedź użytkownika „danicotra” rozpoczynająca się od „Używam również VBA / Macro na podstawie zdarzenia Worksheet_Change, ale moje podejście…” z
„pierwszym usunięciem filtra
”, a następnie zastosowanie znowu
jest poprawnym rozwiązaniem podczas korzystania z programu Excel 2007+. Jednak .AutoFilter.ApplyFilter jest nieprawidłowy w XL03 i wcześniejszych wersjach, więc pokazuję poniżej.
Błagam, aby prawdziwi eksperci i guru przeczytali kod, ponieważ jestem pewien, że jest to materiał z najwyższej półki. Być może niewytłumaczalne zdanie głosowania na tę odpowiedź może zostać odwrócone, gdy ludzie zobaczą, co dobrego zrobiono poniżej.
danicotra posłużył się uproszczonym przykładem. W rzeczywistości możesz to zrobić bardziej ogólnie. Załóż z ActiveSheet dla następującego (lub innego obiektu arkusza):
Zapisz zakres autofiltru. Ma kolumny .AutoFilter.Filters.Count i (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) wiersze zapisane w rngAutofilter
Zbierz w tablicy myAutofilters każdą z 4 właściwości każdego z elementów autofiltru .AutoFilter.Filters.Count, uważając, aby uniknąć „błędów zdefiniowanych przez aplikację”, gdy .On lub .Operator ma wartość false. (myAutofilters zostaną ponownie zredukowane do liczby wierszy i kolumn w kroku 1)
Wyłącz filtr, ale zachowaj menu rozwijane z .ShowAllData
Dla każdego elementu filtru, który był .On zgodnie z zapisaną tablicą, zresetuj 3 z 4 właściwości każdego z elementów autofiltru .AutoFilter.Filters.Count. Ponownie uważaj, aby uniknąć „błędów zdefiniowanych przez aplikację”, gdy .Operator ma wartość false, więc dla każdego elementu „i”,
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
lub
rngAutofilter.AutoFilter Field: = i, Kryteria 1: = myAutofilters (i, 2), Operator: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)
Teraz autofiltr zostanie przywrócony, w tym samym zakresie, co przed rozpoczęciem kodu, ale z automatycznym filtrem zaktualizowanym pod kątem zmian danych.
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
używając „danych, z tabeli” / zapytania mocy w programie Excel, co daje nam możliwość odświeżenia danych podczas otwierania pliku. (także automatyczne sortowanie i kolumna indeksu (liczba automatycznie odfiltrowanych wierszy)) Spowoduje to utworzenie innego arkusza. -wybierz dane wymagane za pomocą myszy (wiersze i kolumny) -kliknij kartę danych, z tabeli -w ostatniej kolumnie wyklucz puste pola (opcjonalnie, jeśli chcesz wyświetlać tylko wypełnione komórki) -dodaj kolumnę, kolumnę indeksu (opcjonalnie, jeśli chcesz dodać numer wiersza do przefiltrowanych wyników) -zamknij i załaduj do aby ponownie edytować, kliknij kartę zapytania, a następnie edytuj kliknij kartę projektu w programie Excel, strzałkę poniżej odśwież, właściwości połączenia, odśwież dane podczas otwierania pliku. zaadaptowano z: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ część: 3. Sortowanie list rozwijanych za pomocą zapytania mocy możesz również skopiować dane z arkusza 1, jeśli nie są puste, na przykład pole a1. skopiuj to do pola a1 w arkuszu 2: = JEŻELI (Arkusz1! A1 ""; Arkusz1! A1; "")