Ola Pessoal
Eu tenho uma base de dados em anexo, que eu sempre a recebo uma vez por mês, a qual existe na columa "I" varias datas.
Todas as vezes eu preciso manter as datas dos últimos 91 dias e deletar as outras datas. Por exemplo, se eu receber a data no dia 01/09/2020, eu preciso manter somente os registros de 01/06/2020 ate 31/08/2020 e deletar o restante.
Eu tentei usar o filtro avançado, porem não estou conseguindo, Podem me ajudar?
...se eu receber a data no dia 01/09/2020...
Não entendi isso de "eu receber a data", @decovioti. O critério não seria os útimos 91 dias em relação ao =HOJE()?
...eu preciso manter as datas dos últimos 91 dias...
Ola Edison, desculpe pelo erro de digitação. O correto seria: se eu receber os dados:
Isso o critério seria esse mesmo, baseado na data de Hoje () então na minha lógica, eu estou tentando fazer "Hoje () - Data desejada", e a partir dai, deletar os registros que não atendem essa condição que seriam aqueles maiores 91 dias.
Por favor me avise se não ficou claro e obrigado
Uma maneira bem simples seria usar ao lado uma coluna a mais com uma fórmula em J2 como:
=SE(I2<(HOJE()-91);"Pode excluir";"Manter")
Arrastando até o final. Aí seria só filtrar normalmente as com "Pode excluir", selecionar e excluir as linhas como de praxe.
Se for uma tarefa repetitiva e tiver que ser por VBA pra ficar automático, dê um retorno.
@edsonbr Obrigado pela orientação
Na verdade a ideia e automatizar um processo que a pessoa faz repetidamente. Eu consegui ate momento criar esse código abaixo.
Gostaria que a partir do código abaixo, a macro excluísse a linha que tem a diferenca maior de 91 dias e excluísse a linha inteira e a coluna "teste" em seguida.
Eu tentei criar o loop abaixo, mas não esta funcionando corretamente, eu consegui criar a formula, porem quando eu peco para excluir a linha onde o valor e maior que 91, o loop esta se perdendo.
Se houver uma maneira mais simples, eu também poderia aprender
Sub Last91days()
'Set up Variables
Dim lLast As Double
Dim i As Integer
Dim Column As Range: Set Column = Application.Range("J:J")
lLast = Range("A1048576").End(xlUp).Row
'Improve the performance of the macro
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
'Add a new column/Header
Column.Insert Shift:=xlShiftToRight, CopyOrigin:=xlFormatFromRighorBelow
Range("J1").Select
ActiveCell.FormulaR1C1 = "Test"
Range("J2").Select
'Loop to add the formula "91 days"
For i = 2 To lLast
Cells(i, 10) = ("=TODAY()-RC[-1]")
Cells(i, 10).Select
Selection.NumberFormat = "0.0"
If (Cells(i, 10)) > 91 Then
Cells(i, 10).EntireRow.Delete
End If
Next
'Insert the borders to the dataset
With Range("A1")
.CurrentRegion.Borders.LineStyle = xlContinuous
End With
End Sub
@edsonbr, Boa noite
Eu consegui fazer o que eu queria, porem percebi que devido a falta de algumas datas na coluna em que estou usando como base para fazer a formula dos 91 dias, "= Today () - Data Desejada "estou tendo problemas. Muitas Datas aparecem como "NULL". e como resultado estou tendo "#VALUE!", o que esta me gerando o erro "Excel VBA Run-time error '13' Type mismatch"
Existe alguma maneira de contornar esse problema?
'Loop to keep/verify formula "91 days"
For lRow = lLast To 2 Step -1
If _
Cells(lRow, "J") > 91 Then
'Cells(lRow, "J") > 91 Or Cells(lRow, "J") = "#VALUE!" Then
Rows(lRow).Delete
End If
Next lRow
@decovioti, boa noite
Sugiro fazer uma adaptação daquele código que fizemos para seu outro tópico, daí nem haveria necessidade de criar uma coluna a mais na planilha com fórmula (o uso de uma coluna extra calculada que sugeri foi imaginada para exclusão manual, filtrando):
Sub ExcluiAntigas() Dim rg As Range, c As Range, txtExcl As String For Each c In Range([I2], [I2].End(xlDown)) If IsDate(c) Then If c < (Date - 91) Then If rg Is Nothing Then Set rg = c Else Set rg = Union(rg, c) End If End If Next c If Not rg Is Nothing Then txtExcl = "As " & rg.Cells.Count & " linhas selecionadas serão excluídas. Confirma?" Set rg = rg.EntireRow: rg.Select If MsgBox(txtExcl, vbYesNoCancel, "EXCLUIR ANTIGAS") = vbYes Then rg.Delete [A1].Select End If End Sub
@edsonbr muito grato pela orientação. Muito valiosas as suas dicas
Acabei descobrindo uma outra maneira.
Ate o próximo tópico