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.
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.
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!!
Como assim? Não entendi.
Aguardo.
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.
Link corrigido.
Abç