Filtrare per data V...
 
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.

Filtrare per data VBA

7 Post
3 Utenti
0 Reactions
188 Visualizzazioni
Forum 1
 leo
(@leo)
Post: 2
New Member
Avviatore di Topic
 

Ciao a tutti, ho un problema riguardo una macro con Vba Excel: devo filtrare una colonna con delle date inferiori a tre anni dall'anno corrente e cancellare le righe corrispondenti (esempio: se siamo nel 2025 devo tenere tutte le celle con date comprese negli anni 2025, 2024 e 2023 e visualizzare solamente quelle dal 2022 in giù). Ho provato a registrare una macro e funziona correttamente (riportata di seguito)

Sub Macro1()

ActiveSheet.range("$A$4:$M$4178").AutoFilter Field:=6, Operator:= _
xlFilterValues, Criteria2:=Array(0, "9/6/2022", 0, "4/2/2021", 0, "9/6/2020", 0, _
"8/8/2019")
End Sub

Il problema ovviamente si presenterà l'anno prossimo.

Ho provato a sostituire le date presenti dell'array del filtro con delle variabili convertite con CDate ma non filtra nulla con questo metodo.

Spero di essere stato chiaro e ringrazio chi potrà aiutarmi.

 

Versione di Excel
Sistema operativo
 
Postato : 20/08/2025 11:02
Forum 2
(@lukereds)
Post: 35
Eminent Member
 

ciao,

uno spunto, supponendo le date in colonna A (la sub va quindi adattata)

 

 

Sub FiltraAnni()
Dim filtro As Date
filtro = DateSerial(Year(Date) - 2, 1, 1)
ActiveSheet.Range("A1:A100").AutoFilter Field:=1, Criteria1:="<" & filtro
End Sub

Se vuoi cancellare le righe filtrate, altra sub (oppure copi il codice alla fine della sub precedente)

Sub CancellaR()
Dim i As Integer
For i = 2 To 100
   If Rows(i).Hidden = True Then Rows(i).Delete
Next i
End Sub
Questo post è stato modificato 2 mesi fa 2 tempo da LukeReds
 
Postato : 20/08/2025 12:06
Forum 2
(@lukereds)
Post: 35
Eminent Member
 

per cancellare le righe meglio

 

Sub CancellaR()
Dim i As Integer
For i = 100 To 1 Step -1
   If Rows(i).Hidden = True Then Rows(i).Delete
Next i
End Sub
Questo post è stato modificato 2 mesi fa da LukeReds
 
Postato : 20/08/2025 12:39
Forum 1
 leo
(@leo)
Post: 2
New Member
Avviatore di Topic
 

@lukereds funziona, grazie mille. Per quanto riguarda la cancellazione delle righe non so se il ciclo for possa essere il metodo più rapido perchè si parla di centinaia di righe ed a me serve qualcosa di più immediato (sto utilizzando un banale Selection.Delete). Ti ringrazio nuovamente.

Questo post è stato modificato 2 mesi fa da leo
 
Postato : 20/08/2025 16:29
Forum 2
(@lukereds)
Post: 35
Eminent Member
 

grazie a te del riscontro, un ciclo for come quello indicato  con 10000 righe impiega circa 4 - 5 secondi (dipende ovviamente anche dal pc). Con centinaia di righe siamo sotto il secondo

Questo post è stato modificato 2 mesi fa 2 tempo da LukeReds
 
Postato : 22/08/2025 16:31
tanimon
(@tanimon)
Post: 46
Eminent Member
 
alternativa alla proposta di LukeReds che saluto 🖐️ 
 
sul mio pc con 60000 righe e le date in colonna A,
 
filtra le righe con date più vecchie di 3 anni in poco più di 1 secondo lasciando visibili
le più recenti;
 
le elimina il circa 24 secondi.
 
Option Explicit

Sub a()
Dim priga As Long, uriga As Long, r As Long
Dim sh As Worksheet
Dim scelta As Integer
Dim inizio, fine


Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set sh = Sheets("Foglio1")
'======================================
' ipotizzando le date in colonna A
'======================================

inizio = Timer

With sh
    .Activate
    
    uriga = .Range("a" & Rows.Count).End(xlUp).Row
    
    .Range("a1:a" & uriga).AutoFilter Field:=1, Criteria1:= _
        "<12/31/" & Year(Date) - 3
        
scelta = MsgBox("Se clicchi SI filtra senza eliminare le righe filtrate" & vbCrLf & _
       "se clicchi NO filtra e le elimina", vbYesNo, "Scelta se eliminare le righe")
       If scelta = 6 Then
            fine = Timer
            MsgBox ("Fatto in " & Round((fine - inizio), 2) & " secondi")
            Exit Sub
       End If
       
'================================================================
    priga = .Range("a2:e" & Rows.Count).SpecialCells(xlCellTypeVisible).Row
    .Range("a" & priga & ":" & "c" & uriga).Rows.Delete
    
  
    .Activate
End With

sh.AutoFilterMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True

fine = Timer
MsgBox ("Fatto in " & Round((fine - inizio), 2) & " secondi")

Set sh = Nothing

End Sub
 
Postato : 24/08/2025 20:32
tanimon
(@tanimon)
Post: 46
Eminent Member
 

ciao,

per evitare che nei dati filtrati rimanga il 31/12 del terzo anno più vecchio, 

meglio modificare il criterio del filtro con 

 "<01/01/" & Year(Date) - 2
 
Postato : 30/08/2025 13:10
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