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.
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:
01Public Function Duracao(DataInicial As String, DataFinal As StringAs String
02Dim lngTempo As Long
03Dim lngSeg As Long, lngMin As Long, lngHora As Long
04Dim sResultado As String
05 
06    lngTempo = DateDiff("s", DataInicial, DataFinal)
07 
08    If lngTempo < 60 Then
09        'Menos que 60 segundos(menos que 1 minuto)
10        sResultado = "0:00:" & IIf(lngTempo < 10, "0" & lngTempo, lngTempo)
11    Else
12        If lngTempo < 3600 Then
13            'Menos que 60 minutos (menos que 1 hora)
14            lngMin = Fix(lngTempo / 60)
15            lngSeg = lngTempo - (lngMin * 60)
16            sResultado = "0:" & IIf(lngMin < 10, "0" & lngMin, lngMin) & ":" & IIf(lngSeg < 10, "0" & lngSeg, lngSeg)
17        Else
18            'Mais que ou igual a 1 hora
19            lngHora = Fix(lngTempo / 3600)
20            lngMin = Fix((lngTempo - (lngHora * 3600)) / 60)
21            lngSeg = Fix((lngTempo - (lngHora * 3600)) - (lngMin * 60))
22            sResultado = lngHora & ":" & IIf(lngMin < 10, "0" & lngMin, lngMin) &":" & IIf(lngSeg < 10, "0" & lngSeg, lngSeg)
23        End If
24    End If
25 
26    Duracao = sResultado
27 
28End Function
29 
30Sub MarcarEntradaSaida()
31    ActiveCell.Value = Now
32End 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 aDataFinal 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:

DateDiffRetorna uma Variant (Long) que especifica o número de intervalos de tempo entre duas datas especificadas.Sintaxe
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
intervalObrigatório. Expressão de seqüência que é o intervalo de tempo usado para calcular a diferença entre date1 e date2.
date1date2Obrigatório; Variant (Date). Duas datas que você deseja usar no cálculo.
firstdayofweekOpcional. Uma constante que especifica o primeiro dia da semana. Se não for especificada, será considerado o domingo.
firstweekofyearOpcional. 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çãoDescrição
yyyyAno
qTrimestre
mMês
yDia do ano
dDia
wDia da semana
wwSemana
hHora
nMinuto
sSegundo
O argumento firstdayofweek tem as seguintes configurações:
ConstanteValorDescrição
vbUseSystem0Use a definição NLS API.
vbSunday1Domingo (padrão)
vbMonday2Segunda-feira
vbTuesday3Terça-feira
vbWednesday4Quarta-feira
vbThursday5Quinta-feira
vbFriday6Sexta-feira
vbSaturday7Sábado
ConstanteValorDescrição
VbUseSystem0Use a definição NLS API.
VbFirstJan11Inicie com a semana na qual ocorre o dia 1  de janeiro (padrão).
VbFirstFourDays2Inicie com a primeira semana que tem pelo menos quatro dias no ano novo.
VbFirstFullWeek3Inicie 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))
NOWRetorna 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().
ÉERROSRetorna VERDADEIRO se Valor se referir a qualquer valor de erro (#N/D, #VALOR!, #REF!, #DIV/0!, #NÚM!, #NOME? ou #NULO!).Sintaxe
ÉERROS(valor)
ESQUERDAESQUERDA 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.
LOCALIZARLOCALIZAR 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.