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
