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.
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. |





3 Comentários
ta de parabens!!!
muito boa essa planilha….
Reply
Comentário feito em setembro 30th, 2009 às 14:58
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
Comentário feito em dezembro 2nd, 2009 às 11:35
Deixar um comentário