segunda-feira, 20 de dezembro de 2010

Excel: Adicionar dias úteis a uma data

Recentemente me pediram para auxiliar em um probleminha com datas úteis no excel. Sabemos que a função DIATRABALHOTOTAL nos mostra a diferença, em dias úteis, entre duas datas, mas, e como adicionar quantidade de dias úteis em uma data? Parece fácil, mas não encontrei outra alternativa a não ser criando uma função para isso.

Vamos ao problema:

Dado uma data que cai, por exemplo, no dia 05/03/2011, que dá em um sábado. Desejando-se adicionar 2 dias úteis, a função deverá retornar 10/03/2011, já que 07/03 e 08/03 caem no carnaval, feriado portanto.

Para vencermos esse desafio vamos precisar de:
1-Uma tabela de feriados.
2-Uma tabela para testar
3-Duas funções para calcularmos os dias úteis.

Vamos ao projeto:

1º) Abra um novo arquivo de trabalho do Excel.
2º) Renomeie a Plan1 para Feriados. Em A1 cole o seguinte conteúdo:
12/10/2010 terça-feira Nossa Sr.a Aparecida - Padroeira do Brasil
02/11/2010 terça-feira Finados
15/11/2010 segunda-feira Proclamação da República
25/12/2010 sábado Natal
01/01/2011 sábado Confraternização Universal
07/03/2011 segunda-feira Carnaval
08/03/2011 terça-feira Carnaval
21/04/2011 quinta-feira Tiradentes
22/04/2011 sexta-feira Paixão de Cristo
01/05/2011 domingo Dia do Trabalho
23/06/2011 quinta-feira Corpus Christi
07/09/2011 quarta-feira Independência do Brasil
12/10/2011 quarta-feira Nossa Sr.a Aparecida - Padroeira do Brasil
02/11/2011 quarta-feira Finados
15/11/2011 terça-feira Proclamação da República
25/12/2011 domingo Natal
01/01/2012 domingo Confraternização Universal
20/02/2012 segunda-feira Carnaval
21/02/2012 terça-feira Carnaval
06/04/2012 sexta-feira Paixão de Cristo
21/04/2012 sábado Tiradentes
01/05/2012 terça-feira Dia do Trabalho
07/06/2012 quinta-feira Corpus Christi
07/09/2012 sexta-feira Independência do Brasil
12/10/2012 sexta-feira Nossa Sr.a Aparecida - Padroeira do Brasil
02/11/2012 sexta-feira Finados
15/11/2012 quinta-feira Proclamação da República
25/12/2012 terça-feira Natal

Temos aqui uma pequena faixa de feriados. Em outro post vou colocar a planilha completa.

3º) Vamos renomear essa faixa de células:
1-Selecione de A1 a C28
2-Na barra de endereço, dê um nome para essa faixa: TB_FERIADO


4º) Agora, vamos criar as funções que iremos utilizar na solução.

1-Utilize a combinação das teclas ALT e F11, para acionar o editor de código VBA do Excel.
2-Na tela que abriu, clique com o botão direito em Plan1. Clique em Inserir e, depois, em Módulo.
3-Digite o seguinte código:

Function Eh_Feriado(dData As Date) As Boolean

Dim rng As Variant
Dim sData As String
Dim sNome AS string

sNome = ActiveWorkBook.Name

sData = CDate(dData)

Set rng = Workbooks(sNome).Worksheets("Feriados").Range("A1:A500").Find(sData)

Eh_Feriado = Not (rng Is Nothing)
End Function

4º) Vamos criar outra função, que é a que iremos utilizar comumente:

1-Digite o seguinte código, após a End Function da função anterior:

Function AdicionaDiaUtil(dData As Date, iDias As Integer)
'
' Esta função adicionará iDias úteis em dData
'
Dim iCont As Integer

iCont = 1

While iCont <= iDias
'
' Adiciona 1 dia
'
dData = DateAdd("d", 1, dData)

If Eh_Feriado(dData) Then

iDias = iDias + 1

Else

If (Weekday(dData) = 1) Then
iDias = iDias + 1
ElseIf (Weekday(dData) = 7) Then
iDias = iDias + 1
End If
End If

iCont = iCont + 1

Wend

AdicionaDiaUtil = dData

End Function

Não esqueça de salvar!

5º) Vamos criar uma tabela auxiliar para recuperar o nome do dia da semana, para facilitar os testes:

1-Na planilha Tabelas, coloque a seguinte sequência, a partir de E1:


6º) Pronto, já temos o que precisamos para calcular. Vamos criar uma planilha de teste.

1-Abra a Plan2.
2-Em B5, digite: Data:
3-Em B6, digite: Dia da Semana:



Veja que eu atribui o nome TB_DIADASEMANA para essa faixa de células.

4-Em B8, digite: Dias úteis:
5-Em B9, digite: Próxima data:
6-Em B10, digite: Dia da semana

7º) Agora, vamos colocar o Excel para trabalhar por nós:

1-Na célula C5 digite uma data qualquer. Exemplo: 01/01/2011
2-Na célula C6 digite: =PROCV( DIA.DA.SEMANA( C5); TB_DIADASEMANA;2)´

Veja que ele já recupera o dia da semana para a data informada. Para a data 01/1/2011, retorna sábado.

3-Na célula C8 informe a quantidade de dias úteis desejada para a data testada. Digamos: 2

4-Na célula C9 vamos colocar a função que criamos, passando como parâmetro da data, que está em C6 e a quantidade de dias úteis, que está em C9: =AdicionaDiaUtil(C5;C8)

5-Na célula C10 coloque: =PROCV( DIA.DA.SEMANA( C9); TB_DIADASEMANA;2)

Pronto! Para dia 01/01/2011, adicionando 2 dias úteis a essa data teremos 04/01/2011, senão vejamos:

Dia 01/01/2011 é sábado, além de ser feriado.
Dia 02/01/2011 é domingo, não pode contar como o primeiro dia úti.
Dia 03/01/2011 é segunda, primeiro dia útil.
Dia 04/01/2011 é o segundo dia útil.

Teste com 04/03/2011 e veja o resultado!

No próximo post coloco o arquivo com a tabela de feriado completa.


Dúvidas, sugestões, estou à disposição.

Formatar texto numérico com zeros à esquerda

Sempre aparace uma necessidade de colocar zeros à esquerda em textos que representam números. Exemplo clássico é transformar o número que ...