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.
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.
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)
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
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), 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.
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….
Reply
Cara Muiiiiiiiiiiiiiiiitttttttttttttooooooo obrigada, meu q inveja!!!!!! gostaria muito de ser inteligente como vc =P
Reply
Reinaldo Coral Reply:
dezembro 31st, 2009 at 15:29
Thanks
Reply
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
Reply
Reinaldo Coral Reply:
janeiro 14th, 2012 at 14:48
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ç
Reply