Ao q entendi sua função é recursiva afinal vc precisa verificar se o dia seguinte é domingo, sábado ou outro feriado correto? bom
eu modifiquei a sua função mas NÃO fiz vários testes... de uma olhada:
--------------------------------------------------------------------
Function spf_calcula_dia_util(slv_Data As String) As Date
Dim A, B, c, D, E, F, G, H, I, K, L, m, p, Q As Long, Ano, dt_Pascoa, dt_Carnaval, dt_SextaSanta, dt_CorpusC As Date
'Função que calcula Feriados móveis
Ano = Year(CDate(slv_Data))
A = (Ano Mod 19)
B = Int(Ano / 100)
c = (Ano Mod 100)
D = Int(B / 4)
E = (B Mod 4)
F = Int((B + 8) / 25)
G = Int((B - F + 1) / 3)
H = ((19 * A + B - D - G + 15) Mod 30)
I = Int(c / 4)
K = (c Mod 4)
L = ((32 + 2 * E + 2 * I - H - K) Mod 7)
m = Int((A + 11 * H + 22 * L) / 451)
p = Int((H + L - 7 * m + 114) / 31)
Q = ((H + L - 7 * m + 114) Mod 31)
dt_Pascoa = CDate((Q + 1) & "/" & p & "/" & Ano)
dt_Carnaval = DateAdd("d", -47, dt_Pascoa)
dt_SextaSanta = DateAdd("d", -2, dt_Pascoa)
dt_CorpusC = DateAdd("d", 60, dt_Pascoa)
If Weekday(CDate(slv_Data)) <> 1 Then 'Domingo
If Weekday(CDate(slv_Data)) <> 7 Then 'Sábado
If CDate(slv_Data) <> dt_Pascoa Then 'Pascoa
If CDate(slv_Data) <> dt_Carnaval Then 'Carnaval
If CDate(slv_Data) <> dt_SextaSanta Then 'Sexta Santa
If CDate(slv_Data) <> dt_CorpusC Then 'Corpus Cristh
If Month(CDate(slv_Data)) = 1 And Day(CDate(slv_Data)) = 1 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'Confratenização Universal
ElseIf CDate(slv_Data) = dt_Carnaval + 1 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'quarta feira de cinzas
ElseIf Month(CDate(slv_Data)) = 4 And Day(CDate(slv_Data)) = 21 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'tiradentes
ElseIf Month(CDate(slv_Data)) = 5 And Day(CDate(slv_Data)) = 1 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'dia do trabalho
ElseIf Month(CDate(slv_Data)) = 9 And Day(CDate(slv_Data)) = 7 Then
'MUDEI AQUI!!!!
'DA UMA OLHADA
spf_calcula_dia_util = spf_calcula_dia_util(CDate(slv_Data) + 1) 'independencia
'MUDEI AQUI!!!!
'DA UMA OLHADA
ElseIf Month(CDate(slv_Data)) = 10 And Day(CDate(slv_Data)) = 12 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'N. S. Aparecida
ElseIf Month(CDate(slv_Data)) = 11 And Day(CDate(slv_Data)) = 2 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'Finados
ElseIf Month(CDate(slv_Data)) = 11 And Day(CDate(slv_Data)) = 15 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'Proclamação Republica
ElseIf Month(CDate(slv_Data)) = 12 And Day(CDate(slv_Data)) = 25 Then
spf_calcula_dia_util CDate(slv_Data) + 1 'Natal
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Corpus Cristh
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Sexta Santa
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Carnaval
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Pascoa
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Sábado
End If
Else
spf_calcula_dia_util CDate(slv_Data) + 1 'Domingo
End If
'spf_calcula_dia_util = slv_Data 'retorna dia util
End Function
--------------------------------------------------------------------
o q eu acho q acontece é o seguinte. Vc passa a data do dia 07/09/2005 q é um feriado correto? Ele retorna 08/09/2005 e confere novamente para verificar se a data 08/09/2005 é outro feriado, ou sábado ou domingo... ou seja ele faz uma recursividade. Bom... no caso ele retorna a data 08/09/2005 só q a variável "slv_Data" não foi alterada pq na função está assim:
...
spf_calcula_dia_util CDate(slv_Data) + 1
...
e vc retorna valor assim:
spf_calcula_dia_util = slv_Data 'retorna dia util
se vc fizesse assim:
slv_Data = spf_calcula_dia_util CDate(slv_Data) + 1
Creio q funcionaria...
Fiz um outro código conforme está acima q tb dá certo só q teria q aplicar pra todos os feriados... fiz como exemplo para o dia 07/09 q é independência do Brasil
qq dúvida é só postar
t+