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 String) As 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.
date1, date2Obrigató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.