Jak automatycznie odświeżyć automatyczny filtr Excela po zmianie danych?

15

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.

sorin
źródło
3
Udało mi się go uruchomić, gdy wstawiłem ten kod do zdarzenia Worksheet_Change () zamiast zdarzenia Worksheet_Calculate ().
F106dart
1
umieść to jako odpowiedź i zaakceptuj, aby inni wiedzieli, co zrobiłeś i że pytanie zostało rozwiązane.
jzd
Musiałem dokonać kolejnej modyfikacji, ponieważ Calculate oczekiwał parametru. Teraz działa!.
sorin

Odpowiedzi:

7

Wydaje się, że wymiana kodu z tym również załatwia sprawę (przynajmniej w programie Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
źródło
4

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

Nigdy więcej hacków
źródło
1

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
sorin
źródło
1

Używam też VBA / Macro na podstawie Worksheet_Changezdarzenia, 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

danicotra
źródło
0

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ź! ;)

Losowa osoba
źródło
-1

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):

  1. Zapisz zakres autofiltru. Ma kolumny .AutoFilter.Filters.Count i (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) wiersze zapisane w rngAutofilter

  2. 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)

  3. Wyłącz filtr, ale zachowaj menu rozwijane z .ShowAllData

  4. 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
MicrosoftShouldBeKickedInNuts
źródło
Dlaczego w ŚWIECIE ktoś miałby głosować za tą przydatną odpowiedzią, która zawiera nawet kompletny samodzielny kod (i dokładnie przetestowany), a nawet podaje szczegółowe wyjaśnienie kodu? Pytam poważnie. Czy ludzie chcą dobrej profesjonalnej pomocy w superużytkowniku, czy powinienem nawet się tym przejmować? Czy istnieją trolle, które po prostu idą na dół, aby stosunkowo się podeprzeć?
MicrosoftShouldBeKickedInNuts
2
Przynajmniej komentuj, jeśli głosujesz, więc mogę użyć opinii, aby lepiej służyć społeczności. Administratorzy, to propozycja, którą chciałbym złożyć. Niech wszystkie opinie negatywne wymagają komentarza wyjaśniającego. Widziałem wiele wyraźnie świetnych postów w niewytłumaczalny sposób odrzuconych, co naprawdę wydaje się być epidemią w superużytkowniku - i nigdzie indziej.
MicrosoftShouldBeKickedInNuts
+1 za „Niech wszystkie opinie negatywne wymagają komentarza wyjaśniającego”.
Gravitate
-1
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; "")

Bojan Djuric
źródło