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




2 Comentários
Olá! tenho um banco de dados no excel, q preencho atrvés do VBA e eu queria emitir relatório do banco. Como faço? Valeu!!
Reply
Reinaldo Coral Reply:
dezembro 31st, 2009 at 14:35
Como assim? Não entendi.
Aguardo.
Reply
Comentário feito em dezembro 25th, 2009 às 10:10
Deixar um comentário