Notifications
Clear all

Listar os Ultimos 90 dias e deletar as outras datas


DECOVIOTI
(@decovioti)
Active Member Registered
Entrou: 7 meses atrás
Posts: 17
Topic starter  

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?


ResponderCitar (Quote)
Tags do Tópico
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 750
 
Postado por: @decovioti

...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()? 

Postado por: @decovioti

...eu preciso manter as datas dos últimos 91 dias...

 


ResponderCitar (Quote)
DECOVIOTI
(@decovioti)
Active Member Registered
Entrou: 7 meses atrás
Posts: 17
Topic starter  

@edsonbr

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

 

 


ResponderCitar (Quote)
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 750
 

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.


ResponderCitar (Quote)
DECOVIOTI
(@decovioti)
Active Member Registered
Entrou: 7 meses atrás
Posts: 17
Topic starter  

@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


ResponderCitar (Quote)
DECOVIOTI
(@decovioti)
Active Member Registered
Entrou: 7 meses atrás
Posts: 17
Topic starter  

@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


ResponderCitar (Quote)
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 750
 

@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 


ResponderCitar (Quote)
DECOVIOTI
(@decovioti)
Active Member Registered
Entrou: 7 meses atrás
Posts: 17
Topic starter  

@edsonbr muito grato pela orientação. Muito valiosas as suas dicas

Acabei descobrindo uma outra maneira.

Ate o próximo tópico 


ResponderCitar (Quote)