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