Wie kann ein Excel-Autofilter automatisch aktualisiert werden, wenn Daten geändert werden?

15

Wie aktualisiere ich einen Excel-Autofilter automatisch, wenn Daten geändert werden?

Anwendungsfall: Ich ändere den Wert einer Zelle in einen Wert, der gefiltert wurde. Ich möchte, dass die aktuelle Zeile verschwindet, ohne dass ich etwas anderes tun muss.

Sorin
quelle
3
Ich konnte es zum Laufen bringen, als ich diesen Code in das Worksheet_Change () -Ereignis anstelle des Worksheet_Calculate () -Ereignisses einfügte.
F106dart
1
Setzen Sie dies als Antwort ein und akzeptieren Sie es, damit andere wissen, was Sie getan haben und dass die Frage gelöst wurde.
jzd
Ich musste eine weitere Änderung vornehmen, da Calculate einen Parameter erwartete. Jetzt funktioniert es!.
Sorin

Antworten:

7

Das Austauschen des Codes mit diesem Befehl scheint ebenfalls erfolgreich zu sein (zumindest in Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
quelle
4

Als ich mit Tischen arbeitete, stellte ich fest, dass dies nicht funktionierte. Der Filter befand sich nicht auf dem Blatt, sondern auf dem Tisch. Dieser Code hat den Trick gemacht

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

Ich fand die Informationen hier: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp

Keine Hacks mehr
quelle
1

Klicken Sie mit der rechten Maustaste auf Ihren Blattnamen, wählen Sie "Code anzeigen" und fügen Sie den folgenden Code ein. Klicken Sie nach dem Einfügen links oben auf das Excel-Symbol unter "Datei" oder geben Sie Alt-F11 ein, um zur Tabellenkalkulationsansicht zurückzukehren.

Dadurch wird die automatische Aktualisierung aktiviert. Vergessen Sie nicht, die Datei in einem Format mit Makrounterstützung zu speichern .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
quelle
1

Ich verwende auch ein VBA / Macro basierend auf Worksheet_Changeevent, aber mein Ansatz ist etwas anders ... Ok, zuerst den Code und dann die Erklärungen:

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

(Verwenden Sie die Tastenkombination Alt+ F11, um das Entwicklungsfenster anzuzeigen, und fügen Sie den Code in das Arbeitsblatt ein, das den Filter enthält, den Sie automatisch aktualisieren möchten.)

In meinem Beispiel gehe ich davon aus, dass es einen einfachen Filter für eine einzelne Spalte gibt (in meinem Fall L) und dass mein Datenbereich in Zeilen von 1 (auch wenn er Überschriften enthält) bis 126 (wählen Sie eine Zahl, die groß genug ist, um zu sein) liegt sicher). Der Vorgang ist einfach: Wenn sich etwas auf meinem Blatt ändert, wird der Filter im angegebenen Bereich entfernt / erneut angewendet, damit er aktualisiert wird. Hier sind Feld und Kriterien zu erläutern .

Das Feld ist ein ganzzahliger Offset des Bereichs. In meinem Fall habe ich nur einen einzelnen Spaltenfilter und der Bereich wird durch eine einzelne Spalte (L) gebildet, die die erste im Bereich ist (daher verwende ich 1 als Wert).

Die Kriterien sind eine Zeichenfolge, die den Filter beschreibt, der auf den Datenbereich angewendet werden soll. In meinem Beispiel möchte ich nur Zeilen anzeigen, in denen sich die Spalte L von 0 unterscheidet (daher habe ich "<> 0" verwendet).

Das ist alles. Weitere Informationen zur Range.AutoFilter-Methode finden Sie unter: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx

Danicotra
quelle
0

Nur um die Antwort (en) zu konsolidieren:

Sorin sagt:

Klicken Sie mit der rechten Maustaste auf Ihren Blattnamen, wählen Sie "Code anzeigen" und fügen Sie den folgenden Code ein. Klicken Sie nach dem Einfügen links oben auf das Excel-Symbol unter "Datei" oder geben Sie Alt-F11 ein, um zur Tabellenkalkulationsansicht zurückzukehren.

Dadurch wird die automatische Aktualisierung aktiviert. Vergessen Sie nicht, die Datei in einem Format mit Makrounterstützung zu speichern .xlsm.

Und Chris hat diesen Code benutzt (den ich gerade 2010 gemacht habe):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Wenn Sie den Beitrag nicht erweitern, sehen Sie nur die lange Antwort! ;)

Zufälliger Typ
quelle
-1

Entschuldigung, nicht genügend Mitarbeiter, um einen Kommentar abzugeben. (Admins, zögern Sie nicht, dies in einen Kommentar oben zu schreiben.) Die Antwort von "danicotra" des Benutzers beginnt mit "Ich verwende ein VBA / Makro, das auch auf dem Worksheet_Change-Ereignis basiert, aber meine Vorgehensweise ..." mit
"Erst Filter entfernen
" und dann anwenden Auch dies
ist die richtige Lösung, wenn Sie Excel 2007+ verwenden. .AutoFilter.ApplyFilter ist jedoch in XL03 und früheren Versionen ungültig, daher zeige ich den folgenden Weg.

Ich bitte echte Experten und Gurus, den Code zu lesen, da ich ziemlich sicher bin, dass es sich um erstklassiges Material handelt. Vielleicht kann die unerklärliche Anzahl der Abstimmungen in Bezug auf diese Antwort umgekehrt werden, wenn die Leute sehen, welche guten Dinge unten getan werden.

danicotra verwendete ein vereinfachtes Beispiel. Tatsächlich können Sie dies allgemeiner tun. Angenommen, mit ActiveSheet für Folgendes (oder ein anderes Blattobjekt):

  1. Speichern Sie den Bereich des Autofilters. Es enthält .AutoFilter.Filters.Count-Spalten und (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) -Zeilen, die in rngAutofilter gespeichert werden

  2. Sammeln Sie in einem Array myAutofilters jede der 4 Eigenschaften der .AutoFilter.Filters.Count-Autofilter-Elemente, und achten Sie darauf, dass Sie "Anwendungsdefinierte Fehler" vermeiden, wenn .On oder .Operator falsch sind. (myAutofilters wird in Schritt 1 auf die Anzahl der Zeilen und Spalten umgestellt.)

  3. Schalten Sie den Filter aus, aber bewahren Sie die Dropdowns mit .ShowAllData auf

  4. Setzen Sie für jedes Filterelement, das Ihrem gespeicherten Array entspricht, 3 der 4 Eigenschaften jedes Autofilterelements zurück. Achten Sie erneut darauf, dass Sie "Anwendungsdefinierte Fehler" vermeiden, wenn .Operator false ist, und zwar für jedes Element "i":
    rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
    oder
    rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2), Operator: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)

Jetzt wird der Autofilter im selben Bereich wie vor Beginn Ihres Codes wiederhergestellt, wobei der Autofilter jedoch auf Datenänderungen aktualisiert wird.

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
quelle
Warum in der WELT würde jemand diese nützliche Antwort ablehnen, die sogar vollständigen selbstständigen Code enthält (und ausführlich getestet wurde) und sogar eine ausführliche Erklärung des Codes gibt? Ich frage ernsthaft. Wollen die Leute eine gute professionelle Hilfe im Superuser oder sollte ich mich nicht einmal darum kümmern? Gibt es Trolle, die nur abstimmen, um sich relativ zu behaupten?
MicrosoftShouldBeKickedInNuts
1
Zumindest müssen die b___s kommentieren, wenn Sie abstimmen, damit ich das Feedback nutzen kann, um der Community besser zu dienen. Admins, das ist ein Vorschlag, den ich machen möchte. Haben Sie alle Downvotes erfordern einen erläuternden Kommentar. Ich habe viele großartige Posts gesehen, die aus unerklärlichen Gründen herabgestuft wurden, was im Superuser wirklich eine Epidemie zu sein scheint - und nirgendwo anders.
MicrosoftShouldBeKickedInNuts
-1
Verwendung von "Daten aus Tabelle" / Power-Abfrage in Excel, die uns die Möglichkeit gibt, Daten beim Öffnen der Datei zu aktualisieren.
(auch automatische Sortierung und Indexspalte (Anzahl Zeilen automatisch gefiltert))

Dies führt zu einem anderen Blatt.

Daten mit der Maus auswählen (Zeilen und Spalten)
- Klicken Sie in der Tabelle auf die Registerkarte "Daten"
-in der letzten Spalte Leerzeichen ausschließen (optional, wenn nur gefüllte Zellen angezeigt werden sollen)
-add Spalte, Indexspalte (optional, wenn Sie den gefilterten Ergebnissen eine Zeilennummer hinzufügen möchten)
-schließen und laden zu

Klicken Sie zum erneuten Bearbeiten auf die Registerkarte Abfrage und dann auf Bearbeiten

Klicken Sie auf die Registerkarte Design in Excel, auf den Pfeil unter Aktualisieren, Verbindungseigenschaften,
Daten beim Öffnen der Datei aktualisieren.


Angepasst von: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
Teil: 3. Sortieren von Dropdown-Listen mit Power Query


Sie können auch Daten aus Sheet1 kopieren, wenn diese nicht leer sind, z. B. Feld a1.
Kopieren Sie dies in das a1-Feld in Sheet2:
= IF (Sheet1! A1 ""; Sheet1! A1; "")

Bojan Djuric
quelle