La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Buongiorno a tutti, rieccomi qui con un ennesimo annoso problema sui filtri...dunque...come avevo già messo nei miei due post precedenti, ho in piedi una macro che in base a determinati filtri, mi mette una lettera in una colonna corrispondente...e funziona ma il problema che però mi si è verificato è che se il filtro risulta vuoto, la macro mi scrive la lettera su TUTTE le righe...a prescindere dal fatto che non ho ancora capito il perché lo faccia, sto cercando di ottenere che mi scriva la lettera solo se il filtro da' risultanze, altrimenti passa al filtro successivo. Ho provato con una IF COUNT ma mi funziona male...
Worksheets("Sheet1").Select Range("D3:D" & Rows.Count).NumberFormat = "dd/mm/yy" T5 = Application.InputBox("DATA T-5 gg/mm/aa", Title:="RICHIESTA RIFERIMENTO", Default:="RIF.") If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If ActiveSheet.Range("A:T").AutoFilter Field:=4, Operator:= _ xlFilterValues, Criteria1:=T5 If Selection.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then With ActiveSheet.UsedRange ultimarigapiena = .Rows.Count + .Row - 1 End With Range("P3:P" & ultimarigapiena).Select Selection.Value = "L" End If
questo codice mi consente di bypassare il filtro se vuoto, ma non funziona nel caso invece desse risultati...ho provato anche a mettere ">0" al posto di "=1" ma in questo caso invece funziona se il filtro ha risultanze, ma non funziona se non ne ha...nel file di esempio allegato c'è la macro inserita con la serie di filtri...
p.s. per provare il filtro della data-5, provate ad inserire 27/07/21 che non ce ne sono...
Grazie in anticipo come sempre ?
Ciao,
io sinceramente non ho capito cosa vuoi fare (non ho capito nemmeno cosa dovresti mettere dentro la InputBox iniziale).
Leggo che comunque cerchi di trovare l'ultima riga con il filtro attivo usando UsedRange... ?
A quanto mi risulta non tiene conto delle celle filtrate e/o nascoste, quindi otterrai sempre e comunque l'ultima riga che avresti anche senza filtro attivo.
Per trovare l'ultima riga di un range filtrato, in rete puoi trovare diversi metodi, questa function è una di essi:
Function GetFilteredRangeBottomRow() As Long Dim HeaderRow As Long, LastFilterRow As Long, Addresses() As String On Error GoTo NoFilterOnSheet With ActiveSheet HeaderRow = .AutoFilter.Range(1).Row LastFilterRow = .Range(Split(.AutoFilter.Range.Address, ":")(1)).Row Addresses = Split(.Range((HeaderRow + 1) & ":" & LastFilterRow). _ SpecialCells(xlCellTypeVisible).Address, "$") GetFilteredRangeBottomRow = Addresses(UBound(Addresses)) End With NoFilterOnSheet: End Function
ma anche così credo che ti servirebbe a poco visto che tra la prima riga e l'ultima riga trovata con la function potrebbero esserci altre righe filtrate che NON vuoi considerare.
A mio parere dovresti sfruttare il range ottenuto con:
Range.SpecialCells(xlCellTypeVisible)
però ripeto... non mi è chiaro quello che vuoi fare, inoltre cerca di usare bene l'indentazione del codice altrimenti diventa frustrante leggerlo e capirci qualcosa.
Prova a sfruttare quel che ti ho scritto e se non dovessi riuscire allora spiegaci a parole, step-by-step, cosa vorresti ottenere dal codice.
@cromagno ...si'...ammetto che la cosa sia un po' incasinata e mi scuso per non essermi spiegata meglio...ci riprovo...
Dunque...la macro (che per questo funziona) mi filtra delle celle in base a delle colonne e sulle colonne filtrate mi va a mettere una lettera "L" nella colonna P (il message box serve per inserire la data da filtrare che e' sempre oggi -5, che e' uno dei tanti filtri che via via fa)...e qui funziona bene...il problema si pone quando, applicando il filtro, non trova nessuna riga con quel parametro: in questo caso, invece di non mettere nulla, inserisce invece la L su tutte le righe del foglio non filtrate! ...
Ho provato ad usare questa stringa
If Selection.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
sperando che mettesse la condizione che se il filtro risultasse vuoto, allora passa al filtro successivo senza inserire nulla nella colonna P...ma:
- con =1 funziona se il filtro e' vuoto (non scrive nulla), ma non funziona se il filtro trova dati (non scrive nulla invece dovrebbe metter la L)
- con >0 funziona se il filtro trova dati (scrive la L) ma non funziona se non filtra nulla (rimette anche L su tutte le righe non filtrate)
...spero di essere stata un pohino piu' chiara... ?
Ciao,
intendevo questo:
Sub L() Dim Lrow As Long Dim ultimarigapiena As Long Dim T5 As String Dim VisibleRows As Long Dim VisibleRng As Range Worksheets("Foglio1").Select Lrow = Range("D" & Rows.Count).End(xlUp).Row ' inserisco L in T-5 lavorativi Range("D3:D" & Lrow).NumberFormat = "dd/mm/yy" T5 = Application.InputBox("DATA T-5 gg/mm/aa", Title:="RICHIESTA RIFERIMENTO", Default:="RIF.") If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If ActiveSheet.Range("A:T").AutoFilter Field:=4, Operator:= _ xlAnd, Criteria1:=T5 VisibleRows = Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).Count If VisibleRows > 0 Then Set VisibleRng = Range("P3:P" & Lrow).SpecialCells(xlCellTypeVisible) VisibleRng.Value = "L" End If 'QUI IL RESTO DEL TUO CODICE...
da qui in poi applica lo stesso metodo per gli altri filtri che vuoi applicare sfruttando le variabili che ho aggiunto.
P.S.
comunque secondo me potresti fare tutto con un unico ciclo For, senza togliere e mettere tutti quei filtri, l'importante è conoscere esattamente i criteri per i quali scrivere la lettera L nell'apposita colonna.
@cromagno ...chiedo scusa per il ritardo...spero di riuscire a spiegarmi meglio:
- la macro mette un filtro (ad esempio la data t-5 inserita nella msg box) e nelle celle visibili di questo filtro mette la L nella colonna P perche' sono le righe che poi dovranno essere lavorate
- poi passa al filtro successivo e fa la stessa cosa, fino ad arrivare all'ultimo filtro...
...il "bug" e' che se nell'applicazione sequenziale di questi filtri, non trova dati da filtrare che corrispondano al criterio del filtro, la macro mette erroneamente la L su tutte le non filtrate e non visibili e non ne capsico il perche', dato che il la condizione di celle visibili c'e'... a me serve invece che se il filtro risulta vuoto (nessuna riga visibile) salti il comando di inserimento L e passi al filtro successivo...
Ma hai provato a fare quello che ti ho scritto nel codice al post precedente?!?
...la macro mette erroneamente la L su tutte le non filtrate e non visibili e non ne capsico il perche', dato che il la condizione di celle visibili c'e'...
la condizione che usi tu è questa:
If Selection.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
ma ci sarà sempre almeno una cella visibile, anche se non è stato trovato alcun dato che rispetti il criterio.... è la cella di intestazione, che non verrà mai nascosta.
Ti ripeto... leggi cosa fa il codice del post precedente.
P.S.
...chiedo scusa per il ritardo
mi spiace ma dopo una settimana non ho voglia di rimettermi a controllare il file.
@cromagno ...grazie mille...codice utilissimo! ...perdonami ma avevo sbagliato ad inserire una stringa del tuo codice...
Per quanto riguarda il ciclo "for"...vero...ma non riuscivo a farlo funzionare con la msg box per l'inserimento della data...quindi ho cercato un accrocchio che funzionava benissimo se trovava dati da filtrare...
Grazie ancora per il preziosissimo aiuto!
p.s. ...il mio ritardo e' stato dovuto al fatto che ho cambiato repentinamente posto di lavoro e non avevo piu' gli accessi...