Um pouco mais sobre datas (Parte 3)

Oi pessoal.
Ainda em continuidade a esta série de artigos sobre trabalhos com datas, hoje vamos construir uma função que nos informa quantos feriados temos em um determinado mês.
Para quem ainda não leu os artigos anteriores, é bom dar uma olhadinha. Os links são esses logo abaixo:

  1. Um pouco mais sobre datas – Parte 1
  2. Um pouco mais sobre datas – Parte 2

III – Saber quantos feriados existem no mês.
Nos textos anteriores, falamos sobre extrair informação nas datas para descobrirmos o número de sábado, domingos, dias no mês… Hoje queremos saber os dias que são feriados no nosso calendário. Será que conseguiremos fazer isso, já que o excel não nos informa isso? All right!!!
Na questão dos sábados e domingos ou qualquer outro dia da semana é fácil, pois pela função Weekday descobrimos facilmente e podemos adaptá-la a nossa realidade. Já, quanto aos feriados, teremos um pouco mais de trabalho. Mas vamos ao trabalho.
Em nosso calendário, existem os feriados fixos e os móveis. Os móveis dependem de uma data especial (Páscoa) para serem calculados, tipo, o Carnaval. Enfim, não vou neste artigo, detalhar um estudo complexo sobre isso. Caso tenham interesse em saber melhor, podem ler em http://www.ghiorzi.org/portug2.htm ou http://pt.wikipedia.org/wiki/C%C3%A1lculo_da_P%C3%A1scoa.
Nossa função irá percorrer todos os dias do mês informado e analisar se o dia é feriado. Para isso, usaremos a função que criamos na Parte1, lembram? Para saber quantos dias tem no mês e montarmos um loop.
Podemos montar a seguintes funções.
a) Função para saber quando será a Páscoa no ano pesquisado.

Private Function CalculaPascoa(iAno As Integer) As Date
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Dim M As Integer
Dim N As Integer
Dim P As Integer
Dim Q As Integer
Dim R As Integer
Dim S As Integer
A = iAno \ 100      'o inteiro de (Ano ÷ 100)
B = iAno Mod 19     'o resto de (Ano ÷ 19)
C = (A - 17) \ 25   'o inteiro de [(A - 17) ÷ 25]
D = A \ 4           'o inteiro de (A ÷ 4)
E = (A - C) \ 3     'o inteiro de [(A - C) ÷ 3]
F = (A - D - E + (19 * B) + 15) Mod 30    'o resto de {[A - D - E + (19xB) + 15] ÷ 30}
G = F \ 28          'o inteiro de (F ÷ 28)
H = 29 \ (F + 1)    'o inteiro de [29 ÷ (F + 1)]
I = (21 - B) \ 11   'o inteiro de [(21 - B) ÷ 11]
J = G * H * I
K = F - (G * (1 - J))
L = iAno \ 4         'o inteiro de (Ano ÷ 4)
M = (iAno + L + K + 2 - A + D) Mod 7       'o resto de [(Ano + L + K + 2 - A + D) ÷ 7]
N = K - M
P = (N + 40) \ 44    'o inteiro de [(N + 40) ÷ 44]
Q = 3 + P
R = Q \ 4           'o inteiro de (Q ÷ 4)
S = N + 28 - (31 * R)
CalculaPascoa = CDate(S & "/" & Q & "/" & iAno)
End Function

b) Função para saber se o dia pesquisado é Feriado.

Public Function VerificaSeFeriado(dDataX As Date) As Boolean
Dim FeriadosFixos(7) As Date
Dim FeriadosMoveis(2) As Date
Dim iAnoX As Integer
Dim dPascoa As Date
 iAnoX = Year(dDataX)
 dPascoa = CalculaPascoa(iAnoX)
 FeriadosFixos(0) = CDate("1/1/" & iAnoX)            'Confraternização Universal
 FeriadosFixos(1) = CDate("21/4/" & iAnoX)           'Tiradentes
 FeriadosFixos(2) = CDate("1/5/" & iAnoX)            'Trabalho
 FeriadosFixos(3) = CDate("7/9/" & iAnoX)            'Independência do Brasil
 FeriadosFixos(4) = CDate("12/10/" & iAnoX)          'Nossa Senhora Aparecida
 FeriadosFixos(5) = CDate("2/11/" & iAnoX)           'Finados
 FeriadosFixos(6) = CDate("15/11/" & iAnoX)          'Proclamação da Repúplica
 FeriadosFixos(7) = CDate("25/12/" & iAnoX)          'Natal
 FeriadosMoveis(0) = DateAdd("d", -2, dPascoa)       'Sexta Paixão
 FeriadosMoveis(1) = DateAdd("d", -47, dPascoa)      'Carnaval
 FeriadosMoveis(2) = DateAdd("d", 60, dPascoa)       'Corpus Christi
 Select Case dDataX
 Case FeriadosFixos(0), FeriadosFixos(1), FeriadosFixos(2), FeriadosFixos(3), FeriadosFixos(4), FeriadosFixos(5), FeriadosFixos(6), FeriadosFixos(7)
 VerificaSeFeriado = True
 Case FeriadosMoveis(0), FeriadosMoveis(1), FeriadosMoveis(2)
 VerificaSeFeriado = True
 Case Else
 VerificaSeFeriado = False
 End Select
End Function

c) Função para saber quantos feriados terão no mês.

Function TotalDeFeriadosNoMes(iAno As Integer, iMes As Integer) As Integer
Dim TotalDeDias As Integer
Dim TotalDeDiasNoPeriodo As Integer
Dim iContDia As Integer
Dim dDataAnalisada As Date
Dim dDataInicial As Date
Dim dDataFinal As Date
Dim iUltimoDiaDoMes As Integer
 iUltimoDiaDoMes = fnUltimoDiaDoMes(iAno, iMes)  'Pega o ultimo dia do mes
 dDataInicial = DateSerial(iAno, iMes, 1)    'Primeiro dia do mês em formato data
 dDataFinal = DateSerial(iAno, iMes, iUltimoDiaDoMes)    'Ultimo dia em formato data
 TotalDeDias = 1 + DateDiff("d", dDataInicial, dDataFinal)
 dDataAnalisada = dDataInicial
 TotalDeDiasNoPeriodo = 0
 For iContDia = 1 To TotalDeDias
 If VerificaSeFeriado(dDataAnalisada) = True Then
 TotalDeDiasNoPeriodo = TotalDeDiasNoPeriodo + 1
 End If
 dDataAnalisada = DateAdd("d", 1, dDataAnalisada)
 Next iContDia
 TotalDeFeriadosNoMes = TotalDeDiasNoPeriodo
End Function

Essas três funções são dependentes entre si e ainda precisam da fnUltimoDiaDoMes que eu ensinei no primeiro artigo desta série.
Para chamar a função, fazemos assim:
Msgbox TotalDeFeriadosNoMes(2009,11)
O resultado será que em novembro de 2009 existem 2 feriados.
Até a próxima, amigos, onde abordaremos sobre como descobrirmos quantos dias úteis existem no mês.

4 comentários em “Um pouco mais sobre datas (Parte 3)”

  1. Olá, gostaria muito de baixar o arquivo de exemplo “UM POUCO MAIS SOBRE DATAS – PARTE 3″mas o link está quebrado. Há possibilidade disponibilizar para download em um link válido ou enviar no meu e-mail?
    Muito obrigado.

    Responder

Deixe um comentário