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.

Para você entender um pouco mais a respeito de como o Excel trabalha com datas, indico a leitura destes 4 artigos aqui:

Um pouco mais sobre datas (Parte 1)

Um pouco mais sobre datas (Parte 2)

Um pouco mais sobre datas (Parte 3)

Um pouco mais sobre datas (Parte 4)

Criando uma planilha de Controle de Estacionamento

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:

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

 

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

Baixe os arquivos desta matéria no link de download no final do artigo.

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.

Antes de efetuar o download do arquivo de exemplo, convido você a socializar conosco.

Escolha uma das opções abaixo. Seguir no twitter, assinar nossa Newsletter...

Isso nos ajuda na divulgação do site e te permite ficar sempre atualizado das novidades. Fico muito grato pela sua colaboração.

Digite seu email:

Você receberá um email para ativar o cadastro, ok!