Calculando um Intervalo entre datas

No artigo de hoje, explicarei uma maneira bem elaborada para obtermos o cálculo da diferença entre duas datas diferentes. Quando digo ‘datas’, não simplesmente de calcular o intervalo de dias, falo no sentido bem amplo da palavra, me refiro tanto a dias quanto a meses, anos, trimestres, horas, minutos, segundos e assim vai. Dessa maneira, poderemos, com esses intervalos, definir a idade de uma pessoa, o tempo que falta para a chegada do Natal, o tempo gasto para resolver uma questão de prova e muito mais coisas que forem interessantes para nós ou necessárias para nossos trabalhos.
Vale a pena você ler outro artigo que escrevi ensinando uma função para mostrar quantos dias faltam para um evento ou dia específico.
No Excel, a simples ação de subtrair uma célula com data por outra célula não resulta sempre no resultado esperado e pode nos causar muitas dores de cabeça. Pensando nisso, vou demonstrar a vocês como descobrir esses intervalos usando uma fórmula personalizada através do VBA.
Para você entender um pouco mais a respeito de como o Excel trabalha com datas, indico a leitura destes 4 artigos aqui:
Um pouco mais sobre datas (Parte 1)
Um pouco mais sobre datas (Parte 2)
Um pouco mais sobre datas (Parte 3)
Um pouco mais sobre datas (Parte 4)

Criando uma planilha de Controle de Estacionamento


Neste exemplo prático, criei uma planilha de entrada e saída de veículos de um estacionamento rotativo. No momento que um automóvel acessa o estacionamento é efetuada a marcação da hora em que o fato ocorreu. Na saída, nova marcação é executada, indicando o horário de saída. A planilha irá calcular o tempo que o veículo ficou estacionado e o preço a pagar pelo tempo de uso da vaga.
Simples né. Então vamos ao serviço!
Crie uma planilha com 7 colunas assim:

  • Placa  – (Identificação do veículo estacionado)
  • Horário de Entrada – (Inserir a hora inicial)
  • Horário de Saída – (Inserir a hora final)
  • Duração  – (Será inserida a fórmula do intervalo de tempo)
  • Tempo Cobrado (hora) – (Fórmula para arrendondar o tempo de cobrança pois a hora não será fracionada)
  • Preço – (Inserir o preço por hora)
  • Total a Pagar – (Fórmula do total entre o preço e o tempo utilizado)

CalculaTempo_g
 

O código VBA


Após a formatação da planilha, acesse o projeto do VBA (ALT + F11) e adicione um módulo. Neste módulo, digite o código:


Public Function Duracao(DataInicial As String, DataFinal As String) As String
Dim lngTempo As Long
Dim lngSeg As Long, lngMin As Long, lngHora As Long
Dim sResultado As String
    lngTempo = DateDiff("s", DataInicial, DataFinal)
    If lngTempo < 60 Then
        'Menos que 60 segundos(menos que 1 minuto)
        sResultado = "0:00:" & IIf(lngTempo < 10, "0" & lngTempo, lngTempo)
    Else
        If lngTempo < 3600 Then
            'Menos que 60 minutos (menos que 1 hora)
            lngMin = Fix(lngTempo / 60)
            lngSeg = lngTempo - (lngMin * 60)
            sResultado = "0:" & IIf(lngMin < 10, "0" & lngMin, lngMin) & ":" & IIf(lngSeg < 10, "0" & lngSeg, lngSeg)
        Else
            'Mais que ou igual a 1 hora
            lngHora = Fix(lngTempo / 3600)
            lngMin = Fix((lngTempo - (lngHora * 3600)) / 60)
            lngSeg = Fix((lngTempo - (lngHora * 3600)) - (lngMin * 60))
            sResultado = lngHora & ":" & IIf(lngMin < 10, "0" & lngMin, lngMin) & ":" & IIf(lngSeg < 10, "0" & lngSeg, lngSeg)
        End If
    End If
    Duracao = sResultado
End Function
Sub MarcarEntradaSaida()
    ActiveCell.Value = Now
End Sub

 

Utilizando a fórmula na planilha

 
A função DateDiff calcula a diferença entre duas determinadas datas.
Retorne a planilha do Excel e na primeira linha de lançamentos (veja no exemplo disponível para download no final do artigo), e na coluna Duração, insira a fórmula:
=SE(ÉERROS(Duracao(C8;D8));”0:00:00″;Duracao(C8;D8))
ÉERROS serve para verificar se o cálculo retornou algum erro e com isso podemos implementar o código alterando a exibição do resultado, deixando a planilha com um aspecto mais agradável.
Na coluna posterior, Tempo Cobrado, terá o sentido de pegar na célula Duração o valor referente a hora e adicionar mais uma hora caso ultrapasse zero minutos. Digite a seguinte fórmula:
=ESQUERDA(E8;LOCALIZAR(“:”;E8)-1) + SE(EXT.TEXTO(E8;LOCALIZAR(“:”;E8)+1;2)=”00″;0;1)
Na coluna que exibirá o Total a Pagar basta multiplicar a duração pelo tempo cobrado, neste exemplo digite:
=F8*G8
Copie as fórmulas digitadas para as demais células. Falta pouco. Insira dois botões da caixa de ferramenta formulários e aplique a eles a Macro “MarcarEntradaSaida“.
ToolBoxForm
AtribuiMacroABotao
 
Bem. Agora está pronto.
Quando for lançar um veículo, selecione a célula referente ao horário de entrada e clique no botão “marcar entrada” e, na saída do veículo, selecione a célula referente ao horário de saída e clique no botão “marcar saída”.
Com essa função é possível fazer muito mais coisas. Exemplo, para calcular a idade de uma pessoa, por exemplo, em vez de “s” como usamos hoje, para identificar segundos, podemos usar “yyyy” para anos. Ficaria assim: DateDiff(“yyyy”, DataInicial, DataFinal) , sendo DataInicial, a data de aniversário e a DataFinal o dia atual e o resultado seria a idade da pessoa em anos. Num próximo artigo trago mais exemplos práticos para o uso dela.
Um abraço.
Baixe os arquivos desta matéria no link de download no final do artigo.

Termos aprendidos neste artigo:

DateDiff Retorna uma Variant (Long) que especifica o número de intervalos de tempo entre duas datas especificadas.Sintaxe

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

interval Obrigatório. Expressão de seqüência que é o intervalo de tempo usado para calcular a diferença entre date1 e date2.
date1, date2 Obrigatório; Variant (Date). Duas datas que você deseja usar no cálculo.
firstdayofweek Opcional. Uma constante que especifica o primeiro dia da semana. Se não for especificada, será considerado o domingo.
firstweekofyear Opcional. Uma constante que especifica a primeira semana do ano. Se não for especificada, será considerada aquela em que ocorre o dia 1º de janeiro.

Função DateDiff Definições

O argumento interval tem as seguintes configurações:

Definição Descrição
yyyy Ano
q Trimestre
m Mês
y Dia do ano
d Dia
w Dia da semana
ww Semana
h Hora
n Minuto
s Segundo

O argumento firstdayofweek tem as seguintes configurações:

Constante Valor Descrição
vbUseSystem 0 Use a definição NLS API.
vbSunday 1 Domingo (padrão)
vbMonday 2 Segunda-feira
vbTuesday 3 Terça-feira
vbWednesday 4 Quarta-feira
vbThursday 5 Quinta-feira
vbFriday 6 Sexta-feira
vbSaturday 7 Sábado
Constante Valor Descrição
VbUseSystem 0 Use a definição NLS API.
VbFirstJan1 1 Inicie com a semana na qual ocorre o dia 1  de janeiro (padrão).
VbFirstFourDays 2 Inicie com a primeira semana que tem pelo menos quatro dias no ano novo.
VbFirstFullWeek 3 Inicie com a primeira semana completa do ano.
FIX e INT

Retorna a parte inteira de um número.

Sintaxe

Int(number)

Fix(number)

Funções Int e Fix Comentários

Tanto Int como Fix removem a parte fracionária de number e retornam o valor inteiro resultante.

A diferença entre Int e Fix é que, se number for negativo, Int retorna o primeiro inteiro negativo que seja menor ou igual a number, enquanto Fix retorna o primeiro inteiro negativo maior ou igual a number. Por exemplo, Int converte -8,4 para -9, e Fix converte -8,4 para -8.

Fix(number) é equivalente a:

Sgn(number) * Int(Abs(number))
NOW Retorna uma Variant (Date) que especifica a data e hora atuais de acordo com a data e hora do sistema do seu computador.Representa a função AGORA().
ÉERROS Retorna VERDADEIRO se Valor se referir a qualquer valor de erro (#N/D, #VALOR!, #REF!, #DIV/0!, #NÚM!, #NOME? ou #NULO!).Sintaxe
ÉERROS(valor)
ESQUERDA ESQUERDA retorna o primeiro caractere ou caracteres em uma seqüência de caracteres de texto baseado no número de caracteres especificado por você.ESQUERDASintaxe
ESQUERDA(texto;núm_caract)
 
Texto    é a seqüência de caracteres de texto que contém os caracteres que você deseja extrair.
Núm_caract   especifica o número de caracteres que você deseja que ESQUERDA extraia.

  • Núm_caract deve ser maior ou igual a zero.
  • Se núm_caract for maior do que o comprimento do texto, ESQUERDA retornará todo o texto.
  • Se núm_caract for omitido, será considerado 1.
LOCALIZAR LOCALIZAR retorna o número do caractere no qual um caractere específico ou uma seqüência de caracteres de texto é encontrado primeiro, começando com núm_inicial. Use LOCALIZAR para determinar o local de um caractere ou uma seqüência de caracteres de texto em outra seqüência para que você possa usar as funções EXT.TEXTO ou MUDAR para alterar o texto.LOCALIZARSintaxe
LOCALIZAR(texto_procurado;no_texto;núm_inicial)
 
Texto_procurado    é o texto que você deseja localizar.É possível usar os caracteres curinga ponto de interrogação (?) e asterisco (*) em texto_procurado. Um ponto de interrogação coincide com qualquer caractere único; um asterisco coincide com qualquer seqüência de caracteres. Se desejar localizar um ponto de interrogação ou asterisco real, digite um til (~) antes do caractere.
No_texto    é o texto em que se deseja localizar o texto_procurado.
Núm_inicial  é o número do caractere em no_texto em que se deseja iniciar a pesquisa.

11 comentários em “Calculando um Intervalo entre datas”

  1. eu fiz a planilha, mas quando ponho a formula SE. diz-me que introduziu numero insuficiente argumentos para esta função. Se poderem me dar uma dica agradecia

    Responder
    • Faça o download da planilha de exemplo (têm o link para baixar no final do artigo).
      Talvez você esteja copiando ou digitando algo errado.
      Pelo arquivo que eu disponibilizei, você vai conseguir fazer os testesou simulações que desejar.
      Abç

      Responder
  2. Ola
    Estou com uma dificuldade que nao consigo resolver referente a datas…
    Tenho em A1 a A14 uma relacao de datas e em A20=13/02/2012 referente a data do dia de hoje…
    A dificuldade e que em A21 preciso saber a proxima data, depois do dia de hoje de baixo pra cima que no exemplo abaixo, a resposta seria 17/02/2012 estou quebrando a cabeca para encontrar uma formula pra isto e nao encontro, alguem pode me ajudar?
    A1..11/03/2012
    A2..11/03/2012
    A3..06/03/2012
    A4..06/03/2012
    A5..03/03/2012
    A6..26/02/2012
    A7..25/02/2012
    A8..25/02/2012
    A9..19/02/2012
    A10.19/02/2012
    A11.17/02/2012
    A12.17/02/2012
    A13.21/01/2012
    A14.21/01/2012
    A20.13/02/2012
    A21.17/02/2012
    aguardo retorno

    Responder
      • Olá Reinaldo,
        minha dúvida é o seguinte, tenho em um banco de dados a data de entrada com a hora(na mesma célula) e outra coluna com a data e hora (tb mesma célula) em que um exame foi realizado, preciso calcular o tempo em horas entre as duas células, como faço???
        30/08/2010 17:20 31/8/2010 17:40

        Responder
        • Adriana,
          Baixe a planilha com a macro já prontinha que disponibilizo lá no fim do artigo.
          Faça o teste com seus valores, acho que bem o que você quer.
          No caso de sua planilha, basta copiar o código que descrevo aqui para o VBA dela.
          Para usar, suponha que as data esteja em A1 e B1, respectivamente. Então na célula C1 você digita:
          =SE(ÉERROS(Duracao(A1;B1));”0:00:00″;Duracao(A1;B1))
          Faça isso nas demais linha da sua base de dados.
          Essa é uma solução onde você pode manipular a seu critério o modo de cálculo e resultados retornados pela enorme flexibilidade das macros. Contudo, no seu caso específico, você não precisa recorrer ao VBA, pode usar uma combinação de fórmulas e formatos. Assim:
          Em C1 digite: =B1-A1
          E formate C1 com a máscara [h]:mm:ss
          Espero ter ajudado.
          Abç

          Responder

Deixe um comentário