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.




Parabéns, são poucos que dividem suas experiencias e conhecimentos.
Lá no final onde define as variáveis A, B, C, etc. Em algumas delas, onde ocorrem divisões, a barra deitada (“/”) não apareceu.
Ex: ” A = iAno 100 ”
O certo seria ” A = iAno / 100 “.
Tem vários erros desses.
Obrigado.
Reply
Reinaldo Coral Reply:
agosto 23rd, 2010 at 1:00
Valeu Marcelo.
Realmente tem vários erros destes. Ainda não consegui um visualizador de códigos bom para colocar no meu site. A digitação é toda correta, mas o script da página estraga vários caracteres do código. Por isso, sempre disponibilizo o arquivo fonte para download. Nele está todo o código sem alterações.
Abração.
Reply
Boa tarde;
Gostaria primeiramente de parabeniza-lo pelo excelente trabalho que você está fazendo neste site, que não deixa nada a desejar a outros bons sites que conheço na França / USA, parabens novamente.
Meu amigo, você poderia me ajudar em um problema que está me perseguindo a muito tempo e ainda não encontrei uma boa solução:
Eu preciso identificar em um planilha de datas (tipo cronograma) a número da semana (por ex.: 22/07/2010 = semana 29), utilizando as funções NÚMSEMANA()ou Weeknum()obtenho o resultado (30), pois excel utiliza o principio americano para datas.
Eu necessito de uma ajuda para encontrar o correto número da semana com as seguintes condiçoes:
- O primeiro dia da semana deve ser um domingo
- A primeira semana do ano deve ter pelo menos 4 dias, ou seja se dia 01/Jan cair de domingo à quarta-feira esta seria a Semana 1, caso contrário (de quinta à sábado)esta seria então a última semana do ano anterior (Semana 52)
A formula abaixo é a que utilizo e que se aproxima das minhas necessidades
=SE(NÚMSEMANA(A1;1)-1=0;NÚMSEMANA(A1;1);NÚMSEMANA(A1;1)-1)
Onde A1 = data que necessito identificar a semana
Agradeço pela sua grande e importante ajuda.
Abraços
Ete
Reply
Reinaldo Coral Reply:
agosto 27th, 2010 at 12:57
Obrigado Etevaldo,
Resolva usando uma fórmula personalizado com VBA.
Inicie o VBA (ALT+F11). Insira um módulo.
Crie a função abaixo:
Public Function NumeroDaSemana(ByVal rngData As Range) As Integer
If rngData.Rows.Count = 1 And rngData.Columns.Count = 1 Then
If IsDate(rngData.Value) Then
NumeroDaSemana = Format(rngData.Value, “ww”, vbSunday, vbFirstFourDays)
Else
NumeroDaSemana = 0
End If
Else
NumeroDaSemana = 0
End If
End Function
Encerre o VBA e volte a planilha.
Digite na célula que você quer mostrar o resultado:
=NumeroDaSemana(A1)
Pronto.
Não consegui configurar apenas por fórmulas prontas, por isso sugiro utilizar a macro acima.
Abraço.
Reply