Você está na página 1de 62

Série “Como Fazer”

Fórmulas no Excel:
Manipulando Datas e Horas

por Robert Friedrick Martim

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando com Datas e Horas no Excel i

Nota sobre direitos autorais


Este eBook é de autoria de Robert F Martim, sendo comercializado através do site
www.juliobattisti.com.br ou através do site de leilões Mercado Livre:
www.mercadolivre.com.br.

Ao adquirir este eBook você tem o direito de lê-lo na tela do seu computador e de imprimir
quantas cópias desejar, desde que sejam para uso pessoal. É vetada a distribuição deste eBook,
mediante cópia ou qualquer outro meio de reprodução, para outras pessoas. Se você recebeu
este eBook através de e-mail ou via FTP de algum site da Internet, ou através de CD de Revista,
saiba que você está com uma cópia pirata, não autorizada. Se for este o seu caso entre em
contato com o autor através do e-mail rm@faircourt.com ou comunique diretamente ao nosso
site através do e-mail webmaster@juliobattisti.com.br.

Ao regularizar a sua cópia, você estará remunerando, mediante uma pequena quantia, o trabalho
do autor e incentivando que novos trabalhos sejam disponibilizados.

Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades!

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
ii Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Pré-requisitos
Para completar este curso é necessário um conhecimento básico do ambiente de trabalho do
Excel. Porém, quanto melhor o seu conhecimento de funções e fórmulas do Excel melhor será o
aproveitamento deste curso.

Este módulo visa a manipulação de fórmulas envolvendo datas e horas no Excel e nada mais.
Porém, em certas situações outras funções serão utilizadas em conjunto com as funções de datas
e horas para se resolver problemas encontrados no nosso dia-a-dia.

Os leitores interessados podem adquirir o curso básico de Excel em 120 lições no seguinte
endereço: www.juliobattisti.com.br/excel120/excel120.asp que servirá como trampolim
para um melhor aproveitamento e desenvolvimento deste módulo.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando com Datas e Horas no Excel iii

Objetivos deste eBook


Este eBook foi dividido em módulos. Este módulo trata sobre a manipulação de datas e horas no
Excel.

O trabalho foi desenvolvido a partir da demanda dos usuários do site www.juliobattisti.com.br. O


material procura analisar questões pertinentes ao dia-a-dia de seu trabalho. Vários exemplos são
retirados das dúvidas colocadas no fórum do site ou enviadas diretamente para o autor pelos
assinantes do site.

A linguagem utilizada é descontraída e com o mínimo de jargão possível. O objetivo é ter um


eBook com conteúdo relevante e de fácil compreensão.

Qualquer dúvida referente a este módulo podem ser colocadas diretamente no fórum Excel
avançado no endereço: http://www.juliobattisti.com.br/forum/default.asp ou enviadas para o autor.

Comentários e sugestões para melhora do material podem ser enviados diretamente para o autor
no endereço rm@faircourt.com

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
iv Série “Como Fazer”: Manipulando com Datas e Horas no Excel

ÍNDICE ANALÍTICO

Introdução ........................................................................................................................................ 1
Bem-vindo a série “Como Fazer”. ........................................................................................... 1
Antes de continuar .................................................................................................................. 1

1. Compreendendo horas e datas............................................................................................... 2

2. Datas, Sistemas de Datas e Horas ......................................................................................... 5


2.1. Como datas e horas são entradas e reconhecidas no Excel ......................................... 6
2.2. Formatando datas e horas no Excel .............................................................................. 8
2.3. Subtraindo e somando horas ....................................................................................... 10

3. Funções relacionadas a datas e horas ................................................................................. 17


3.1. Funções especiais para o cálculo com datas............................................................... 25
3.2. A função DATADIF....................................................................................................... 28

4. Datas, horas e mega-fórmulas.............................................................................................. 32

5. Manipulando horas e datas no VBA...................................................................................... 36


5.1. Resolvendo o ano bissexto .......................................................................................... 36
5.2. Criando uma função para calcular o último dia do mês ............................................... 37
5.3. Criando uma função para atualizar datas automaticamente........................................ 40
5.4. Contagem progressiva e regressiva............................................................................. 42
5.5. Cronômetros................................................................................................................. 45

6. Criando uma Splash Screen ................................................................................................. 48

7. Utilizando o Calendar Control em um formulário VBA .......................................................... 50

8. Sobre o autor ........................................................................................................................ 56

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 1

SÉRIES: COMO FAZER

Fórmulas no Excel:
Manipulando Datas e Horas
por Robert Friedrick Martim

Introdução

Bem-vindo a série “Como Fazer”.

Nas séries que serão escritas olharemos aspectos distintos do Excel de acordo com a demanda
do fórum Excel Júlio Battisti (http://www.juliobattisti.com.br). A intenção principal é fornecer ao
internauta uma ferramenta que concentre a atenção na solução de um problema específico.

Nesta série veremos como manipular datas e horas de forma eficiente no Excel. Conheceremos a
maneira como o Excel manipula datas/horas e como utilizar este conhecimento para resolver
problemas.

Antes de continuar

O trabalho foi desenvolvido no Excel 2003. Devido à rápida mudança em termos de tecnologia de
software, atenção sempre será dada às versões mais recentes do aplicativo Excel.

Não existe um pré-requisito per se; porém, o leitor deve estar ciente de que com o conhecimento
básico em dia, o aproveitamento do material será muito melhor. Sem o devido conhecimento de
algumas partes básicas que envolvem funções, este módulo se tornará mais laborioso e difícil do
que realmente é.

Sugestões serão sempre bem-vindas e esperamos que o leitor participe pro-ativamente no


desenvolvimento do material aqui apresentado.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
2 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

1. Compreendendo horas e datas


Antes de entrarmos neste mundo complexo de datas e horas em Excel precisamos compreender
alguns aspectos básicos de como o Excel manipula datas e horas.

Datas e horas muitas vezes podem se tornar confusas e erros são cometidos quando poderiam
ser evitados. Outras vezes complicamos soluções simples com uma fórmula complexa. Veja, por
exemplo, o tópico http://www.juliobattisti.com.br/forum/topic.asp?TOPIC_ID=1120 do fórum de
Excel básico.

Aqui, a pergunta era de como transformar uma data em dia da semana. Minha resposta foi:

=TEXTO(DIA.DA.SEMANA(D1);"dddd")

E a de outro colega simplesmente instrui a formatação da célula para "dddd". Ambos os métodos
estão corretos, mas o mais eficiente é o segundo. Obviamente que a primeira solução introduz
duas novas funções que podem ser utilizadas para solucionar outros problemas, mas a
complexidade foi desnecessária.

Excel é uma super matriz que se beneficia da capacidade de processamento matemático dos
micro-computadores atuais para executar tarefas que no passado só era possível com co-
processadores matemáticos.

Como o Excel lida com números é de se esperar que as datas e horas também sejam trabalhadas
neste formato. Em outras palavras, quando você vê uma data (ou hora) em Excel, na verdade,
aquela data (ou hora) se refere a um número inteiro ou uma fração.

Um problema que geralmente é mal compreendido pelos usuários do Excel é quando temos horas
que ultrapassam as 24 horas do dia. Vamos supor que você trabalhou 25 horas em um mês e
para cada hora trabalhada você ganha R$10. É fácil ver o quanto você ganhou no mês; porém, o
dia tem apenas 24 horas e isso não muda. Portanto se você trabalhou 25 horas, para o Excel você
trabalhou 24 horas (um dia completo, isto é, 24/24) mais uma hora (1/24) que é uma fração do dia.
Ou seja, você trabalhou 1,04165509259259 horas para o Excel. Agora, multiplique este valor pelo
valor de sua hora de salário e o resultado não é R$ 250.

Ao formatar 1,04165509259259 para horas, você obterá 00:59:59 (1 hora). Novamente, o motivo
para tal “discrepância” é que não existem as tais 25 horas no dia. Neste caso, 25 horas
representam 1 hora da manhã do dia seguinte (24 horas do dia anterior + 1 hora do novo dia).

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 3

Este é provavelmente um dos primeiros problemas que qualquer pessoa que já tenha trabalhado
com horas no Excel encontra. Para ser justo com o Excel, este não é um problema, mas a falta de
compreensão de como o Excel manipula datas e horas. Portanto, no exemplo anterior você
precisa converter os valores para a base correta (24 para horas), isto é, 1,04165509259259*10*24
retorna R$ 250 como o valor a ser pago pelas horas trabalhadas.

Do exemplo acima, podemos tirar algumas conclusões. Primeiro que as “24 horas” são
representadas pelo número inteiro 1. Qualquer hora dentro de um dia é representada pela fração
hora/24 e, consequentemente, o minuto é representado por minuto/1.440 e o segundo por
segundo/86.400. Assim sendo, as casas decimais representam a combinação de horas, minutos e
segundos dentro de um dia (24 horas).

Se dividirmos o dia em quatro partes, temos 6 horas ou ¼ do dia. A tabela abaixo mostra o valor
fracionário para estas quatro partes:

Horas do dia e frações correspondentes


Hora Fração
00:00:00 0.00

00:06:00 0.25

00:12:00 0.50

00:18:00 0.75

Figura 1-1

O incremento é de ¼ para cada um dos valores. Ao final de 24 horas, temos 1 dia (24/24).
Observe que estes são os decimais e se você formatar o valor 2,75, por exemplo, para horas o
total será de 18 horas. Contudo, estes 2,75 representam 2 dias e 18 horas. E não adianta bater no
Excel, porque não fará diferença alguma.

Vamos supor que um funcionário iniciou a jornada de trabalho no dia 29/06/2004 e terminou dois
dias depois 01/07/2004 às 18 horas. Ao tirar a diferença entre as duas datas o Excel retorna 2,75
(2 dias e ¾ de um dia) e um total de 66 horas trabalhadas (24+24+18 ou 2,75*24).

Pode ser chata a repetição, mas é importante que o leitor compreenda que para o Excel não
existem as tais 66 horas. O que existe são 2 dias e ¾ de um dia. E não existe uma maneira
melhor de salientar isso do que repetir o que já havia dito.

Agora que já perturbei o seu juízo com as repetições acima, faça o seguinte teste na planilha:
digite 0 (zero) em uma célula qualquer e formate-a para data. O que ocorre? A data é 00/01/1900!
A primeira coisa que nos vem à cabeça é que é um bug do Excel, pois não existe o dia “zero de
janeiro de 1900”! Ou será que existe?

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
4 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Pelo calendário que conhecemos isso não existe e pode ser considerado um bug. Mas pela lógica
utilizada no Excel não poderia ser diferente. Como as horas, minutos e segundos são
representados pela fração de um dia, ao formar um dia (a partir da data zero) obtemos
01/01/1900. Se não existisse esta primeira data, ao somarmos as 24 horas ao primeiro dia
disponível obteríamos 02/01/1900, ou seja a primeiro serial seria 02/01/1900.

Fica claro, portanto, que ao formatar os 2,75 como sendo uma data obtemos 02/01/1900 18:00:00,
ou seja, 2,75 é, na verdade, 18 horas do dia 2 de janeiro de 1900.

Se 00/01/1900 é a primeira data serial, qual é a última data então? Todos devem lembrar do
barulho causado pelo “bug do milênio”, não? Pois é, em Excel até a versão 97 isso era visto com
um problema e a partir da versão 2000 isso mudou. Os números seriais de datas do Excel a partir
da versão 2000 vão de 0 a 2.958.465, ou seja, não precisamos nos preocupar com o próximo bug
até 31/12/9999.

Como o Excel representa datas como números seriais, se somarmos 1 a última data disponível o
Excel retorna ######## e se subtrairmos 1 da primeira data disponível obtemos novamente
########. Isto não quer dizer que seja impossível escrever 31/12/1899 ou 01/01/10000, porém ao
entrar datas fora do intervalo permitido pelo Excel, elas serão tratadas como texto e perdemos a
flexibilidade quando precisamos fazer cálculos envolvendo horas e datas.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 5

2. Datas, Sistemas de Datas e Horas


O Excel possui dois sistemas de datas: sistema 1900 e sistema 1904. No primeiro caso, a primeira
data é 00/01/1900 e no segundo a primeira data é 01/01/1904.

Ao checar o Ajuda do Excel, o leitor notará que os valores lá representados são 01/01/1900 e
02/01/1904. Observe que no Ajuda, o número serial é 1 ao passo que na data que defini acima o
número serial é zero (0). Os números seriais entre 0 e 1 representam as primeiras 24 horas com
os minutos e segundos antes do primeiro dia ser completo.

Portanto, no caso exemplificado, 01/01/1904 representa 00:00:00 do dia 01/01/1904 e qualquer


fração entre 01/01/1904 e 02/01/1904 representa as horas, minutos e segundos do dia
01/01/1904. Em outras palavras, 6 horas da manhã do dia 01/01/1905 (0) é igual a
(01/01/1904+0,25 ou 0+0,25).

A maneira como a data é explicada no Ajuda pode confundir as coisas um pouco mais, pois é
justo perguntar o porquê da data iniciar em 02/01/1904 ao invés de 01/01/1904. A verdade é que
ela é realmente iniciada em 01/01/1904, mas o primeiro valor serial não-zero é 02/01/1904. No
tópico anterior, foi visto que se realmente considerarmos o serial como sendo 01/01/1900 ao invés
de 00/01/1900 o primeiro serial cairia em 02/01/1900. Para o sistema 1904 este é exatamente o
caso!

O padrão utilizado no Excel para Windows é o sistema 1900 ao passo que para o Macintosh o
sistema utilizado é o 1904.

A principal diferença entre os dois sistemas é que no primeiro não existem valores negativos para
data e horas ao passo que no segundo é possível subtrair uma data maior de uma menor sem
obter as hachuras (########) que representam o erro quando a data é inválida.

Não obstante, é sempre bom lembrar que a maioria dos usuários do Excel para Windows não se
importa com isso (e até desconhece) e utiliza o sistema padrão ao trabalhar com datas. Ao
modificar o sistema de datas é importante entender que entre os anos base 01/01/1900 e
01/01/1904 existe uma diferença de 1.461 dias1!

Vamos supor que digitamos a data 01/07/2004 no sistema 1900 e a mesma data no sistema 1904.
Ocorre um grave problema, pois estamos utilizando bases diferentes para estas datas. No
primeiro caso, o número serial é 38.169 e no segundo 37.707. Ou seja, no sistema 1900 o valor

1
Ao fazer a diferença entre as duas datas o leitor obterá 1.462 dias. Não obstante, o ano de 1900 não é bissexto embora o Excel o
considere assim. Deste modo há um dia a mais referente ao dia 29/02/1900 que nunca existiu. Cálculos efetuados a partir de
01/03/1900 retornam a diferença corretamente. Este erro consta na biblioteca da Microsoft e foi mantido, de acordo com eles, para
compatibilidade com o Lotus 1-2-3.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
6 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

serial 37.707 refere-se a 27/03/2003 ao passo que o serial 38.169 no sistema 1904 refere-se a
02/07/2008!

A melhor maneira de visualizar isso é entrar uma data em uma célula qualquer e modificar o
sistema base. Observe que a data modifica-se imediatamente! Se isso for modificado e mantido
(ou retornado para outro sistema de data) fica simplesmente impossível saber qual a data entrada
originalmente!

Este é um ponto importante a ser observado antes de se fazer qualquer mudança no sistema de
datas. Uma mudança sem as devidas considerações pode soletrar desastre para planilhas com
muitas dependências sobre datas.

Para modificar o sistema de data utilizado vá até Ferramentas Æ Opções Æ Cálculo Æ


Opções de Planilha e escolha a opção Sistema de data 1904.

2.1. Como datas e horas são entradas e reconhecidas no Excel

Ao digitar 01/07, por exemplo, o Excel automaticamente transforma o valor digitado para um
número serial que representa tal data. Como nenhum ano foi especificado o Excel trata o ano
como sendo o ano corrente do sistema (se o seu sistema estiver com a data errada, a conversão
que prevalecerá é qualquer data do sistema).

Uma outra opção é entrar o valor serial referente a data. Neste caso, você precisa saber de
antemão qual é este valor. Contudo, por mais que você conheça o Excel é improvável que você
saiba tais números de cabeça. Observe, porém, que ao digitar um número serial o Excel não
interpretará como data até que ele seja formatado como tal.

Para aqueles que trabalham com o sistema operacional Windows em diferentes línguas (como
inglês e português, por exemplo), já devem ter notado que o Excel insere a data em formatos
distintos. Isto ocorre porque o Excel utiliza o formato do sistema operacional para decidir qual
formato utilizar na célula.

Se por algum motivo você precisa de um formato diferente será necessário modificá-lo no painel
de controle. Para fazer isso, vá até Iniciar Æ Painel de Controle Æ Opções
Regionais Æ Personalizar Æ Data e na opção Formato de data abreviada
modifique para o formato desejado.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 7

Na caixa para o formato de “data abreviada”, veremos que há uma lista de formatos disponíveis.
Além dos formatos disponíveis o Excel reconhecerá como data qualquer dos valores entrados em
uma célula conforme a tabela abaixo:

Formato reconhecido Como digitado na célula Valor serial


d/M/aaaa 1/7/2004 38.169
d/M/aa 1/7/04 38.169
dd/MM/aa 1/07/04 38.169
dd/mm/aaaa 01/07/2004 38.169
aaaa/MM/dd 2004/07/01 38.169
d-M-aa 1-7-04 38.169
d-M-aaaa 1-7-2004 38.169
dd-MM-aa 01-07-2004 38.169
dd-MM-aaaa 01-07-2004 38.169
aaaa-MM-dd 2004-07-01 38.169
dd MMMM aa 1 julho 04 38.169
dd MMM aa 01 jul 04 38.169
dd MMMM aaaa 01 julho 2004 38.169
dd MMMM 01 julho 38.169
dd MM 01 jul 38.169
Figura 2-1

A tabela mostra os valores reconhecidos pelo Excel quando uma data é digitada. Por exemplo, ao
entrar 2004/07/01 o Excel converte para o número serial 38.169. Isto não quer dizer que o formato
do número seja esse, apenas quer dizer que o Excel é capaz de reconhecer este valor como
sendo uma data e não texto. O formato será dado pelo formato padrão definido no painel de
controle com exemplificado anteriormente.

Qualquer outro formato de data que não seja reconhecido pelo Excel é automaticamente
convertido para texto impossibilitando, assim, qualquer manipulação matemática envolvendo tal
data. Um bom exemplo são datas históricas. Como o Excel não reconhece datas anteriores a
01/01/1900 (sistema 1900) fica impossível fazer cálculos com datas anteriores a 19002.

Como foi dito anteriormente, uma data qualquer é representada por um número serial e este valor
é um número inteiro. As horas, no entanto, são representadas por frações dentro de um dia, os
minutos como frações dentro de uma hora e os segundo como frações dentro de um minuto.

Portanto, para se avaliar horas em Excel, nós avaliamos frações do dia. Vamos supor que
desejamos avaliar às 12:00:00 PM (meio dia). Se for meio-dia estamos observando uma fração
que representa a metade do dia, isto é ½ ou 0,5. Ao entrar este valor na célula e formatá-lo,
veremos que o Excel o reconhece como horas. Agora, digite o número 12 e formate para horas.

2
Embora seja impossível fazer tal cálculo utilizando as funções disponíveis no Excel é possível criar funções próprias (utilizando VBA)
que convertem tais valores e possibilitam tais cálculos.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
8 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Desta vez o resultado é 00:00:00 do dia 12/01/1900, pois estamos avaliando 12 dias completos
com 24 horas.

A tabela abaixo mostra os valores seriais matutinos e vespertinos:

VALORES MATUTINOS
Formato reconhecido Como digitado na célula Valor serial
00:00:00 10:30:00 0,43750
00:00:00 AM 10:30:00 AM 0,43750
00:00 10:30 0,43750
00:00 AM 10:30 AM 0,43750

VALORES VESPERTINOS
Formato reconhecido Como digitado na célula Valor serial
00:00:00 22:30:00 0,93750
00:00:00 PM 10:30:00 PM 0,93750
00:00 22:30 0,93750
00:00 AM 10:30 PM 0,93750
Figura 2-2

Ao aproximarmos de meia-noite, vale perguntar quando o Excel vira o relógio e começa a contar o
dia seguinte. A precisão do Excel neste aspecto é de um milissegundo. Ou seja, ao bater 999
milésimos de segundo o próximo milissegundo gira o próximo segundo. Assim sendo, antes de
bater 24 horas o Excel baterá 23:59:59,999. Observe que os milissegundos não são separados
por dois pontos, mas por vírgula3.

Como a tabela acima indica, qualquer valor representando uma hora, minuto ou segundo é
representado por um valor decimal qualquer. Sabemos que um segundo em um dia é
representado por 1/24/60/60 ou 1/86400. Se o mínimo é um milésimo de segundo então tal fração
é representada por 1/(86400*1000) ou 1.15740740740741E-084 (a menor fração possível). O
máximo é, portanto, 24 horas (1) menos este valor. Em outras palavras, a fração máxima é
0,99999999 (23:59:59,999)5. Caso você tente um número maior do que este (por menor que seja
o incremento) o resultado será zero hora do dia seguinte.

2.2. Formatando datas e horas no Excel

Entendido como o Excel interpreta datas e horas, partimos agora para a parte de formatação.
Quando o assunto é formatação de células (seja data, hora ou qualquer outro formato) o Excel é
bastante flexível. Além dos formatos padrões disponíveis, podemos criar nossos próprios formatos
também.

3
Se o seu sistema estiver rodando Windows em inglês com sistema decimal para “ponto”, este argumento é separado por ponto.
4
Em notação científica isso quer dizer que há 7 zeros antes do primeiro valor não-zero após a separação decimal. Em outras palavras,
0,0000000115740740740741.
5
Para obter esta formatação, utilize a categoria Personalizado é digite hh:mm:ss.000
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 9

Para acessar a janela de formatação vá até Formatar Æ Células e escolha a tabulação Número.
A figura abaixo mostra a caixa de formatação do Excel:

Figura 2-3

Se procurarmos na categoria Hora, por exemplo, veremos que a formatação para 23:59:59,999
não existe. Porém o fato deste formato não existir na categoria apropriada não significa que a
formatação seja inviável ou impossível de se criar. Para criar este formato selecione a categoria
Personalizado e digite o seguinte hh:mm:ss,000

Observe que utilizamos o ponto para separar os milésimos de segundos. Se você tentar utilizar os
dois pontos o Excel irá ignorar as últimas três casas.

Anteriormente foi salientado que o Excel automaticamente formata datas e horas entradas em
formatos reconhecíveis como datas e horas. Não confunda formatação com formato. A formatação
diz respeito à parte visual ao passo que o formato diz respeito ou tipo de dado na célula.
Infelizmente, a maneira como decidiram definir estes dois tipos distintos não nos ajuda muito.
Formato virou sinônimo de formatação e vice-versa.

Para exemplificar, vamos pegar o assunto discutido no tópico


http://www.juliobattisti.com.br/forum/topic.asp?TOPIC_ID=946 do fórum Excel Avançado.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
10 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

A pergunta era como digitar um valor e o Excel passar este valor para 13:00:00. Observe que
estamos falando de formatação. Se você digitar o número 130000 em uma célula o Excel
interpreta como sendo 130000 dias completos. Porém, podemos formatar este número da
seguinte forma:

00":"00":"00

O valor 130000 aparecerá na célula como sendo 13:00:00; porém embora a formatação mostre
um valor que a primeira vista parece hora, o formato do número digitado ainda é 130000. Em
outras palavras, 130000 não é a mesma coisa que 0,541666666666667 (a fração que representa
13:00:00) para o Excel.

Algumas formatações comumente utilizadas para horas são:

FORMATAÇÕES DE HORAS
h:mm
h:mm:ss
hh:mm
hh:mm:ss
mm:ss
[h]:mm:ss
Figura 2-4

A última formatação da lista permite que horas acima de 24 horas sejam visualizadas na célula.
Por exemplo, se temos 25 horas o visual não será 01:00:00, mas 25:00:00, lembrando sempre
que 25 não é o valor fisicamente na célula.

Quando o assunto é formatação de células (seja data, hora ou qualquer outro formato) o Excel
aceita uma pletora de combinações, basta utilizar a imaginação.

2.3. Subtraindo e somando horas

Resolvida a parte sobre como o Excel interpreta e formata datas e horas estamos prontos para
iniciar os cálculos.

No mesmo tópico há a dúvida sobre como subtrair 176:00:00 de 150:00:00. Aqui temos uma
situação interessante. Como foi dito várias vezes antes, não existe 176 horas ou 150 horas para o
Excel. O que existe são 176/24 e 150/24 (7,33 dias e 6,25 dias respectivamente). Novamente, o
que ocorre é que podemos formatar 7,33 para mostrar 176:00:00 ou até mesmo digitar o valor 176
(o qual representaria 176 dias e não 176 horas).

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 11

Para mostrar o número total de horas, basta utilizar o seguinte formato: [h]:mm:ss. Os colchetes
instruem o Excel a mostrar o somatório das horas ao invés da fração do primeiro dia fracionado.

Ao tentar subtrair 176 horas de 150 horas o valor retornado é negativo. No sistema de datas 1900
isso não é válido. Ao modificar para o sistema 1904 é possível subtrair uma hora maior de uma
menor. Neste caso específico ao efetuarmos a subtração 150–176 obtemos –26 horas. Se os
valores se encontram neste formato a outra opção e envelopar a subtração na função ABS:

=ABS(150:00:00-176:00:00)

Novamente, embora a formatação mostre claramente as 26 horas, este não é o valor efetivamente
utilizado pelo Excel para efetuar os cálculos. Observe, contudo, que você poderia ter
simplesmente feito a seguinte conta:

=176:00:00-150:00:00

Para obter 26 horas sem a necessidade de complicar o problema.

A função ABS funciona bem neste exemplo porque não estamos preocupados com a direção das
horas. Veja que ao declarar 176 horas estamos dizendo ao Excel que este valor equivale a 7,33
dias.

Imagine uma pessoa que trabalha no turno da noite em um supermercado. Se esta pessoa inicia o
trabalho às 21 horas e sai às 5 horas da manhã do dia seguinte, a direção da contagem das horas
começa a fazer uma diferença. Como queremos saber o número de horas trabalhadas entre o
horário de entrada e saída, efetuaríamos o seguinte cálculo:

=05:00:00-21:00:00

Ao efetuar este cálculo obtemos um erro, pois o resultado é negativo e o sistema 1900 não
suporta valores negativos. Ao utilizarmos a função ABS para envelopar a diferença, obtemos um
resultado; porém, incorreto. Veja que ao passar o resultado para valor absoluto, a diferença é
invertida (21-5=16). Mas sabemos que das 9PM às 00:00AM existem 3 horas e das 00:00AM às
05:00AM existem 5 horas, totalizando 8horas trabalhadas. Então, como resolver este problema?

A figura abaixo mostra dois métodos para resolver a questão:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
12 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Figura 2-5

No primeiro exemplo, estamos avaliando se a condição é verdadeira ou falsa. Se for falsa ela
retorna o valor na célula B1 e a subtração B1-A1 é feita sem problemas. Se for verdadeira, o Excel
retorna B1+1 e a subtração efetuada (B1+1)-A1, retornando o número correto de horas
trabalhadas entre os dois períodos. Neste último caso, estamos acrescentando 24 horas para que
o resultado leve em conta a mudança de um dia para o outro.

Pare um segundo para avaliar o que esta ocorrendo aqui... Parou? Pensou? Entendeu? Agora,
imagine que esta pessoa iniciou o trabalho no dia 01/07/2004 às 21:00:00 e saiu do trabalho no
dia 02/07/2004 às 5 da matina. Todos os cartões de ponto que já vi em Excel, o formato é o
seguinte:

Figura 2-6

A fórmula funciona que é uma maravilha, pois a pessoa entrou num dia e saiu no outro. Como
poucas pessoas trabalham mais de 24 horas sem parar, o método acima não apresenta
problemas, mas se você precisa avaliar o número de horas que uma máquina ficou em
funcionamento, por exemplo, você tem que ajustar a fórmula para levar em conta o número de
dias, pois a diferença será negativa. Imagine, então, que a máquina começou a rodar às 21:00:00
do dia 01/07/04 e somente parou no dia 04/07/04 às 05:00:00.

Utilizar a função MOD não resolve pois ela retorna o resultado dentro das primeiras 24 horas. A
solução é adaptar o exemplo utilizando a função SE, como segue:

=SE(C3<B2;C3+3;C3)-B2

Como a máquina rodou o dia todo nos dias 2 e 3/07/04 mais as três horas do primeiro dia e mais
cinco horas do quarto dia, temos um total de horas de: 3+24+24+5, isto é, 56 horas rodando sem
parar. O valor verdadeiro precisa ser adicionado a três, pois 1 é para as primeiras 24 horas e 2
para os dois dias rodados por completo.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 13

Figura 2-7

Se você realmente “parou”, “pensou” e “entendeu”, você deve ter notado que esse monte de
fórmulas é completamente loucura! Por quê? Simples, muito simples. Imagine se você tivesse que
adaptar sua fórmula toda vez que houvesse este tipo de variação nas datas!?

A menos que você tenha uma excelente razão para separar a data das horas, coloque tudo junto!
Veja o exemplo abaixo:

Figura 2-8

Como a data e as horas são entradas na mesma célula ao efetuar as diferenças é desnecessário
aquele monte de fórmulas espalhafatosas que vocês devem ver por aí e até mesmo as fórmulas
mostradas anteriormente.

É bem provável que você tenha gostado do método apresentado, mas tenho certeza que você dirá
que mesmo assim precisa da data separadamente.

Lembra das formatações anteriores? Pois bem, podemos utilizá-las para eliminar a data no
exemplo acima e em outra célula utilizar os mesmos valores na formatação de datas:

Figura 2-9

Aqui, a célula A2 é igual a célula B2 e a célula A3 é igual a célula C2. As células B2 e C3 contêm a
data e horas dos dias em questão, porém ambas estão formatadas para mostrar apenas as horas.
Já a coluna A está formatada para mostrar apenas a data. Não obstante, os valores efetivamente

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
14 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

nas células cotinuam sendo 01/07/04 21:00:00 e 04/07/2004 05:00:00 em todas as quatro
células.

Uma maneira simples, limpa, elegante e eficaz de resolver o problema.

A próxima pergunta óbvia sobre este método é ter que digitar 01/07/2004 21:00:00 na célula em
questão, mas se estamos interessados em saber a data e hora neste exato momento podemos
utilizar o VBA junto com a função Agora (que em VBA é a função Now) para fazer isso e não
perdemos tempo com longas digitações de datas.

Estaremos vendo como executar tal procedimento quando tocarmos em VBA mais adiante.

Se subtrair é um pouco complicado, somar é bem mais descomplicado. Como o Excel


automaticamente formata as horas para hh:mm:ss, quem já tentou somar horas descobriu que o
somatório aparece “errado”. Na verdade, ele não está errado. O formato está correto, mas a
formatação que possibilita tal visualização é que está incorreta.

Como vimos nos exemplo anteriores, para mostrar horas acima de 24 horas com a visualização
que esperamos basta colocar a parte referente às horas (h) entre colchetes. O exemplo da
subtração de horas faz exatamente isso, caso contrário, o valor visual da célula seria diferente.

Dito isso, o somatório de horas passa a ser uma tarefa bem fácil, como mostra a figura abaixo:

Figura 2-10

Todas as horas vistas nesta parte referem-se as horas inteiras. Se você utilizar a função de
planilha Agora o Excel colocará a data, hora, minutos e segundos na célula selecionada. Contudo,
talvez não seja bem isso que você queira fazer.

Se você coleta informações sobre carros que entram e saem da garagem de seu edifício, é
provável que tal precisão seja necessária. Mas, e se estamos avaliando um cartão de ponto?

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 15

Neste caso, é presumível que você queira trabalhar com horas inteiras ou no máximo frações de
horas, como a cada 15 ou 30 minutos.

Vamos supor que a máquina do exemplo anterior iniciou o funcionamento de acordo com a figura
abaixo:

Figura 2-11

Em apenas um dia a máquina iniciou no minuto cravado. Todos os outros dias ela inicia em uma
fração de segundo qualquer. Neste exemplo, você deseja arredondar para o minuto mais próximo.
Com isso quero dizer que você deixará o Excel decidir se o arredondamento é para cima ou para
baixo, tudo que fazemos é dar ao Excel os parâmetros para avaliação.

Como todos nós sabemos, o dia tem 24 horas e em 24 horas temos 1.440 minutos
(24horas*60minutos). Com esta informação fica fácil avaliar o problema. Se multiplicarmos os
valores observados na coluna A pelo número de minutos em um dia, estamos efetivamente
movendo a fração referente aos minutos para a esquerda do decimal. Se arredondarmos este
valor para zero casas decimais, estamos arredondando os segundos para cima ou para baixo. O
resultado precisa, então, ser divido por 1.440 para retorná-lo para a base correta:

Figura 2-12

Feito o arredondamento para o minuto, para arredondar para os 15 ou 30 minutos fica fácil. Se
observamos 1.440 minutos em um dia o número de vezes que 15 minutos ocorre em um dia é
1.440/15 ou 96 vezes em um dia. Da mesma forma, 30 minutos ocorre 1.440/30 vezes ao dia (48
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
16 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

vezes). Por analogia, podemos expandir o conceito para qualquer outro tipo de arredondamento,
por exemplo, 5 minutos ou 10 minutos.

A figura abaixo mostra o arredondamento da figura anterior para 15 e 30 minutos:

Figura 2-13

Retornaremos aos arredondamentos quando analisarmos a entrada automática de datas e horas


utilizando VBA.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 17

3. Funções relacionadas a datas e horas


Além da flexibilidade do número serial representando datas e horas que possibilitam cálculos, o
Excel também possui várias funções para manipulação de datas e horas.

Sob a categoria “data e hora” temos as funções explícitas. Sob outras categorias temos funções
implícitas. Com isso quero dizer que no primeiro caso você escolhe uma função que trabalha com
data ou hora e cria a sua fórmula diretamente. No segundo caso, você utiliza uma função qualquer
para manipular uma data ou hora com o objetivo de obter um outro resultado que pode ser
numérico ou não.

No primeiro tópico deste ebook foi mostrado extamente isso:

=TEXTO(DIA.DA.SEMANA(D1);"dddd")

Neste exemplo, temos a função explícita DIA.DA.SEMANA e a função implícita TEXTO. A primeira
retorna o dia da semana ao passo que a segunda converte o valor numérico para um texto cujo
formato é “dddd”, o qual é um formato reconhecido para datas.

Iniciaremos com uma lista das funções relacionadas à datas e horas.

FUNÇÕES DE DATAS E HORAS


Nome da função Descrição
AGORA Retorna a data e hora atual do sistema
ANO Retorna o ano dado o número de série de uma data qualquer
Retorna o número de série que representa uma data tendo em vista
DATA
o dia, mês e ano
DATA.VALOR Retorna o número serial de um texto que representa uma data
DIA Retorna o dia do mês data um número serial de data
DIA.DA.SEMANA Retorna o número referente ao um dia da semana
Retorna o número de dias entre duas datas com base em um ano de
DIAS360
360 dias
DIATRABALHO Retorna a data futura, dado um número de dias úteis e data atual.
Retorna o número de dias úteis entre duas datas. A função aceita a
DIATRABALHOTOTAL
inclusão do número serial referente aos feriados entre as datas.
Retorna o número serial do último dia útil do mês dados um número
FIMMÊS
de meses.
Retorna o número de anos entre duas datas. Valor retornado pode
FRAÇÃOANO
ser um número inteiro ou decimal dependendo da base utilizada
HOJE Retorna a data atual do sistema
HORA Retorna a hora atual do sistema
Retorna o número referente a um mês qualquer (de 1 a 12) dado um
MÊS
número serial referente a uma data qualquer
Retorna o número de minutos dado o número serial que represente
MINUTO
uma hora qualquer
Retorna o número da semana dado o número serial de uma data
NÚMSEMANA
qualquer
Retorna o número de segundos dado o número serial que
SEGUNDO
represente uma hora qualquer
Converte números que representam horas, minutos e segundo em
TEMPO
um número serial referente a hora

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
18 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

FUNÇÕES DE DATAS E HORAS (Continuação)


Nome da função Descrição
Transforma um valor texto representando uma hora em um número
VALOR.TEMPO
serial que representa uma hora qualquer
Figura 3-1

Iremos iniciar com as funções que não requerem argumentos. As funções que não necessitam de
argumentos são AGORA e HOJE. Ao digitar:

=HOJE()

O Excel retorna a data corrente do sistema. A função AGORA funciona da mesma maneira, porém
ela não somente retorna a data como a hora do sistema. Estas duas funções são chamadas de
voláteis, pois o resultado é modificado toda vez que a planilha é recalculada. Se o recálculo de
sua planilha é manual, basta apertar F9 para forçar o recálculo da planilha.

Se você, no entanto, deseja inserir uma data estática pode-se utilizar o atalho de teclado para
fazer isso. Ao pressionar CTRL + ; simultaneamente em uma célula a data atual é inserida na
célula. Para inserir o horário atual pressione CTRL + SHIFT + : simultaneamente.

Para inserir a data atual e o horário não há uma tecla de atalho para efetuar esta combinação
Contudo, isto pode ser facilmente feito da seguinte forma: aperte CTRL + ; para inserir a data,
dê um espaço e aperte CTRL + SHIFT + : para inserir a hora. Isso é possível porque ao
entrarmos a data através do atalho o Excel entra em modo de edição na célula ativa.

Este método pode ser empregado para inserir a data e horas discutidas no tópico 2.3 acima, sem
perdermos tempo digitando barras para separar a data e dois pontos para separar horas, minutos
ou segundos.

No tópico http://www.juliobattisti.com.br/forum/topic.asp?TOPIC_ID=1221 foi discutido como se


colocar a primeira letra do mês em maiúsculo. Uma solução óbvia é simplesmente escrever no
nome do mês e pronto. Porém, se você está utilizando a função HOJE para retornar a data atual
esta não é uma solução, pois o formato para o mês é minúsculo. Como este valor vem do sistema,
a formatação para Mmmm não adiantará.

Neste caso precisamos criar uma fórmula que combine a função HOJE e outra qualquer para
passar a primeira letra do mês para maiúscula. A função PRI.MAIÚSCULA transforma a primeira
letra de um texto qualquer em maiúscula. Porém, sabemos que data não é texto; portanto,
precisamos de uma outra função para transformar o número em texto. Aqui entra em cena a
função TEXTO. A solução do problema através de uma fórmula é dada por:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 19

=PRI.MAIÚSCULA(TEXTO(HOJE();"mmmm"))

O valor numérico HOJE é convertido para o texto referente ao mês e este texto passa a ter a
primeira letra maiúscula. Observe que poderíamos utilizar esta mesma fórmula para retornar o dia
da semana. Neste caso, basta formatar o texto para "dddd".

A próxima função em nossa lista é a ANO. Esta função retorna o ano data um número serial
qualquer. Vamos supor que desejamos avaliar o número 38.169. Em termos de data este valor
não nos diz nada (embora possamos formatá-lo para data e ver o ano ao qual ele se refere),
utilizando a função ANO podemos quebrar a data para o valor serial do ano em questão:

=ANO(38169)

Este valor refere-se à 01/07/2004 e o número serial para o ano é 2004. Uma utilidade desta
função é que podemos separar o ano e acrescentar anos a um ano base qualquer. Vamos supor
que o ano base é 1900, ao adicionarmos 1 o ano passa a ser 1901 e assim sucessivamente. Pode
parecer que estou dizendo o óbvio, mas muitos esquecem que a cada quatro anos temos um dia a
mais em nosso calendário, portanto, não basta apenas somar o número de dias no ano, você
precisa somar o valor correto para retornar a posição correta dentro de um ano. O próximo
exemplo mostra exatamente isso.

Uma das principais utilidades da função DATA é concatenar o dia, o mês e o ano. Vamos supor
que você possui o dia em uma célula, o mês em outra e o ano em uma terceira célula:

Figura 3-2

A função DATA junta os três argumentos separados e retorna o número serial referente à
01/07/2004. O exemplo acima não parece muito útil ou a função, em sim, pode não parecer muito
útil, mas as aparências sempre enganam.

Vamos supor que você deseja incrementar a data em um ano. Neste caso, simplesmente somar
365 dias a data atual não adianta, pois temos o problema do ano bissexto.

E é aqui que a função DATA mostra a sua força. Supondo que a data base esta na célula A1, a
fórmula ficaria:

=DATA(ANO(A1)+1;MÊS(A1);DIA(A1))

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
20 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Eu discuti este mesmo assunto no tópico


http://www.juliobattisti.com.br/forum/topic.asp?TOPIC_ID=1663 do fórum de Excel básico.

Aqui, utilizamos a função ANO para adicionar um ano à data inicial. Os argumentos MÊS e DIA são
retornados pelas funções MÊS e DIA, respectivamente.

Por analogia, podemos criar datas no futuro utilizando a função DATA. Vamos imaginar que ao
invés de 1 ano, desejamos acrescentar 3 meses. O que você faria neste caso? Novamente,
adicionar 90 dias não adianta, pois encontraremos meses com 28 (29), 30 e 31 dias. Neste caso,
basta adaptar a fórmula acima. Supondo que a data original está na célula A1, temos:

=DATA(ANO(A1);MÊS(A1)+3;(DIA(A1)))

A função retorna exatamente 3 meses no futuro, mesmo sabendo que julho e agosto possuem 31
dias ao passo que setembro possui 30. A única maneira de retornar os 3 meses no futuro através
de adição seria somar a data na célula A1 a 92 dias, o que seria uma perda de tempo se
precisamos ficar contando o número de dias entre datas!

E os dias? Neste caso a solução é muito mais simples. Se o que desejamos é adicionar n-dias à
data atual, simplesmente adicione n-dias a data atual. Por exemplo, se você deseja adicionar 600
dias à data atual, o problema do ano bissexto (se ele acontece neste período) é irrelevante, pois
você deseja somar 600 dias e ponto final.

Além do método utilizado acima para preencher datas futuras o Excel possui um atalho que faz
exatamente isso. A única diferença é que este atalho retorna valores estáticos ao invés de uma
fórmula. No exemplo anterior temos uma data na célula A1, observe a figura abaixo:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 21

Figura 3-3

É comum expandirmos uma fórmula selecionando o pequeno quadrado no canto inferior direito da
célula ativa com o botão esquerdo do mouse. Não obstante, ao utilizar o botão direito do mouse
para fazer a mesma coisa uma categoria diferente de menu de atalho é aberta. Se o valor sendo
copiado é uma data, temos várias opções de como expandir a data inicial. O resultado final é o
mesmo que os exemplos anteriores se os parâmetros sendo avaliados são os mesmos.

As utilidades da função DATA não param aqui. Avaliamos o dia 01/07/2004 de várias maneiras,
mas você sabe qual dia do ano esta data representa? A primeira solução que nos vem à cabeça é
subtrair esta data do último dia do ano anterior (31/12/2003). Como 01/07/2004 é maior do que
31/12/2004, a diferença entre os dois é o número de dias decorridos entre 31/12/2004 e
01/07/2004.

Observe que na fórmula desejamos fazer exatamente a mesma coisa, a diferença é que no caso
acima estamos sendo explícitos no que desejamos. Portanto, se a data continua na célula A1, a
diferença entre as duas datas ficaria:

=A1-DATA(ANO(A1);1;0)

O último argumento, referente ao dia, é zero. Se você ainda lembra o que foi dito sobre a data
serial zero, você entenderá o por quê. Como ainda não foram completadas as primeiras 24 horas,
ainda não chegamos ao primeiro dia do ano, assim como não chegamos ao 01/01/1900 até

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
22 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

completarmos as primeiras 24 horas do dia; portanto a data é um dia antes do dia inicial da
contagem.

E se desejamos saber quantos dias faltam para final de ano? Neste caso a solução é bem mais
simples, pois sabemos que o último dia do ano é 31/12/ANO. Assim sendo, a diferença é dada
por:

=DATA(ANO(A1);12;31)-A1

Como o ano é a única variável que precisamos avaliar, basta apenas definir o ano como sendo o
ano da data sendo avaliada. Infelizmente, como estamos lidando com datas o Excel
automaticamente formatará a célula para a data padrão do sistema. Ao resolver o problema
formate a célula para mostrar o número inteiro.

Agora, pare e avalie a fórmula =(A1-DATA(ANO(A1);1;0). Ela te diz algo? A princípio pode ser
que não, mas o que nós efetivamente fizemos foi calcular o último dia do mês e depois subtrair
este valor da data atual.

O Excel possui uma função que faz isso. A função FIMMÊS calcula o último dia de qualquer mês o
problema é que esta função somente estará disponível se o suplemento de análise estiver
instalado. Neste caso, o cálculo pode ser facilmente efetuado:

=FIMMÊS(A1;0)

O argumento 0 indica que a função avaliará o último dia do mês contido na célula A1.

Mas se este não for o seu caso ou se você estiver enviando uma pasta de trabalho para alguém
que não possua tal função, podemos utilizar a função DATA para resolver isso:

=DATA(ANO(A1);MÊS(A1)+1;0)

Um mês é acrescentado à data e, então, avaliamos o dia 0, isto é, 24 horas antes de se chegar ao
primeiro dia do mês seguinte (Mês + 1). Vinte e quatro horas antes do primeiro dia de qualquer
mês é o último dia do mês anterior.

Calculado o dia do ano, quantos dias faltam para acabar o ano e o último dia do mês, somente
nos falta calcular o número da semana. Para calcular o número da semana podemos novamente
recorrer a função DATA. Contudo o Excel possui a função NÚMSEMANA e não precisamos criar uma
fórmula mirabolante para isso:

=NÚMSEMANA(A1)
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 23

Retorna o número da semana na célula A1. Neste caso, o número da semana é 27.

A função DATA.VALOR, diferentemente das funções anteriores não recebe como argumento um
número referente a uma data. O argumento desta função é um texto que representa (ou pode
representar uma data). Vamos supor que em uma célula você tenha o seguinte texto 4 julho
20046. Aqui, podemos utilizar a função DATA.VALOR para retornar o número serial referente a este
texto:

=DATA.VALOR("4 julho 2004")

As aspas indicam que o argumento da função é um texto. Novamente, o leitor deve estar se
perguntando qual a utilidade desta função. Afinal, se você digitar 4 julho 2004 em um célula o
Excel reconhece como data, por quê perder tempo com tal função? Para aqueles que
regularmente importam dados de banco de dados para o Excel, vocês já devem ter notado que
dependendo do formato no BD, o Excel retorna um texto para data ou inverte a data, pois os
sistemas de datas são diferentes (se você utiliza datas no formato utilizado nos EUA, ie
mês/dia/ano, você já deve ter notado que isso pode causar problemas, da mesma forma que o
sistema decimal pode causar a mesma dor de cabeça). Se você se encontra numa situação como
esta e não deseja perder tempo corrigindo uma data que eventualmente será re-importada e
apresentará o mesmo problema, simplesmente transforme a data!

Mas antes de considerar a função DATA.VALOR como uma panacéia para todos os males gerados
por dados mal importados ou informações que, na sua opinião, são datas, lembre-se que esta
função somente retornará um número serial se o formato do texto realmente for um formato
reconhecido e válido como data.

A função DIAS/360 retorna o número de dias entre duas datas utilizando o sistema ACT/360, isto
é, ela considera que o ano possui 12 meses de 30 dias cada. Pode parecer uma simplificação
sem pé nem cabeça, mas se você trabalha na área financeira ou estou administração é provável
que você já tenha cruzado com este sistema em algum ponto. A função recebe três argumentos:
data inicial, data final e o tipo (americano ou europeu).

Ao utilizar os tipos você notará que os resultados são, em cerca de 97% das vezes, iguais. Isto
ocorrerá nos meses de 31 dias. Por exemplo:

6
Se você digitar esta data em uma célula qualquer do Excel, ele a considerará como sendo data, pois este formato é reconhecido
como data. É esta característica que permite a função DATA.VALOR reconhecer o texto como uma data. Para se assegurar que o que
for digitado é texto, digite o apóstrofo (‘) antes de entrar a data.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
24 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Figura 3-4

Finalmente, temos três funções relacionadas com tempo: MINUTO, SEGUNDO e TEMPO. Iniciaremos
pela última função.

A última função recebe três argumentos: hora, minutos e segundos. Na verdade, ela é a versão
para horas da função DATA. Vamos supor que estamos avaliando o seguinte:

=TEMPO(23;90;120)

O resultado é avaliado da direita para a esquerda. Como 120 segundos formam 2 minutos, este
valor é somado aos minutos, formando 92 minutos (zero segundo). Como 92 minutos representam
1 hora e 32 minutos, uma hora é acrescentada às 23 horas. O resultado final é, portanto 32
minutos do dia seguinte.

O que precisamos ficar atento é que este valor é uma fração de horas e não é a mesma coisa que
24 horas mais 32 minutos. O resultado é a fração de minutos no dia, isto é, 32/1.440 ou 0,02222...

A função MINUTO recebe como argumento um número serial que representa minutos. Por
exemplo:

=MINUTO(176/1440)

Aqui, estamos avaliando 176 minutos dentro de um dia. O resultado em minutos é 56 porque
temos 176 minutos menos as duas horas completas (120 minutos). Se o número serial for 1;
então, o número de minutos é zero.

Por último temos a função SEGUNDO. Assim como a função minuto ela avalia uma fração de minuto
e passará para zero todos os segundos que completam um minuto e retornará apenas a
diferença:

=SEGUNDO(450/86400)

O resultado é 30 segundos, pois temos 7 minutos completos (420 segundos dividido por 60).

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 25

Antes de terminar esta parte, acredito que alguns de vocês devem estar se perguntando sobre o
tal ano bissexto. Afinal, efetuamos cálculos que levam em consideração tal ano. Mas como
sabemos se um ano é bissexto ou não? Em Excel isso é simples, basta criar uma fórmula.

Contudo, deixaremos isso para a parte de VBA. Em VBA criaremos uma função booleana para
fazer isso e a compararemos com uma fórmula de planilha.

No material desenvolvido no VBA avaliaremos todos os anos válidos no Excel, isto é, do ano 1900
ao ano 9999.

3.1. Funções especiais para o cálculo com datas

Algumas das funções listadas anteriormente somente estarão disponíveis se você instalar o
suplemento de análise de dados. Para inserir o suplemento de análise de dados vá até
Ferramentas Æ Suplementos e selecione o suplemento de análise de dados.

No tópico anterior, introduzi as funções FIMMÊS e NÚMSEMANA. Além destas funções, temos mais
três funções DIATRABALHO, DIATRABALHOTOTAL e FRAÇÃOANO. A primeira função retorna uma data
no futuro dado um número de dias úteis entrados como argumento. Por exemplo, se hoje é dia
01/07/04 dez dias úteis no futuro será o dia 15/07/04. Neste caso, teríamos:

=DIATRABALHO("01/07/2004";10)

Esta função é útil quando temos um deadline para entregar um trabalho. Neste caso, se o prazo
de entrega é de 10 dias úteis, podemos facilmente calcular quando o trabalho deve ser entregue.
Já a função DIATRABALHOTOTAL refere-se ao número total de dias úteis trabalhados entre duas
datas.

No caso anterior sabemos que o prazo para entrega é dia 15/07/04 (10 dias úteis). Vamos supor
que o projeto foi entregue no dia 20/07/04. Aqui, o total de dias úteis foi de:

=DIATRABALHOTOTAL("01 julho 2004";"20 julho 2004")

Ou seja, 14 dias úteis depois estávamos entregando o projeto. No exemplo, utilizei apenas os dois
primeiros argumentos da função. O terceiro argumento refere-se aos feriados. O erro mais comum
é a inserção do número de feriados entre as duas datas, isto é, se há dois feriados o usuário digita
2 para o argumento. Infelizmente, não é esta a lógica utilizada pela função. Para que a função
avalie os feriados precisamos entrar o número serial referente ao feriado ou todos os feriados
entre as duas datas.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
26 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Como a função trabalha com uma matriz neste argumento, não podemos separá-los por ponto-e-
vírgula como fazemos em outras funções. Para resolver este dilema, podemos utilizar dois
métodos: 1) utilizar um nome que represente o intervalo contendo a matriz com todos os feriados
ou 2) utilizar a representação do intervalo.

Como um exemplo, vamos supor que entre 01/06/2004 e 10/07/2004 observamos 10 feriados em
dias que, do contrário, seriam úteis. A data inicial encontra-se na célula A2 e a data final na célula
B2. A matriz dos feriados encontra-se no intervalo F2:F11.

Utilizando um nome para representar a matriz teríamos:

Figura 3-5

Por outro lado, poderíamos utilizar o intervalo para fazer a mesma coisa:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 27

Figura 3-6

A vantagem do nome é que podemos criar um intervalo não contínuo, isto é, se as datas que
representam os feriados estão em células disjuntas; então, podemos criar um conjunto,
representado pelo nome, que conterá todos os feriados.

Finalmente, a função FRAÇÃOANO retorna a fração de um número de anos entre duas datas.
Quando utilizamos esta função nos encontramos em uma situação simular a das famigeradas 25
horas. Em outras palavras, se iniciarmos a contagem no número serial 0 (00/01/1900) o primeiro
ano é formado 366 dias depois (embora não seja bissexto, este possui o dia 29/02/1900) e daqui
em diante o número de dias e meses representarão a fração do ano seguinte e assim por diante.

Vamos supor que desejamos saber quanto tempo se passou em 15/05/2000 e 27/05/2004 em
anos e frações. O cálculo pode ser facilmente efetuado da seguinte forma:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
28 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Figura 3-7

Entre a duas datas há uma diferença de 4 anos e 2 dias. Como a base foi deixada em branco, a
função assume a base ANO/360 (12 meses de 30 dias cada). Isto quer dizer que a parte decimal
do resultado é igual a 360 vezes o valor deste decimal, isto é 360*0,0333. Como estamos falando
de fração, para obter o resultado preciso basta multiplicar pela fração que representa a dízima
0,0333...

Se você estiver na dúvida sobre qual fração representa tal dízima, uma dica é usar uma fração
que conhecemos e que retorna um valor similar. Neste caso, uma fração bem conhecida é 1/3 que
resulta na dízima periódica 0,333... Basta, então, proporcionar e obteremos 1/30 que representará
a dízima periódica 0,03333... Multiplique 360*1/30 e você obtém exatamente 12 dias.

3.2. A função DATADIF

A inclusão desta função neste curso foi uma decisão de última hora. A decisão partiu após as
discussões do tópico http://www.juliobattisti.com.br/forum/topic.asp?TOPIC_ID=1701

Infelizmente, o Ajuda do Excel não fornece informações sobre esta função e se você realmente
deseja utilizá-la há apenas algumas saídas: 1) conversar com alguém que trabalhe com Lotus 1-2-
3 e utilize a função ou 2) procurar pela Internet maiores informações. Em todas as versões do
Excel que tenho (2000, 2002 e 2003) a única que contém uma referência é o Excel 2000.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 29

Contudo, esta versão é em inglês e não tenho certeza se a versão em português tem algo sobre
tal função.

Aqui, darei uma breve introdução a e como ela opera (felizmente, ainda trabalho com o Lotus 1-2-
3). Abaixo encontra a lista dos tipos retornados pela função:

Tipo Descrição
“Y” Retorna o número de anos completos entre duas datas
“YM” Retorna o número do mês (entre 0 e 12) entre duas datas
“YD” Retorna o número de dias (entre 0 e n-dias) entre duas datas
“M” Retorna o número de meses (entre 0 e n-meses) entre duas datas
“MD” Retorna o número de dias entre duas datas (entre 0 e 30 dias)
“D” Retorna o número de dias entre duas datas (entre 0 e n-dias)
Figura 3-8

A função foi traduzida para o português, mas o tipo permaneceu em inglês (Y=year (anos),
M=month (mês) e D=day (dia)).

A figura abaixo mostra como os diferentes tipos são utilizados nos cálculos:

Figura 3-9

Há várias formas de se ler os resultados. Por exemplo, se lermos as colunas C, D e G para obter
o resultado na coluna H, teríamos que efetuar os seguintes cálculos:

Figura 3-10

Na pasta de trabalho referente a este tópico há o cálculo para as quatro diferenças. Obviamente
que esta é apenas uma das formas de leitura dos resultados.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
30 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

No exemplo que dei acima, a data inicial (linha 3) refere-se a data de meu nascimento e a data
final refere-se ao dia em que estava escrevendo este tópico. A única coisa que me interessava
saber era quantos dias haviam passados entre o meu nascimento hoje (09/07/2004). Mas é claro
que no mesmo cálculo você saberá que tenho 31 anos, 7 meses e 27 dias de vida, bastando
apenas ler as colunas corretas.

Se você deseja criar um relógio da vida no Excel para saber todos os dias a sua idade (toda vez
que você abrir o Excel), podemos juntar as três colunas na clássica mega-fórmula:

=DATADIF(A1;AGORA();"y") & " anos, " & DATADIF(A1;AGORA();"ym") & " meses e " &
DATADIF(A1;AGORA();"md") & " dias"

Figura 3-11

Diferentemente do método que utilizei anteriormente, aqui eu concateno com o ampersand (&) as
palavras anos, meses e dias. No caso anterior, para evitar a transformação dos valores para texto,
utilizei a formatação para mostrar as palavras. Ao escrever estas linhas (10/07/2004), o Excel
acabava de me lembrar que mais um dia havia se passado em minha vida (figura acima).

É interessante observar que o formato para o ano tem um resultado similar a função FRAÇÃOANO.
Como esta função retorna uma fração do ano, podemos utilizar este conhecimento para calcular a
idade de uma pessoa, por exemplo. Não obstante, precisamos adaptar a fórmula para obter o
resultado correto:

=INT(FRAÇÃOANO(A3;AGORA()))

Aqui, INT é uma função que retorna um número inteiro (arredondado para baixo) a partir de uma
fração qualquer. Neste caso, esta fração qualquer é a diferença entre a função AGORA e a data
inicial. O resultado final:

Figura 3-12

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 31

Novamente, ao invés de utilizar a concatenação, utilizo a formatação personalizada 00 "ano(s)"


para que o número seja acompanhado do texto. Ao fazer isso, o formato do número não é
modificado para texto como o anterior e cálculos são possíveis.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
32 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

4. Datas, horas e mega-fórmulas


Até agora vimos vários aspectos de datas e horas. Em cada exemplo a complexidade foi se
modificando até chegarmos à figura Figura 3-11. Aqui, temos o primeiro gosto do que pode ser
considerado uma mega-fórmula.

Mega-fórmula não foi uma expressão inventada por mim; contudo, todos aqueles que usam Excel
e têm certa experiência com o ambiente já devem ter visto ou construído algo que possa levar tal
rótulo. Mega-fórmulas são comumente encontradas em fórmulas condicionais (como fórmulas que
utilizam a função SE), mas não estão restritas a esta categoria. Pelo contrário, quando o assunto é
datas/horas você pode se encontrar num beco sem saída, onde a única solução pode ser virar o
homem-aranha e subir pelas paredes em desespero.

Mas como estamos falando de Excel, subir pelas paredes não é uma opção ou solução. Portanto,
precisamos colocar a imaginação para funcionar e criar... Em muitos casos, tal criação resultará
em mega-fórmulas.

Iniciaremos com fórmulas curtas e desenvolveremos até as fórmulas mais complexas. A primeira
fórmula que analisaremos é uma conversão de um texto para data. Vamos supor que você está
trabalhando com um planilha onde as datas estão no formato americano (mm/dd/aaaa). Ao
importar os dados, você descobre que a data é considerada como texto pelo Excel.

Uma solução seria converter tudo manualmente e jogar na planilha novamente, mas como você
terá que importar (atualizar) os dados no futuro, esta solução se tornará inviável, pois a perda de
tempo será enorme. A figura abaixo mostra um curto exemplo:

Figura 4-1

Aqui, as datas são 25/01/2004, 12/11/2003, 31/03/200 e 28/02/2003. No formato americano, em


termos de datas, estes valores não nos dizem nada. Apenas os vemos como números que podem
representar uma data. Mas como sabemos que eles realmente representam datas, precisamos
convertê-los para que eles tenham significado e posso ser utilizados para cálculos na planilha.

A nossa primeira mega-fórmula resolve o problema da seguinte forma:

=DATA(DIREITA(A1;4);ESQUERDA(A1;1);EXT.TEXTO(A1;2;2))

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 33

Como a função DATA é composta pelos argumentos ANO, MÊS e DIA (nesta seqüência),
primeiramente extraímos o ano utilizando a função DIREITA (4 caracteres da direita), a seguir
extraímos o mês utilizando a função ESQUERDA (1 caractere da esquerda – embora o zero seja
visível, neste exemplo ele faz parte da formatação e não do formato no número efetivamente na
célula) e finalmente extraímos o dia, como sendo os dois caracteres do meio, utilizando a função
EXT.TEXTO. O resultado final da construção é um número serial que representa o dia/mês/ano na
coluna A:

Figura 4-2

Em nosso primeiro encontro com uma mega-formula já podemos ver que o resultado ficou bem
longo e quando não se encaixou na figura. Se você achou esta fórmula um pouco grande, respire
fundo porque este é apenas o início.

Se você trabalha no departamento financeiro de sua empresa e todo último dia útil do mês você
precisa fazer algum pagamento baseando-se em várias datas de vencimentos na coluna A, por
exemplo. Saber na marra qual o último dia útil do mês não é uma solução, afinal temos uma super
calculadora no Excel e funções que possibilitam fazer milagres.

Se o último dia do mês cai em um final de semana, o último dia último cairá em uma sexta-feira.
Tudo que precisamos saber é se este último dia é sábado ou domingo e subtrair o número de dias
de acordo com este resultado. Isto é, se for sábado subtraímos um dia e se for domingo
subtraímos dois dias.

A figura abaixo mostra a minha lógica por trás do cálculo:

Figura 4-3

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
34 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Utilizei quatro linhas para efetuar o cálculo. Mas estamos realmente interessados em uma única
fórmula que resolva nosso problema. Colocando todo o pensamento em uma única fórmula
teríamos:

Figura 4-4

Na fórmula acima, eu utilizo um recurso do Excel que, embora conhecido, é pouco utilizado
quando fórmulas grandes são adicionadas. Como o processo é quebrado em passos (achar último
dia útil, checar se é sábado e fazer uma coisa, checar se é domingo e fazer outra) eu utilizo
ALT+ENTER para quebrar cada passo em sua respectiva linha, evitando uma longa fórmula que
acaba impossibilitando a leitura e compreensão.

Um detalhe a ser observado é que o valor falso para a segunda condição SE é zero, pois qualquer
outro dia diferente de 6 e 7 é, obviamente, um dia útil. Na parte de VBA, construiremos uma
função para resolver o mesmo problema de forma mais limpa.

Vamos supor que você tenha um projeto que será iniciado no dia 01/08/04 e precisa ser entregue
antes do Natal (no máximo até o dia 23/12/04). Como não há orçamento para horas extras, você
saber quantos dias úteis voce terá até o final do ano. Uma solução básica é calcular o número de
dias úteis até o final do ano. Porém, você precisa saber qual o número de dias úteis em cada mês
a partir de agosto, pois há funcionários entrando de férias e você precisa alocar o tempo mais
eficientemente quanto houver menos pessoas trabalhando no projeto.

A figura abaixo mostra como construirei o cálculo:

Figura 4-5
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 35

A parte mais óbvia do cálculo é o uso da função DIATRABALHOTOTAL, pois estamos interessados
em saber o número de dias úteis para cada mês até o dia 23/12/2004.

A fórmula que entraremos na célula C6 será a seguinte:

=MÁXIMO(0;DIATRABALHOTOTAL(MÁXIMO(B6;$C$2);MÍNIMO(DATA(ANO(B6);MÊS(B6)+1;0);$C$3)))

A primeira função avaliará o valor máximo retornado pela função DIATRABALHOTOTAL e comparará
com o primeiro argumento, zero.

A função DIATRABALHOTOTAL avaliará a data inicial como sendo o máximo entre B6 e C2 (data
inicial). E a data final é o valor mínimo encontrado entre a data final do projeto em (23/12/2004) e
qualquer data no intervalo B6:B10. Feito este cálculo, a função MÁXIMO retornará o valor máximo
entre os dois argumentos avaliados:

Figura 4-6

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
36 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

5. Manipulando horas e datas no VBA


Chegou a hora, desculpem-me pelo trocadilho, de estudar horas e datas no VBA. Depois da
sabatinada sobre datas e horas em uma planilha, estudar datas e horas no VBA será um passeio
no parque.

O primeiro caso que estaremos avaliando é o ano bissexto discutido no tópico 3 acima. O que é o
ano bissexto? Uma descrição rudimentar do ano bissexto é simplesmente o ano que tem 366 dias,
onde fevereiro passa a ter 29 dias ao invés de 28.

E o que isso nos diz?

Talvez nada, se você ignorar o fato de um dia ter apenas 24 horas. Lembra-se de minha
insistência sobre não existir 25 horas? Pois bem, 25 horas não existe para o Excel o que existe
são 24 horas (1 dia completo) mais 1 hora do dia seguinte. Agora, olhe novamente para o dia 29
de fevereiro e se pergunte o que ele significa no Excel.

Se o ano for bissexto, ele significa 29/02/ANO. Contudo, se o ano não for bissexto, o último dia do
mês de fevereiro é 28; portanto, ao dizer ao Excel que hoje é 29/02/2003 quando esta data nunca
existiu, o Excel somará um dia (24 horas) ao último dia de fevereiro e a data passa a ser
01/03/2003. Digite a data 01/02/2003 na célula A1 e entre a fórmula:

=DATA(ANO(A1),MÊS(A1),29)

O resultado é 01/03/2003 porque nunca existiu o dia 29/03/2003. O Excel simplemente somou
mais 24 horas ao último dia de fevereiro do ano 2003. Mais uma vez a peça do quebra-cabeça se
encaixa.

5.1. Resolvendo o ano bissexto

Acredito que a cada passo que damos neste eBook, o leitor deve entender a minha insistência
sobre as tais horas acima de 24 horas. O que quero deixar claro é que em termos de formatação
não há problema algum mostrar 25, 30, 1000 horas, ou o que seja (embora a formatação aceite
um máximo de 10.000 representadas visualmente), o problema é o número na célula, pois é este
que usamos para calcular as coisas!

Sabendo disso, podemos criar uma função que retorna se um ano é bissexto ou não.
Primeiramente, iremos avaliar uma data qualquer numa sub-rotina:

Sub teste()
Data = CDate("29/02/" & 2004)
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 37

Range("A1") = data
End Sub

Esta sub-rotina converte o que está entre parenteses para uma data e coloca a data na célula A1.
Como o ano de 2004 é bissexto, a sub-rotina roda sem problemas. Mude o ano para 2003, por
exemplo, e um erro ocorre, pois a data não existe.

Para criar nossa função faremos exatamente este teste. Observe que não precisamos de fórmulas
mirabolantes para isso, precisamos apenas forçar o erro e avaliar se o erro ocorreu ou não.

Assim sendo, uma solução programática para o nosso problema seria:

Function Bissexto(data As Date) As Boolean


On Error Resume Next
data = CDate("29/02/" & Year(data))
If Err = 0 Then
Bissexto = True
Else: Bissexto = False
End If
End Function

O On Error Resume Next assegura que se houver um erro a função rodará até o final. Depois,
basta avaliar se houve um erro ou não. Se não houve nenhum erro é porque o dia 29/02/ANO7 é
válido e, portanto, bissexto. Caso contrário, o ano não é bissexto.

A vantagem deste método sobre a fórmula? Simples, teste no ano de 1900 e veja o que acontece.
Este ano não foi bissexto, porém, a fórmula retorna como se fosse, pois na planilha o dia
29/02/1900 existiu. Faça o mesmo teste com a função acima e você obtém um resultado falso, isto
é, o ano não foi bissexto.

5.2. Criando uma função para calcular o último dia do mês

Como sabemos o suplemento de análise de dados nos fornece uma função para calcular o último
dia do mês.

O problema ao utilizarmos esta função é que ao enviar o arquivo para terceiros que não tenham o
suplemento instalado, no primeiro recálculo da planilha o resultado retornará um erro por não
conseguir encontrar a função. Uma solução é instruir a pessoa a instalar o suplemento e corrigir o
problema a outra é incluir no arquivo a nossa própria função para fazer isso.

7
A função YEAR utilizada na sub-rotina refere-se a função ANO na planilha. Ela retorna o ano dado um número serial de um data
qualquer (válida).
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
38 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Já vimos como calcular o fim do mês utilizando a função DATA e aqui faremos algo similar. Para
criar tal função não precisamos de mais de uma linha de código, na verdade, ela é exatamente
igual ao cálculo de planilha, mas desta vez estaremos utilizamos as funções em inglês:

Function fimDoMês(strData As Date, Optional nMeses As Integer) As Date


fimDoMês = DateSerial(Year(strData), Month(strData) + nMeses + 1, 0)
End Function

A função DATESERIAL faz a mesma coisa que a função DATA. Em seguida, utilizamos as funções
YEAR (ANO) e MONTH (MÊS) para retornar o número do ano e mês. O dia é simplesmente o dia 0 (o
dia anterior ao primeiro dia do mês sendo avaliado pela fórmula).

Para nMeses, utilizo Optional pois se este item for deixado em branco o cálculo é efetuado sobre
o mês da data selecionada. Esta função simula a função FIMMÊS:

Figura 5-1

Seguindo a mesma linha de raciocínio podemos criar uma função para retornar o último dia útil do
mês. Neste caso estaremos utilizando uma combinação de funções. Como o último dia útil do mês
cairá em um final de semana (duas possibilidade) ou em um dia de semana, precisamos saber
qual o último dia do mês (o qual criamos acima) e se este último dia é sábado ou domingo. Se for
sábado subtraímos um dia e se for domingo subtraímos dois dias do final do mês.

Embora eu tenha como criar tal função em apenas uma linha de código, estarei quebrando os
componentes do cálculo para facilitar a compreensão.

Vamo supor que segunda-feira seja o primeiro dia da semana. Se isto for verdadeiro, então
sábado é o sexto dia e domingo o sétimo dia.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 39

Como já sabemos calcular o dia da semana, basta utilizar este conhecimento para resolver o
problema. A função DIA.DA.SEMANA nos fornece três tipos para retorna do dia da semana e o
segundo é aquele que diz que sengunda-feira é o primeiro dia da semana. Sendo assim, basta
subtrair os cindo dias úteis anteriores destes dois valores para sábado e domingo para achar a
diferença entre o último dia do mês e o último dia últil do mês.

Talvez o último parágrafo tenha ficado confuso e um exemplo numérico deixará isso mais claro. O
mês de outubro de 2004 termina em um final de semana. O dia 31/10/2004 cai em um sábado
(sexto dia da semana). Portanto a diferença é 1 (6 – 5). Ao subtrairmos 1 do último dia do mês
(31/10/2004 – 1) obtemos 30/10/2004 que é uma sexta-feira e, portanto, o último dia do útil do
mês.

Da mesma forma, se 31/10/2004 fosse um domingo (sétimo dia), a diferença seria 2 (7 – 5) e o


último dia útil do mês seria 29/10/2004 (novamente uma sexta-feira).

Visto deste ângulo o problema é fácil de resolver:

Function últimoDiaÚtil(strData As Date, Optional nMeses As Integer) As Date


fimMês = fimDoMês(strData, nMeses)
diaSemana = Weekday(DateSerial(Year(strData), _
Month(strData) + nMeses + 1, 0), 2)

Select Case diaSemana


Case 6, 7
dif = diaSemana - 5
Case Else
dif = 0
End Select
últimoDiaÚtil = CDate(fimMês - dif)
End Function

O último dia do mês é encontrado chamando a função que criamos anteriormente. O resultado é
guardado na variável fimMês. O dia da semana é calculado utilizando a função Weekday
(Dia.Da.Semana) do VBA e o resultado é guardado na variável diaSemana.

Depois selecionamos os casos 6 (sábado) e 7 (domingo) utilizando Select Case e calculamos a


diferença como sendo diaSemana - 5. Qualquer outro caso (Case Else) indica que o dia da
semana está entre segunda e sexta-feira, inclusive, e a diferença é, portanto, zero.

O último dia útil do mês é calculado como sendo o último dia do mês (fimMês) e a diferença (dif).

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
40 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

.
Figura 5-2

A figura acima mostra o cálculo para o último dia útil do mês de julho. Como nMeses está em
branco a função retorna o último dia útil do mês referente a data selecionada.

5.3. Criando uma função para atualizar datas automaticamente

Vamos supor que você digite uma data qualquer na célula A1. A cada 7 dias você precisa
modificar esta data. Supondo que ela seja 05/07/2004 você deseja que no dia 12/07/2004 este
valor passe para 12/072004 sem precisar digitar a data novamente.

A partir de uma data base, isso ocorrerá a cada 7 dias religiosamente.

Resolveremos este problema utilizando duas funções. Uma das funções será booleana e
retornará verdadeiro ou falso se a data tiver atingido o número de dias da atualização. A outra
retorna a nova data.

Iniciaremos com a função booleana:

Private Function testeData(lngData As Long, iDias As Integer) _


As Boolean
testeData = False
If (Date - lngData) >= iDias Then
testeData = True
End If
End Function

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 41

Esta função8 recebe dois argumentos. O primeiro refere-se ao número de série da data base e o
segundo refere-se ao número de dias onde ocorrerá a atualização.

Primeiramente assumimos que o teste da data retorna um valor falso (testeData = False).
Logo a seguir, testamos para ver se a diferença entre a data do sistema e data base é maior ou
igual ao número de dias para atualização. Se este for o caso, a função retorna verdadeiro.

Se a função retornar um valor verdadeiro, então queremos que a data seja atualizada, pois o
prazo de iDias acaba de vencer. Desta forma, podemos construir a função que retornará uma
data no futuro tendo em vista um número de dias definido pelo usuário e uma data base:

Function umaSemana(strData As Date, nDias As Integer) As Date


Application.Volatile

If nDias > 365 Then


MsgBox "nDias não pode ser maior do que 365 dias! " _
& "Tente novamente", vbInformation
umaSemana = "n"
Exit Function
End If

Dim lngData As Long


Dim blnVerdadeiro As Boolean
lngData = CLng(strData)

blnVerdadeiro = testeData(lngData, nDias)

Select Case blnVerdadeiro


Case False
umaSemana = CDate(lngData)
Case True
dif = (Date - lngData) Mod nDias
umaSemana = Date - dif
End Select
End Function

Assim com a função anterior, esta função recebe dois argumentos. Embora tenha chamado a
função de umaSemana ela aceitará um atualização com n-dias, desde que n não seja maior do que
365 dias.

A função é resumida em dois casos (True e False). Se o caso da primeira função (testeData) for
falso (false); então, a data retornada pela função umaSemana é a data base (ou a data base que
já tenha sido atualizada). Se o caso for verdadeiro (True); então, a função retorna a próxima data
adicionando n-dias.

8
A função é “Private” porque nao desejo que ela fique disponível na planilha.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
42 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

A diferença é subtraída da data atual. Esta diferença é o resto entre a divisão da diferença entre a
data atual e a data base (Date - lngData) e o número de dias (nDias).

Figura 5-3

No exemplo acima a data base é 25/03/2004 e ela será atualizada a cada 7 dias. O número de
série da nova data é 38169 (01/07/2004) e somente será atualizada quando for zero hora do dia
08/07/2004.

5.4. Contagem progressiva e regressiva

Contagem regressiva e progressiva são bastante similares ao assunto que discutirei no tópico 5.5
abaixo.

Uma contagem progressiva nada mais é do que a contagem do tempo deste que um processo é
inicializado. Por exemplo, se você possui uma planilha e nela é gravado o tempo em que o usuário
ficou conectado, você está efetuando uma contagem progressiva. O inverso é verdadeiro para a
contagem regressiva. Em outras palavras, se você deseja limitar o tempo em que uma pasta de
trabalho pode ficar aberta (ou limitar o tempo de uso), você pode definir o tempo para a contagem
regressiva. Quando o tempo for esgotado, o evento é chamado e executado.

Iniciarei pela contagem progressiva9. No exemplo que darei, marcaremos o tempo no StatusBar
do Excel. Assim que a pasta de trabalho for aberta o código é inicializado e contagem passada
para o StatusBar.

9
Eu prefiro ver contagem regressiva ou progressiva como um conceito relativo. Por exemplo, se um evento ocorrerá em 10 minutos
você pode iniciar a contagem com zero minutos e terminar em 10 minutos, ou inicar com 10 minutos e terminar com zero minutos.
Independentemente do método, o evento ocorrerá em 10 minutos.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 43

Ao terminar o trabalho a data e o tempo de uso serão armazenados na planilha que manterá os
registros.

Para fazer o que desejamos, entraremos em um loop eterno. Diferentemente de outros loops, este
não travará a pasta e, consequentemente, o nosso trabalho.

Para marcar o tempo, utilizaremos o código:

Sub aHora()
Static t As Double
t = t + 1
'Debug.Print t
proximoSegundo = Now + TimeValue("00:00:01")
Application.OnTime proximoSegundo, "aHora"
Application.StatusBar = Format(t / 86400, "hh:mm:ss")
End Sub

Para que a sub-rotina funcione, ela precisa ser inserida em um módulo.

Primeiramente, definimos a variável t como sendo estática. Cada vez que a sub-rotina for
chamada ao valor anterior de t será acrescido 1. Utilizei o Debug.Print para assegurar que o
valor de t estava realmente fazendo o que eu desejava. A seguir, definimos a variável
próximoSegundo como sendo Now (Agora) mais um segundo (TimeValue("00:00:01"))

O método OnTime indica quando a sub-rotina deve ser chamada. Aqui, chamamos a sub-rotina
aHora a cada segundo, pois o próximoSegundo é igual Agora mais um segundo.

Finalmente, definimos o valor do StatusBars como sendo t dividido por 86.400. Como t é um
número inteiro, ele representará um dia completo; portanto, precisamos colocá-lo para a base de
um segundo para que o resultado esteja correto.

O nosso próximo passo é criar a sub-rotina para chamar a sub que acabamos de criar. Este é um
processo bem simples:

Sub marcarHora()
aHora
End Sub

Isto é tudo que precisamos para chamar a sub-rotina. Nada mais!

Para terminar a parte envolvendo o loop dos segundos, precisamos criar uma rotina que pare a
execução da contagem:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
44 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Sub pararHora()
On Error Resume Next
Application.OnTime proximoSegundo, "aHora", , False
End Sub

Para evitar qualquer erro nesta rotina, utilizo On Error Resume Next. A linha logo abaixo
simplesmente indica quando o próximo evento ocorrerá (exatamente igual a rotina anterior).
Porém, como definimos o argumento Schedule como sendo False, nenhum evento será marcado
após o último segundo marcado, isto é, nada mais será marcado após o último próximoSegundo
avaliado.

O processo para marcar o tempo está pronto. O que precisamos fazer é ativar o processo quando
a pasta de trabalho é aberta e parar a marcação do tempo quando ela for fechada. Além de para o
processo quando a pasta for fechada, precisamos gravar os resultados na planilha.

Primeiramente, avaliaremos a abertura da pasta de trabalho. Desta vez, você precisa acessar a
janela de código da pasta de trabalho:

Private Sub Workbook_Open()


Application.StatusBar = ""
marcarHora
End Sub

No Excel mais antigo está a sub-rotina é dada como Auto_Open.

Assim que a sub-rotina é ativada, nós limpamos o conteúdo da StatusBar. A próxima linha
chama a rotina que dará início ao processo de marcação do tempo que o usuário ficou ativo na
pasta de trabalho.

Finalmente, criamos o código que será executado pouco antes da pasta de trabalho ser fechada:

Private Sub Workbook_BeforeClose(Cancel As Boolean)


pararHora

linha = Range("A65536").End(xlUp).Row
If IsEmpty(linha) = True Then
linha = 1
End If
Range("A" & linha + 1).Value = Date
Range("B" & linha + 1).Value = Application.StatusBar
Application.StatusBar = "Pronto"
ThisWorkbook.Save
End Sub

A primeira coisa que a sub-rotina faz é parar a marcação do tempo decorrido. A seguir, avaliamos
qual é a última linha que contém dados e depois definimos o local onde a data e o tempo
decorrido serão gravados.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 45

Retornamos o StatusBar para Pronto e salvamos a pasta de trabalho. A figura abaixo mostra
como o tempo é marcado no StatusBar e como ele é gravado na planilha:

Figura 5-4

O primeiro acesso levou 15 segundos ao passo que o segundo já haviam decorridos 9min:15seg
quando fiz o PrintScreen.

5.5. Cronômetros

Cronômetros são úteis quando precisamos saber quanto um processo leva. Vamos supor que
você tenha um loop extremamente longo. Neste caso você pode colocar uma variável para
capturar o início do processamento e outra para captar o final do processamento. A diferença
entre as duas é o tempo total decorrido no processamento.

Para efetuar este cálculo é bem simples. O problema que as pessoas geralmente encontram é
com a formatação do resultado. Novamente, precisamos lembrar que existe uma diferença entre
formatação e formato. Formatação é o que você vê na tela, formato é o que o Excel/VBA utilizará
para efetuar os cálculos.

Se você der uma lida sobre a função TIMER (procure por TIMER no Ajuda do VBA), você verá que
esta função retorna uma fração. Se ela retorna uma fração não basta apenas formatar o resultado,
precisamos formatá-lo de forma que o VBA reconheça corretamente ou manipular o resultado de
uma forma que o VBA reconheça.

Ao rodara seguinte sub-rotina:

Sub cronoErrado()
t1 = Timer
n = 0
For i = 1 To 25000
For j = 1 To 1500
n = n + 1
Next
n = n + 1
Next
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
46 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

ttotal = Format(Timer - t1, "hh:mm:ss")


MsgBox ttotal
End Sub

Obtive o seguinte resultado

Figura 5-5

Se você acha que fiquei 1h30min esperando pelo loop ou que meu PC é tão lento que para um
pequeno loop como este ele leva tanto tempo, você está enganado... Assim como está o
resultado.

Aqui, eu utilizo a formatação “hh:mm:ss”, mas muitos utilizam “00:00:00”. Ao modificar o formato
para “00:00:00” obtive a seguinte resposta:

Figura 5-6

Este resultado parece um pouco mais plausível do que o anterior e é provável que muitos o
aceitem como sendo correto. O que falhamos em compreender, porém, é que estamos
formatando um resultado que não representa o que realmente procuramos.

A diferença obtida é uma fração de horas a partir de meia-noite e como tal, precisa ser convertida
para o formato que desejamos e então formatada para mostrar o que queremos.

Como sabemos que a diferença entre os dois valores é uma fração de segundos em 24horas,
precisamos trazê-la para a base em segundos, isto é, precisamos dividir o resultado 86.400 (o
número total de segundos em 24 horas).

Para se fazer isso, basta modificar a linha que avalia o resultado final como segue:

ttotal = Format((Timer - t1)/86400, "hh:mm:ss")

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 47

Ao rodar um novo loop, obtive o seguinte resultado10:

Figura 5-7

Obviamente que o resultado final dependerá da velocidade de seu computador. A formatação


acima mostrará em horas, minutos e segundos. Se você deseja formatar para mostrar em
segundos e milésimos de segundos, isto pode ser facilmente resolvido da seguinte forma:

ttotal = Format((Timer - t1), "00.000")

10
Este loop é extremamente longo. A menos que seu PC tenha uma excelente capacidade de processamento, utilize um
loop mais curto no exercício. Como comparação, o loop acima foi rodado em um AM Athlon de 64Bits, 3.4+GHz e
2GB RAM.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
48 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

6. Criando uma Splash Screen


Uma Splash Screen é a tela que aparece com alguns dizeres quando abrimos um programa
qualquer. A primeira página deste módulo contém um printscreen da splash do Excel.

Uma Splash Screen nos fornece algumas informações sobre o programa criado, mesmo que isso
seja uma breve piscada em nossa tela.

Quando desenvolvemos projetos, seja em VBA ou outra linguagem qualquer, sempre queremos
acrescentar algo mais. Algo que deixe o visual geral bonito e mais profissional.

Com as funções apresentadas podemos fazer exatamente isso.

Para o exercício que desenvolveremos, precisamos criar um formulário que conterá as


informações que apresentaremos na splash screen.

O formulário que desenvolverei terá o seguinte formato:

A idéia é mostrá-lo assim que a pasta de trabalho for aberta e deixa-la visível por 3 segundos.
Decorridos os 3 segundos o formulário será descarregado automaticamente.

Definindo explicitamente o que faremos:

• Carregar o formulário quando a pasta for aberta;

• Iniciar uma contagem regressiva de 3 segundos;

• Ao final da contagem, descarregar o formulário.

A primeira parte requer código na pasta de trabalho. Abra a janela de edição do VBE para a pasta
de trabalho e entre o seguinte código:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 49

Private Sub Workbook_Open()


frmSplash.Show 1
End Sub

O método Show 1 indica que o formulário é Modal e, portanto, o usuário não tem como acessar
as informações de fundo até que o formulário seja descarregado. Em outras palavras, o usuário
está restrito a área do formulário.

Quando o formulário é ativado, precisamos chamar a rotina que fará a contagem dos 3 segundos.
No formulário, entramos o seguinte código:

Private Sub UserForm_Activate()


marcarSegundos
End Sub

Ao ser ativado o formulário chama a sub-rotina marcarSegundos. Esta sub-rotina fará a contagem
regressiva dos 3 segundos (você pode definir um tempo maior se desejar).

A sub-rotina marcarSegundos precisa estar em um módulo. Crie um módulo onde você deve
entrar esta rotina como segue:

Sub marcarSegundos()
Application.OnTime Now + 3 / 86400, "fecharForm"
End Sub

Como a base do segundo é dada por 86.400 e desejamos avaliar 3 segundo, basta dividir 3 por
86400 para achar a fração de segundos equivalente. Uma outra forma comum de se fazer isso é
utilizar a função TimeValue. Este função converte um texto que “parece” hora para uma fração
que representa uma hora, minuto ou segundo qualquer. Para utilizar a função TimeValue, basta
adaptar a linha de código da seguinte forma:

Sub marcarSegundos()
Application.OnTime Now + TimeValue("00:00:03"), "fecharForm"
End Sub

Em ambos os casos o resultado final é o mesmo.

O último argumento inserido na sub-rotina é o nome da sub-rotina que será utilizada para fechar o
formulário ao final dos 3 segundos. Este é o último passo para se criar a nossa Splash Screen. A
sub-rotina que fechará o formulário é, portanto:

Sub fecharForm()
Unload frmSplash
End Sub

Como este ebook é estático não tenho como mostrar o resultado aqui, mas o resultado final pode
ser acessado na pasta de trabalho referente a este tópico.
Autor: Robert F Martim Criado em: 10/6/2004 03:59:00
Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
50 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

7. Utilizando o Calendar Control em um formulário VBA


Se você já utilizou formulários no VBA é provável que já tenha visto o Calendar Control em
algum ponto.

A primeira pergunta que nos vem à cabeça é: - para que serve este controle? Acredito não existir
uma resposta exata para esta pergunta assim como não existe uma resposta exata para várias
perguntas envolvendo programção. Afinal a maneira que um programador resolve um problema
não é necessariamente a mesma utilizada por outro programador.

Desta forma, a maneira como você utilizará o controle dependerá de seu projeto e necessidades.
Aqui, estaremos vendo como colocar em uso este controle.

Antes de tudo, você precisa se assegurar que o controle está disponível em seu projeto. Para
fazer isso, clique com o botão direito do mouse sobre a caixa de ferramentas do VBA e selecione
controles adicionais:

Figura 7-1

Na caixa de controles adicionais selecione a versão do Calendar Control disponível em seu Office:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 51

Figura 7-2

Com o controle de calendário disponível, estamos prontos para definir o nosso problema. O que
desejamos fazer é o seguinte:

• Todas as datas serão entradas na coluna A;

• Queremos chamar o formulário quando o usuário clicar com o botão direito do mouse sobre
qualquer célula na coluna A;

• Com o formulário aberto o usuário poderá inserir uma data ou a combinação de data e
horas;

• O usuário terá a opção de arredondamentos para horas, minutos ou segundos.

Com o problema definido, precisamos construir um formulário que dê as opções acima ao usuário.
O meu formulário ficou da seguinte forma:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
52 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Figura 7-3

Antes de iniciarmos a programação do formulário, precisamos definir a programação que chamará


o formulário quando o usuário clicar com o botão direito do mouse em uma célula qualquer na
coluna A. Como o evento está relacionado à planilhas precisamos ativar a página de código para
a planilha em questão. Neste caso específico estarei utilizando a Plan1.

O evento que estaremos avaliando é o BeforeRightClick:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _


Cancel As Boolean)
End Sub

Aqui, temos dois parêmetros: Target e Cancel. Target refere-se à célula que recebe o foco e
Cancel refere-se ao menu de atalho ativado pelo botão direito do mouse. Observe quando
clicamos com o botão direito, obtemos um menu. Neste caso, não queremos o menu, queremos o
formulário e utilizaremos este parâmetro para cancelar a visualização do menu de atalho.

O código que efeturá isso é dado por:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _


Cancel As Boolean)
If Union(Target.Range("A1"), Range("A:A")).Address = _
Range("A:A").Address Then
Cancel = True
frmCalendário.Show vbModeless
End If
End Sub

Na primeira parte do código criamos uma condição. Esta condição é a união do Target com todas
as células na coluna A. Está união é então testada para saber se alguma célula está contida em
qualquer endereço da coluna A. Se a condição for verdadeira o botão direito do mouse é
cancelado e o formulário carregado.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 53

Com o formulário carregado, podemos escrever os códigos que serão executados dentro do
formulário. O primeiro será o ativamento do formulário:

Private Sub UserForm_Activate()


matriz = Array(1, 5, 10, 15, 20, 30, 45)
cboArredMin.List = matriz
cboArredSeg.List = matriz
Calendar1.Today
End Sub

Aqui, criamos uma matriz contendo alguns valores que podem representas os minutos ou
segundos. Estes valores são passados para a lista da combobox de minutos e segundos. O valor
inicial do calendário será sempre o dia atual do sistema (today).

A seguir, criamos o click sobre uma data qualquer do controle de calendário:

Private Sub Calendar1_Click()


ActiveCell = Format(Calendar1.Value + Time, "dd/mm/yyyy hh:mm:ss")
Unload Me
End Sub

Como a célula ativa é aquela onde o usuário clicou com o botão direito do mouse, ao clicar em
uma data qualquer no controle esta data será inserida na célula juntamente com as horas, minutos
e segundos. Logo a seguir o formulário é descarregado.

Para os controles dentro da moldura (frame), entraremos os seguintes códigos:

Private Sub optArredHora_Click()


cboArredMin.ListIndex = -1
cboArredSeg.ListIndex = -1
End Sub

Private Sub cboArredMin_Change()


optArredHora.Value = False
cboArredSeg.ListIndex = -1
End Sub

Private Sub cboArredSeg_Change()


optArredHora.Value = False
cboArredMin.ListIndex = -1
End Sub

Como desejamos arredondar apenas um dos itens (horas, minutos ou segundos), modificamos os
valores padrões de cada controle quando um dos controles é selecionado.

Para o botão que inserirá somente a data, entraremos o seguinte código:

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
54 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

Private Sub cmdDataSomente_Click()


ActiveCell = Format(Calendar1.Value, "dd/mm/yyyy")
Columns("A:A").EntireColumn.AutoFit
Unload Me
End Sub

Terminado este código, escreveremos as linhas a o botão de inserção de data e hora. Este código
será um pouco mais complexo do que os anteriores, pois estaremos incluindo o código para
arredodamento das horas, minutos ou segundos:

Private Sub cmdDataHora_Click()


If optArredHora.Value = True Then
data = Round((Calendar1.Value + Time) * 24, 0) / 24
ActiveCell.Value = Format(data, "dd/mm/yyyy hh:mm:ss")
Columns("A:A").EntireColumn.AutoFit
Unload Me
Exit Sub

ElseIf cboArredMin.Value <> "" Then


data = Round((Calendar1.Value + Time) * _
(1440 / Val(cboArredMin.Value)), 0) / (1440 / Val(cboArredMin.Value))
ActiveCell.Value = Format(data, "dd/mm/yyyy hh:mm:ss")
Columns("A:A").EntireColumn.AutoFit
Unload Me
Exit Sub

ElseIf cboArredSeg.Value <> "" Then


data = Round((Calendar1.Value + Time) * _
(86400 / Val(cboArredSeg.Value)), 0) / (86400 / Val(cboArredSeg.Value))
ActiveCell.Value = Format(data, "dd/mm/yyyy hh:mm:ss")
Columns("A:A").EntireColumn.AutoFit
End If
End Sub

Embora a estrutura do código seja complexa, estamos apenas efetuando os cálculos ensinados
no tópico 2. As únicas coisas nova aqui são a propriedade EntireColumn e o método AutoFit. O
EntireColumn refere-se a coluna inteira e o AutoFit simplesmente encaixa o texto perfeitamente
dentro da coluna.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
Série “Como Fazer”: Manipulando Datas e Horas no Excel 55

Figura 7-4

Ao clicar com o botão direito do mouse sobre qualquer célula na coluna A, o formulário é ativado
dando ao usuário diversas opções. No exemplo acima a data atual é 12 Julho 2004 e o
arredondamento é para os próximos 15 minutos. O teste foi efetuado às 11:42 e o resultado do
arredondamento é 11:45.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com
56 Série “Como Fazer”: Manipulando com Datas e Horas no Excel

8. Sobre o autor
Abaixo o leitor encontra um pequeno resumo do currículo e atividades do autor deste módulo:

FORMAÇÃO ACADÊMICA:

• Formado e Pós-Graduado em Finanças pela Universidade de Londres, Reino Unido

• Membro da Sociedade Brasileira de Econometria

LINGUAGENS DE PROGRAMAÇÃO E PLATAFORMAS:

• Visual Basic, Calculadores Programáveis Casio e Sharp

• BDs: MS Access and Lotus Approach

• Plataformas: Windows NT, 2000, XP, Linux Red Hat

EXPERIÊNCIA PROFISSIONAL

outubro 02- FAIRCOURT CAPITAL LIMITED (REINO UNIDO)

• Diretor TI

fev96-maio02 MELVALE GROUP (REINO UNIDO)

• Gerente de Exportação para a África Ocidental


• Gerente de TI

OUTRAS ESPECIALIZAÇÕES

• Inspeção e regulamentações Nigerianas para importação e exportação


(Nigerian-British Chamber of Commerce & Cotecna International)

• Procedimentos de exportação no Reino Unido (The Institute of Export, Reino Unido)

• ICC 500 e Incoterms (The Institute of Export, Reino Unido)

OUTRAS ATIVIDADES

Fornece suporte pro bono em TI à entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora
Organisation Europe) desde 2001. Participou ativamente na organização da conferência sobre
Boa Governância e Responsabilidade Fiscal promovida pelo ONG em Abuja, Nigéria, em
Novembro 2003. Foi um dos principais colaboradores na elaboração do relatório final sobre a
conferência entregue a presidência da República Nigeriana em maio de 2004.

Autor do livro Excel e VBA na Modelagem Financeira: Uma abordagem prática (no
prelo). Editora Axcel Books, 2004.

Colaborador ativo do fórum Excel Avançado do site www.júliobattisti.com.br, onde divide seu
conhecimento e experiência com outros membros do espaço.

Autor: Robert F Martim Criado em: 10/6/2004 03:59:00


Publicado: www.juliobattisti.com.br Última edição: 13/7/2004 18:30:00
Contato: rm@faircourt.com