Olá, gostaria de saber como faço para filtrar dados com base em datas maiores ou igual a hoje em vba.
Boa tarde Daiane. Existem várias maneiras de filtrar datas em VBA. O ideal é que voce seja mais específica.
exemplo:
O filtro é em um objeto ?
O filtro é direto na planilha ?
O filtro puxa dados da planilha e exibe em um listbox ?
A data referencia de "HOJE" está na planilha ou em um objeto ?
Todos esses detalhes influenciam diretamente na resposta para sua dúvida.
Considerando que sua tabela contenham dados orientados por uma coluna de datas direto na planilha e hoje seja dia 02/05:
_/ A B C
1 DATA / Nome / VALOR
2 01/05/2022 Edu / 10,00
3 02/05/2022 Paulo / 12,00
4 03/05/2022 Flavio / 13,00
5 04/05/2022 Ana / 9,00
A maneira mais facil de gerenciar isso atraves de um código em VBA é transformando no proprio código as datas da coluna A em numero e o campo com sua data Hoje tambem em numero. Faça a sequencia do filtro e no fim do codigo transforme novamente a os numeros em datas. Dessa forma voce pula muitas etapas de compatibilizar o dado DATA no VBA com o DADO data na planilha.
As configurações de objetos e procedimentos no VBA, consideram MM/DD/AAAA e na planilha DD/MM/AAAA e por isso, quando fazemos os filtros, sempre retorna VAZIO.
Essas datas filtradas podem até serem utilizadas atravez de variavel. Exemplo :
Abaixo o código VBA :
'declaração da variavel que recebera a data em formato numero
Dim DtH As Single
' Transformandao os dados da coluna A em numero
Columns("A:A").Select
Selection.NumberFormat = "0.00"
'inserindo a data hoje na celula F1
Range("F1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
'transformando a data hoje na celula F1 em numero
Range("F1").Select
Selection.NumberFormat = "0.00"
'Carregando a variavel DtH com a data na celula F1 já no formato numero
DtH = Sheets("Planilha").Range("F1")
'Aplicando o filtro e utilizando no critério ">=" concatenado com a variavel com a data
Range("A1:C1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$C$5").AutoFilter Field:=1, Criteria1:=">=" & DtH, _
Operator:=xlAnd
'Selecionando as colunas filtradas de A até C e copiando
Columns("A:C").Select
Selection.Copy
'Colando somente valores filtrados na planilha 2
Sheets("planilha2").Select
Columns("A:A").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Transformando todos os dados de Data novamente no formato DATA e eliminado o filtro na planilha 1
Range("E9").Select
Sheets("Planilha1").Select
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$C$5").AutoFilter Field:=1
Columns("A:A").Select
Selection.NumberFormat = "m/d/yyyy"
Range("F1").Select
Selection.NumberFormat = "m/d/yyyy"
Range("A1").Select
Selection.AutoFilter
Range("E10").Select
Sheets("Planilha2").Select
Columns("A:A").Select
Selection.NumberFormat = "m/d/yyyy"
Range("E8").Select
' nesse ponto voce tem a planilha 1 com os dados originais e na planilha 2 somente os dados com data maiores que HOJE
End Sub
Faça a planilha conforme indicado e copie o codigo vba acima e veja cada etapa do codigo funcionar
Obs: não esqueça de ajustar as datas da sua tabela para que tenha datas antes e depois da sua data HOJE e também de criar a planilha 2 vazia para receber os dados filtrados.
Sub FiltrarPorData()
Dim ws As Worksheet
Dim dataAtual As Date
Dim rng As Range
' Defina a planilha onde estão os dados
Set ws = ThisWorkbook.Worksheets("Nome da Planilha")
' Defina a data atual como a data de hoje
dataAtual = Date
' Limpe qualquer filtro existente
ws.AutoFilterMode = False
' Defina o intervalo de dados a ser filtrado (altere "A2" para a célula inicial da sua coluna de datas)
Set rng = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
' Aplique o filtro para mostrar apenas as datas maiores ou iguais à data atual
rng.AutoFilter Field:=1, Criteria1:=">=" & dataAtual, Operator:=xlAnd
' Caso queira copiar os dados filtrados para outra área, você pode fazer algo como:
' rng.SpecialCells(xlCellTypeVisible).Copy Destination:=ws.Range("B2")
' Lembre-se de desligar o filtro ao final do procedimento (caso não queira manter o filtro)
' ws.AutoFilterMode = False
End Sub