Pessoal, hoje vou escrever para vocês uma questão levantada por um leitor deste site. Já o respondi via coments mas resolvi publicar a todos vocês para poder ajudá-los também.

A seguir transcrevo a pergunta feita pelo leitor Luciano em 22 de junho de 2010.

Parabens pelo site, muito bom.
Poderia por favor me ajudar.
Na planilha excel, ao digitar o mes “janeiro/2010″, gostaria que aparecesse em uma coluna todos os “dias” daquele mes, na segunda coluna os “dias da semana” e na terceira coluna “feriado” quando for. ex:
A1 = Janeiro/2010
A2 = 1
B2 = Sexta-feira
C2 = Se for feriado aparece a palavra Feriado
A3 = 2
B3 = Sábado
C3 =

Grato

Elaborei a seguinte solução:

Primeiramente, indico a leitura prévia dos seguintes artigos:

Um pouco mais sobre datas – Parte 1

Um pouco mais sobre datas – Parte 2

Um pouco mais sobre datas – Parte 3

Um pouco mais sobre datas – Parte 4

Bem, a idéia seria digitar o mês e ano na célula A1 e listar, automaticamente, os dias, dias da semana e feriados daquele mês. Ou seja, se o conteúdo da célula A1 fosse Janeiro/2010, nas células abaixo de A1 seriam listados todos os dias deste mês em formato numérico sequencial (1,2,3,4,5,…,31). E na coluna B nas linhas adjacentes seriam informados os dias da semana (domingo, segunda-feira, terça-feira,…). E finalmente, na coluna C, seria mostrado quais dias daqueles seriam feriados.

Então. Crie uma nova planilha excel e siga os passos abaixo.

1o. passo:

Acesse o ambiente de programação em VBA (ALT+F11) e adicione um módulo.
Nesse módulo insira o código abaixo transcrito.

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

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

2o. passo:

Na célula A1, ao invés de digitar Janeiro/2010, por exemplo, digite 1/1/2010. Faça semelhante para qualquer mês, apenas modificando o mês e o ano. Sempre com o dia 1. E para exibir “Janeiro/2010″, formate a célula de modo personalizado através da string [$-416]mmmm/aaaa;@. Ok.

3o. passo:

Na célula A2, digite a fórmula seguinte e depois copie-a até a linha 32 da mesma coluna.
=SE(MÊS($A$1+LIN()-LIN($A$1)-1) = MÊS($A$1);$A$1+LIN()-LIN($A$1)-1;”")
Depois, formate o intervalo de A2 a A32 com a string presonalizada d;@.

4o. passo:

Na célula B2, digite a fórmula seguinte e depois copie-a até a linha 32 da mesma coluna.
=A2
Em seguida, formate este intervalo com a string personalizada dddd.

5o. passo:

Na célula C2, digite a fórmula seguinte e depois copie-a até a linha 32 da mesma coluna.
=SE(A2=”";”";SE(VerificaSeFeriado(A2);”Feriado”;”"))

Muito bom, né. Espero que seja útil para vocês.

Até breve.