VBA – Diferença entre meses em categorias agrupadas

Olá amigos,

Hoje vou postar uma Function (Função = Fórmula) que pode facilitar muito a vida de quem trabalha com informações de datas, muitas vezes precisamos saber a idade ou tempo decorrido a partir de uma data inicial até a data atual, se fossemos realizar esta tarefa manualmente teríamos muito trabalho e certamente um grande gasto de tempo.

Vou postar um exemplo que mostra quanto tempo determinados clientes estão em atraso, classificando os mesmos em categorias.

tabela-diferença-entre-datas-meses-excel

Porém ressalto que cabe a você adaptar o exemplo a sua realidade de atividade ou negócio.

[codigo]

Function tempo_meses(num1)

num1 = DateDiff(“m”, num1, Now)

Select Case num1

Case 1 To 3
tempo_meses = “1 | 01 a 03 meses”

Case 4 To 6
tempo_meses = “2 | 04 a 06 meses”

Case 7 To 11
tempo_meses = “3 | 07 a 11 meses”

Case 12 To 18
tempo_meses = “4 | 12 a 18 meses”

Case 19 To 24
tempo_meses = “5 | 19 a 24 meses”

Case Else
tempo_meses = “6 | Mais de 2 anos”

End Select

End Function

[/codigo]

Explicando o código por etapas…

    1. Function tempo_meses(num1)
    2. num1 = DateDiff(“m”, num1, Now)
    3. Select Case num1

1 Etapa…
Nesta etapa capturamos o valor da data na célula, pois como se trara de uma fórmula armazenaremos o valor na variável num1, o nome da função ou fórmula será tempo_meses.

2 Etapa…
Pegamos a varíavel num1 e utilizamos o valor da mesma na dunção DateDiff (Onde o próprio nome diz = Diferença entre datas)

Neste código utilizamos a função DATEDIF(unidade, data_inicial,data_final).

DateDiff(“M”, num1, Now) ONDE:

“M” = Trará o retorno do número de meses em quantidade do período.
num1 = É a data inicial do período.
now = É a data atual do sistema, no caso hoje.

DATEDIF(unidade, data_inicial,data_final).
Esta função calcula o número de dias, meses ou anos entre duas datas.

DATA_INICIAL: é uma data que representa a primeira data, ou data de partida, início do período.
DATA_FINAL: é uma data que representa a última data, ou data de término, fim do período.

UNIDADE: é o tipo de informação que você deseja que seja retornado a função,vide tabela abaixo:

Unidade Retorno
“Y” O número de anos completos no período.
“M” O número de meses completos no período.
“D” O número de dias no período.
“MD” A diferença entre os dias de DATA_INICIAL e DATA_FINAL.
Os meses e anos das datas são ignorados.
“YM” A diferença entre os meses de DATA_INICIAL e DATA_FINAL.
Os dias e anos das datas são ignorados
“YD” A diferença entre os dias  de DATA_INICIAL e DATA_FINAL.
Os anos das datas são ignorados.

As datas são armazenadas como números de série sequenciais para que eles possam ser utilizados em cálculos . Por padrão, 31 dez 1899 é o número de série 1 , e 1 de Janeiro de 2008, é o número de série 39448 , pois é 39,448 dias após 1 de Janeiro de 1900.

A função DATEDIF é útil em fórmulas em que você precisa para calcular a idade ou tempo entre datas.

3 Etapa…
Nesta etapa já temos a data no código e a quantidade de meses armazenada na variável num1, e aplicamos a estrutura condicional SELECT CASE para dar o retorno com a quantidade de meses com categorias…

Caso o num1 seja o retorno de meses entre 1 até 3 exibirá a mensagem “1 | 01 a 03 meses”, e assim por diante em cada categoria de meses, caso não tenham mais condições a serem mapeadas a expressão é finalizada com o CASE ELSE mapeando o último cenário, e a estrutura é finalizada com o END SELECT.

[codigo]Select Case num1

Case 1 To 3
tempo_meses = “1 | 01 a 03 meses”

Case Else
tempo_meses = “6 | Mais de 2 anos”

End Select

[/codigo]

IMPORTANTE: A função se chama tempo_meses, e retorno dentro da estrutura condicional dele ser o mesmo para que assim a função/fórmula funcione adequadamente no Microsoft Excel.

Clique aqui e faça Download do CÓDIGO VBA.
Clique aqui e faça Download do EXCEL COM EXEMPLO.

Com este arquivo espero que sua dúvidas sejam sanadas e que você tenha pelo menos um norte para iniciar seus trabalhos no que refere-se a trabalhar com diferença entre datas.

Agradeço pela leitura e fico no aguardo de seus comentários e sugestões.

Um abraço. DG

Comentários

  • djalma rodrigues
    Responder

    Douglas, bom dia.

    Parabéns pela excelente iniciativa. Lhe enviei convite no Linked In, pois gostaria de lhe ter como conexão.

    Ainda não tentei executar o código, mas neste caso não seria mais simples o uso da função de diferença de datas, excluindo os feriados, que poderiam estar em uma tabela atualizável ?
    O mesmo para a classificação de “aging” que eventualmente pode demandar um agrupamento flexível, conforme os desejos da gestão.

    Forte abraço,
    Djalma Rodrigues

    • Douglas Godoy

      Bom dia Djalma.

      Primeiramente muito obrigado pela visita e também pelo comentário, será muito bom tê-lo entre meus contatos no LinkedIn, se precisar de algo fico a disposição.

      Sobre seu comentário digo que depende do ponto de vista, e até mesmo da necessidade do usuário para a utilização da função de diferença de datas.

      Caso o usuário precise apenas do retorno da diferença entre datas em quantidade é muito viável é até mais rápido o uso da função de datas, porém o que torna o trabalho moroso e até chato é a classificação do “Aging”, pois fazer a mesma via fórmula para algumas pessoas é uma tarefa um pouco difícil.

      Fazer via código ao meu ver faz com que haja a integridade do “Aging” e é até mais rápido, pois basta colar o código no módulo na planilha e verificar se o “Aging” proposto atende.

      A função é boa para quem trabalha com o mesmo “Aging” sempre, para casos em que ele muda frequentemente podemos utilizar a tabela auxiliarcomo citou.

      Novamente lhe agradeço pelo comentário e lhe convido a sempre que quiser retornar.

      Um Abraço.

      DG

  • Alessandro Trovato
    Responder

    Parabéns pelo artigo Douglas! Simples e direto.

    • Douglas Godoy

      Ola Alessandro,

      Muito obrigado pela visita e pelo comentário.

      Sempre que precisar fico a disposição.

      Um abraço.