Come aggiornare automaticamente un filtro automatico di Excel quando i dati vengono modificati?


15

Come aggiornare automaticamente un filtro automatico di Excel quando i dati vengono modificati?

Caso d'uso: cambio il valore di una cella in un valore che è stato filtrato. Voglio vedere la riga corrente scomparire senza dover fare nient'altro.


3
Sono stato in grado di farlo funzionare quando ho inserito quel codice nell'evento Worksheet_Change () anziché nell'evento Worksheet_Calculate ().
F106dart

1
metti questa come risposta e accettala, in modo che gli altri sappiano cosa hai fatto e che la domanda sia stata risolta.
jzd

Ho dovuto apportare un'altra modifica perché Calculate si aspettava un parametro. Ora funziona!.
sorin,

Risposte:


7

Scambiare il codice con questo sembra fare anche il trucco (almeno in Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

4

Ho scoperto che quando ho lavorato con i tavoli, questo non ha funzionato. Il filtro non era sul foglio ma sul tavolo. questo codice ha funzionato

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

Ho trovato le informazioni qui: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp


1

Fai clic con il tasto destro sul nome del foglio, scegli "Visualizza codice" e incolla il codice qui sotto. Dopo aver incollato, fai clic sull'icona di Excel sotto "File" in alto a sinistra o digita Alt-F11, per tornare alla vista del foglio di calcolo.

Ciò consentirà l'aggiornamento automatico. Non dimenticare di salvare il file in un formato con supporto macro .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

Uso anche un VBA / Macro basato Worksheet_Changesull'evento, ma il mio approccio è leggermente diverso ... Ok, prima il codice e poi le spiegazioni:

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

(Utilizzare la combinazione Alt+ F11tasti per visualizzare il pannello di sviluppo e incollare il codice nel foglio di lavoro contenente il filtro che si desidera aggiornare automaticamente.)

Nel mio esempio suppongo di avere un semplice filtro su una singola colonna (L nel mio caso) e che il mio intervallo di dati è su righe da 1 (anche se può contenere intestazione) a 126 (scegliere un numero abbastanza grande da essere sicuro). L'operazione è semplice: quando qualcosa viene cambiato sul mio foglio, il filtro sull'intervallo specificato viene rimosso / riapplicato in modo da averlo aggiornato. Ciò che ha bisogno di un po 'di spiegazioni qui sono Field and Criteria .

Il campo è un offset intero dell'intervallo. Nel mio caso, ho solo un filtro a colonna singola e l'intervallo è costituito da una singola colonna (L) che è la prima nell'intervallo (quindi uso 1 come valore).

Il Criteria è una stringa che descrive il filtro da applicare intervallo dati. Nel mio esempio, voglio mostrare solo le righe in cui la colonna L differisce da 0 (quindi ho usato "<> 0").

È tutto. Per ulteriori riferimenti sul metodo Range.AutoFilter, vedere: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx


0

Solo per consolidare le risposte:

Sorin dice:

Fai clic con il tasto destro sul nome del foglio, scegli "Visualizza codice" e incolla il codice qui sotto. Dopo aver incollato, fai clic sull'icona di Excel sotto "File" in alto a sinistra o digita Alt-F11, per tornare alla vista del foglio di calcolo.

Ciò consentirà l'aggiornamento automatico. Non dimenticare di salvare il file in un formato con supporto macro .xlsm.

E Chris ha usato questo codice (che ho appena fatto nel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Se non espandi il post, vedi solo la risposta lunga! ;)


-1

Siamo spiacenti, rappresentante insufficiente per commentare. (Amministratori, sentitevi liberi di tagliare questo in un commento sopra.) Risposta dell'utente "danicotra" che inizia con "Uso anche un VBA / Macro basato sull'evento Worksheet_Change, ma il mio approccio ..." con
'prima rimuovi filtro
' quindi applicarlo
è di nuovo la soluzione corretta quando si utilizza Excel 2007+. Tuttavia .AutoFilter.ApplyFilter non è valido in XL03 e precedenti, quindi mostro il modo seguente.

Chiedo che veri esperti e guru leggano il codice perché sono abbastanza fiducioso che sia il materiale più venduto. Forse il conteggio inspiegabile del downvote su questa risposta può essere invertito quando le persone vedono quali cose buone vengono fatte di seguito.

danicotra ha usato un esempio semplificato. In realtà, puoi farlo più in generale. Assumi con ActiveSheet per il seguente (o qualche altro oggetto foglio):

  1. Salvare l'intervallo del filtro automatico. Ha colonne .AutoFilter.Filters.Count e righe (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), salvate in rngAutofilter

  2. Raccogli in un array myAutofilters ciascuna delle 4 proprietà di ciascuno degli elementi .AutoFilter.Filters.Count Autofilter, facendo attenzione a evitare "Errori definiti dall'applicazione" quando .On o .Operator è falso. (myAutofilters verrebbe rideterminato al numero di righe e colonne nel passaggio 1)

  3. Disattiva il filtro ma conserva i menu a discesa con .ShowAllData

  4. Per ogni elemento filtro che era .Sulla base dell'array salvato, reimpostare 3 delle 4 proprietà di ciascuno degli elementi .AutoFilter.Filters.Count autofilter. Di nuovo, fai attenzione a evitare "Errori definiti dall'applicazione" quando. Operatore è falso, quindi per ogni elemento "i",
    rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
    o
    rngAutofilter.AutoFilter Field: = i, Criteri1: = myAutofilters (i, 2), Operatore: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)

Ora il filtro automatico verrà ripristinato, nello stesso intervallo in cui era prima dell'inizio del codice, ma con il filtro automatico aggiornato per le modifiche ai dati.

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

Perché nel mondo qualcuno dovrebbe sottovalutare questa risposta utile, che include anche un codice autonomo completo (e fortemente testato) e fornisce anche una spiegazione dettagliata del codice? Sto chiedendo, sul serio. Le persone vogliono un buon aiuto professionale nel superutente o non dovrei nemmeno preoccuparmi? Ci sono troll che vanno semplicemente a votare per proporsi relativamente ??
MicrosoftShouldBeKickedInNuts

1
Almeno ho i b___s per commentare se effettui il downgrade, quindi posso usare il feedback per servire meglio la community. Amministratori, questa è una proposta che vorrei fare. Tutti i downvotes richiedono un commento esplicativo. Ho visto molti post chiaramente grandi inspiegabilmente ridimensionati, che sembra davvero essere un'epidemia in superutente - e da nessun'altra parte.
MicrosoftShouldBeKickedInNuts

-1
usando "dati, dalla tabella" / power query in Excel, che ci dà la possibilità di aggiornare i dati quando si apre il file.
(anche ordinamento automatico e colonna dell'indice (numerazione automatica delle righe filtrate))

Ciò creerà il risultato in un altro foglio.

-seleziona i dati richiesti usando il mouse (righe e colonne)
-clicca sulla scheda dati, dalla tabella
-nell'ultima colonna, escludi gli spazi (facoltativo, se si desidera visualizzare solo celle riempite)
-add colonna, colonna indice (facoltativo, se si desidera aggiungere il numero di riga ai risultati filtrati)
-Chiudere e caricare in

per modificare nuovamente, fare clic sulla scheda della query, quindi su Modifica

fai clic sulla scheda Progettazione in Excel, sulla freccia sotto Aggiorna, Proprietà connessione,
aggiorna i dati all'apertura del file.


adattato da: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
parte: 3. Ordinamento degli elenchi a discesa mediante Power Query


puoi anche copiare i dati dal foglio1 se non vuoto, ad esempio il campo a1.
copia questo nel campo a1 in sheet2:
= SE (Foglio1 A1 "!"; Sheet1! A1; "")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.