Il filtro avanzato e' molto diverso dal filtro automatico, ti lascio qualche suggerimento per evitare di girare a vuoto:
-l'elenco da filtrare deve trovarsi non prima di riga 7 del foglio, e le righe sovrastanti vanno usate per posizionarci i filtri validi per quella colonna
-la riga 1 deve contenere le stesse intestazioni che sono in riga 7 (o dove comincia il tuo elenco)
-deve esserci almeno una riga vuota prima che cominci l'elenco da filtrare
-nel wizard del filtro avanzato, nel campo Intervallo criteri, inserire anche la riga di intestazione (es A1:G3), e non inserire righe che non contengano criteri (perche' allora visualizzerebbe tutto l'elenco)
-i criteri di una riga sono tutti in AND
-i criteri delle varie righe sono in OR
-i criteri relative a DATE devono usare il valore numero corrispondente alla data, rendendo il tutto un po' criptico.
Ad esempio:
Queste impostazioni filtreranno l'elenco dove "sped" comincia con 006 e la cui data e' >= al 1/10/2018 (vedi Formula nella barra della formula); oppure dove ddt=5732; oppure dove sped comincia con 147; oppure sped comincia con 039 e la data e' > 2/10/2018; oppure ddt comincia con 209.
Nota che dopo aver cambiato un filtro, l'elenco filtrato non si modifica automaticamente; devi ripetere il comando di Filtro avanzato.
Se vuoi rendere automatico il filtraggio puoi usare una macro di Worksheet_Change. Ad esempio:
1) Registra una macro mentre fai un filtro avanzato usando tutta l'area dedicata ai criteri di filtro, nel caso del mio esempio A1:K7. A me e' venuto qualcosa tipo:
- Codice: Seleziona tutto
Sub AdvFilt()
'
Range("A9").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range("A9:K1344").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:K7"), Unique:=False
End Sub
2) Modifichiamo il codice
Le prime tre righe si possono togliere; nella quarta imposta un'altezza dell'intervallo da filtrare che sia ampiamente sufficiente a gestire il tuo elenco di oggi e di domani.
Rendiamo la sub "parametrica" affinche' possa ricevere dal chiamante l'area effettiva di filtro.
Il nuovo codice:
- Codice: Seleziona tutto
Sub AdvFilt(ByVal myRan As String)
'
'' Range("A9").Select
'' Range(Selection, Selection.End(xlDown)).Select
'' Range(Selection, Selection.End(xlToRight)).Select
Range("A9:K10000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range(myRan), Unique:=False
End Sub
Le righe commentate possono essere eliminate
3) Ora inseriamo questa sub di Worksheet_Change sul foglio di lavoro:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CritArea As String, MaxFilt As Long
'
CritArea = "A1:K7" '<<< L'area destinata ai filtri
If Application.Intersect(Target, Range(CritArea)) Is Nothing Then Exit Sub
MaxFilt = Evaluate("max(row(1:7)*(" & CritArea & "<>""""))") '!! Che sia Coerente con CritArea!!
Call AdvFilt(Replace(CritArea, "7", MaxFilt, , , vbTextCompare))
End Sub
In questo modo, quando si modifica una cella nell'area destinata ai filtri sara' richiamata la Sub AdvFilt passandogli l'area effettivamente usata dai filtri
Spero ti dia utili spunti...