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)

CalculaTempo_g

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

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 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]])

interval Obrigatório. Expressão de seqüência que é o intervalo de tempo usado para calcular a diferença entre date1 e date2.
date1, date2 Obrigatório; Variant (Date). Duas datas que você deseja usar no cálculo.
firstdayofweek Opcional. Uma constante que especifica o primeiro dia da semana. Se não for especificada, será considerado o domingo.
firstweekofyear Opcional. 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ção Descrição
yyyy Ano
q Trimestre
m Mês
y Dia do ano
d Dia
w Dia da semana
ww Semana
h Hora
n Minuto
s Segundo

O argumento firstdayofweek tem as seguintes configurações:

Constante Valor Descrição
vbUseSystem 0 Use a definição NLS API.
vbSunday 1 Domingo (padrão)
vbMonday 2 Segunda-feira
vbTuesday 3 Terça-feira
vbWednesday 4 Quarta-feira
vbThursday 5 Quinta-feira
vbFriday 6 Sexta-feira
vbSaturday 7 Sábado

Constante Valor Descrição
VbUseSystem 0 Use a definição NLS API.
VbFirstJan1 1 Inicie com a semana na qual ocorre o dia 1  de janeiro (padrão).
VbFirstFourDays 2 Inicie com a primeira semana que tem pelo menos quatro dias no ano novo.
VbFirstFullWeek 3 Inicie 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))
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.

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