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.
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.
Risposte:
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
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
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
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! ;)
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):
Salvare l'intervallo del filtro automatico. Ha colonne .AutoFilter.Filters.Count e righe (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), salvate in rngAutofilter
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)
Disattiva il filtro ma conserva i menu a discesa con .ShowAllData
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
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; "")