Calculando um Intervalo entre datas
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.
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)
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:
01 | Public Function Duracao(DataInicial As String , DataFinal As String ) As String |
02 | Dim lngTempo As Long |
03 | Dim lngSeg As Long , lngMin As Long , lngHora As Long |
04 | Dim 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 |
28 | End Function |
29 |
30 | Sub MarcarEntradaSaida() |
31 | ActiveCell.Value = Now |
32 | 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“.
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:
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.
|
Nenhum comentário:
Postar um comentário