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)
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“.
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]])
Função DateDiff Definições O argumento interval tem as seguintes configurações:
O argumento firstdayofweek tem as seguintes configurações:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. |
ta de parabens!!!
muito boa essa planilha….
Cara Muiiiiiiiiiiiiiiiitttttttttttttooooooo obrigada, meu q inveja!!!!!! gostaria muito de ser inteligente como vc =P
Thanks
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
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ç
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
Ridiem, bom dia.
Desconheço uma fórmula nativa que faça isso, de baixo para cima. Seria necessário recorrer ao VBA, ok.
Grande abraço.
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
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ç
alguém pode me passar essa planilha por email..
A planilha está disponível para download aqui mesmo, lá no final do artigo tem o link para baixar, ok!!!
Abç