SCRIVI SOLO SE IL F...
 
Notifiche
Cancella tutti

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.

[Risolto] SCRIVI SOLO SE IL FILTRO NON E' VUOTO

7 Post
2 Utenti
0 Reactions
2,318 Visualizzazioni
pallinacb
(@pallinacb)
Post: 0
New Member
Avviatore di Topic
 

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 ?

 

Versione di Excel
Sistema operativo
 
Postato : 03/08/2021 13:43
cromagno
(@cromagno)
Post: 0
Moderatore
 

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.

 
Postato : 03/08/2021 18:59
pallinacb
(@pallinacb)
Post: 0
New Member
Avviatore di Topic
 

@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... ? 

 
Postato : 04/08/2021 07:45
cromagno
(@cromagno)
Post: 0
Moderatore
 

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.

 
Postato : 04/08/2021 19:51
pallinacb
(@pallinacb)
Post: 0
New Member
Avviatore di Topic
 

@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...

 
Postato : 10/08/2021 08:43
cromagno
(@cromagno)
Post: 0
Moderatore
 

Ma hai provato a fare quello che ti ho scritto nel codice al post precedente?!?

Postato da: @pallinacb

...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.

Postato da: @pallinacb

...chiedo scusa per il ritardo

mi spiace ma dopo una settimana non ho voglia di rimettermi a controllare il file.

 
Postato : 10/08/2021 14:52
pallinacb
(@pallinacb)
Post: 0
New Member
Avviatore di Topic
 

@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...

 
Postato : 23/08/2021 14:47
Condividi:
My Agile Privacy
Questo sito utilizza cookie tecnici e di profilazione. Cliccando su accetta si autorizzano tutti i cookie di profilazione. Cliccando su rifiuta o la X si rifiutano tutti i cookie di profilazione. Cliccando su personalizza è possibile selezionare quali cookie di profilazione attivare.
Attenzione: alcune funzionalità di questa pagina potrebbero essere bloccate a seguito delle tue scelte privacy
     Scarica il nostro ebook gratuito     

Unisciti a oltre 35.000 professionisti
che hanno già scelto di semplificare il proprio lavoro
e aumentare la produttività con la nostra newsletter!

Scarica l’ebook con i
migliori trucchi e suggerimenti per Excel
selezionati per te da Excel Academy

Download