Um pouco mais sobre datas (Parte 1)

Nesta série de artigos vou explicar um pouco como obter informações importantes e específicas sobre as datas. O meu objetivo será desenvolver funções que retornem resultados que são necessários em diversas situações para cálculos em nossas planilhas. Um exemplo disso é quando precisamos saber qual o último dia de um mês. Para qualquer mês, já sabemos que podem ter 30 ou 31 dias, exceto fevereiro, que pode variar entre 28 ou 29 dias, conforme o ano. Como podemos definir isso? Outro caso é para sabermos quantos dias úteis existem em determinado mês. Para isso, precisamos excluir os sábados, domingos e feriados. E vai a pergunta, como identificar estes dias (finais de semanas ou feriados)?
São assuntos como esses que abordaremos nestes artigos. Garanto a você, caro leitor, que estas dicas te ajudarão muito, pois são muito usuais.

I – Identificar quantos dias tem cada mês (ênfase em descobrir o mês de fevereiro).
Bem, para começar vamos escrever os meses e seu total de dias.

Mês Total de Dias
Janeiro 31
Fevereiro 28 ou 29
Março 31
Abril 30
Maio 31
Junho 30
Julho 31
Agosto 31
Setembro 30
Outubro 31
Novembro 30
Dezembro 31

Observamos, então, que o único mês que precisamos nos preocupar é o mês de fevereiro, pois, apenas este tem o total de dias variável. Se não fosse por este mês, poderíamos apenas, fazer alguma instrução select, ou posicioná-los em um array, ou ainda, a nível de fórmula, montarmos alguns SE.
Como nosso intuito neste site é aprendermos mais profundamente as funcionalidade do Excel, podemos incrementar esta função de maneira mais profissional, até porque, desta maneira, ela poderá ser adaptada e utilizada por outras funções internamente.
Esta função é simples, mas precisa de atenção para perceber os detalhes. Vamos construí-la:
Vá ao construtor avançado de Macros (ALT+F11) e adicione um Módulo ao projeto.

Private Function fnUltimoDiaDoMes(iAno As Integer, iMes As Integer, Optional iDia As Integer = 1) As Integer
Dim arrayMesesUltimoDia As Variant
 arrayMesesUltimoDia = Array(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
 If iMes = 2 Then
 If IsDate("29/2/" & iAno) Then
 fnUltimoDiaDoMes = 29
 Else
 fnUltimoDiaDoMes = 28
 End If
 Else
 fnUltimoDiaDoMes = arrayMesesUltimoDia(iMes)
 End If
End Function

Você pode chamar a função assim, supondo que queira informação do mês 2/2009, por exemplo:
Msgbox fnUltimoDiaDoMes(2009,2)               // O resultado será 28.
Outros datas:
Msgbox fnUltimoDiaDoMes(2012,2)               // O resultado será 29.
Msgbox fnUltimoDiaDoMes(2009,4)               // O resultado será 30.
Msgbox fnUltimoDiaDoMes(2010,12)               // O resultado será 31.
Msgbox fnUltimoDiaDoMes(2009,12,25)               // O resultado será 31.
Explicando. Nesta função deve ser informado o ano, o mês, e, opcionalmente, a data, caso deseje. Enfim, bem simples e funcional.
No próximo artigo, vamos incrementá-la adicionando outras funções que dependerão dela.
Um abraço e espero você.

10 comentários em “Um pouco mais sobre datas (Parte 1)”

  1. Muito boa a materia, e gostei muito do seu site.
    tenho uma sugestão para o tema de datas isso pode ajudar muita gente.
    Abraços,
    Bruno Gonçalves
    Sub UltimoDia()
    Dim DIA
    Dim Data
    Data = Now()
    DIA = DatePart(“d”, DateAdd(“m”, 1, DateAdd(“d”, -Day(Data), Data)))
    MSGBOX “Último dia do mês – ” & DIA
    End Sub

    Responder
    • @Bruno, obrigado.
      Esta rotina “UltimoDia” que você citou, infelizmente, ocorre num erro de lógica. Vou explicar.
      Suponha que hj seja 5/12/2010.
      A instrução do seria:
      Subtrair 5 dias desta data. Resultado: 30/11/2010
      Adicionar 1 mês a este resultado. Novo Resultado: 30/12/2010
      Pegar a parte da data referente ao dia deste resultado. Resultado final: 30
      Ou seja, ela retorna como dia 30 sendo o último dia do mês de Dezembro, quando deveria retornar dia 31.
      Neste artigo, eu disponibilizei uma função para retornar o último dia de qualquer mês, em qualquer ano, inclusive, para o mês de fevereiro, que tem a variação entre 28 ou 29 dias.
      Estão função, eu expliquei como retorno de resultado dentro de uma célula, e, informando os parametros, mas, também, pode retornar numa caixa de mensagem, e puxando a data atual como referência, como você sugeriu.
      Exemplo:
      MsgBox “Último dia do mês – ” & fnUltimoDiaDoMes(Year(Now()), Month(Now()))
      Espero ter ajudado.
      Abç

      Responder
  2. Olá Reinaldo Coral,
    Legal o seu site.
    Gostaria de saber como entrar em contato
    contigo para te mostrar uma planilha que
    desenvolvi e tirar umas dúvidas.
    De repente até te contratar para fazer
    um pequeno projeto.
    Abraços,.
    Fábio Queiroz

    Responder

Deixe um comentário