Boa tarde a Todos
Uso este código abaixo Criado pelo Mestre Avelino e Mestre Alexandre Neves para um amigo do fórum para controlar dias uteis para vencimentos, que por sinal esta perfeito e tambem uso para esta finalidade.
Agora a empresa quer criar um método de premiação que seria a cada trimestre sem falta o funcionário teria direito a 3 dias úteis de folga que seria agendado através de datas disponíveis.
Criei a tabela de agendamento "tblagenda" com campo data e Funcionário e criei o frmagenda
quando seleciono o funcionario queria estipular qual periodo ele estara de folga
Gostaria de adaptar este código se for possível para efetuar este agendamento.
Preciso que quando informo o funcionário e a data no formulário ele Leia esta tabela e se já existe uma data me informe através de de mensagem que já existe funcionário(Nome) agendado e ele agende para próxima data descontando finais de semana e feriados e grave na tabela os tres dias úteis de folga para funcionario selecionado.
Será que é Possivel?
Código:
Public Function fncAjustaData(dataInformada As Date, Optional status As Boolean) As Date
Dim k, F, j%, NovaData As Date
Static feriado
feriado = IIf(status = True, Null, feriado)
k = Split(fncFeriadosMoveis(Year(dataInformada)) & ",0101,0421,0501,0907,1012,1102,1115,1120,1225", ",")
F = Split("Carnaval,Sexta Santa,Corpus Crist,Confraternização Universal,Tiradente,Dia do Trabalhador,Independência do Brasil,Nossa Senhora Aparecida,Finados,Proclamação da República,Dia da Consciência Negra,Natal", ",")
NovaData = dataInformada
For j = 0 To UBound(k)
If k(j) = Format(dataInformada, "mmdd") Then
NovaData = dataInformada + 1
feriado = "feriado (" & F(j) & ")"
Exit For
End If
Next
If Weekday(NovaData) = 7 Then
NovaData = NovaData + 2
feriado = "Sábado"
End If
If Weekday(NovaData) = 1 Then
NovaData = NovaData + 1
feriado = "Domingo"
End If
If NovaData <> dataInformada Then NovaData = fncAjustaData(NovaData)
If (NovaData = dataInformada) And Not IsNull(feriado) Then MsgBox "Esta data cairá no " & feriado & vbCrLf & vbNewLine & "Será reagendado para: " & NovaData & " (" & WeekdayName(Weekday(NovaData)) & ")", vbInformation, "Aviso"
fncAjustaData = NovaData
End Function
-------------------------------------------------
Public Function fncFeriadosMoveis(ano%) As String
Dim dt_Pascoa As Date
Dim dt_Carnaval As Date
Dim dt_SextaSanta As Date
Dim dt_CorpusC As Date
Dim A%, B%, C%, D%, E%, F%, G%, H%, I%, k%, L%, M%, P%, Q%
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)
fncFeriadosMoveis = Format(dt_Carnaval, "mmdd") & "," & Format(dt_SextaSanta, "mmdd") & "," & Format(dt_CorpusC, "mmdd")
End Function
Aguardo Ajuda
Abraços
Uso este código abaixo Criado pelo Mestre Avelino e Mestre Alexandre Neves para um amigo do fórum para controlar dias uteis para vencimentos, que por sinal esta perfeito e tambem uso para esta finalidade.
Agora a empresa quer criar um método de premiação que seria a cada trimestre sem falta o funcionário teria direito a 3 dias úteis de folga que seria agendado através de datas disponíveis.
Criei a tabela de agendamento "tblagenda" com campo data e Funcionário e criei o frmagenda
quando seleciono o funcionario queria estipular qual periodo ele estara de folga
Gostaria de adaptar este código se for possível para efetuar este agendamento.
Preciso que quando informo o funcionário e a data no formulário ele Leia esta tabela e se já existe uma data me informe através de de mensagem que já existe funcionário(Nome) agendado e ele agende para próxima data descontando finais de semana e feriados e grave na tabela os tres dias úteis de folga para funcionario selecionado.
Será que é Possivel?
Código:
Public Function fncAjustaData(dataInformada As Date, Optional status As Boolean) As Date
Dim k, F, j%, NovaData As Date
Static feriado
feriado = IIf(status = True, Null, feriado)
k = Split(fncFeriadosMoveis(Year(dataInformada)) & ",0101,0421,0501,0907,1012,1102,1115,1120,1225", ",")
F = Split("Carnaval,Sexta Santa,Corpus Crist,Confraternização Universal,Tiradente,Dia do Trabalhador,Independência do Brasil,Nossa Senhora Aparecida,Finados,Proclamação da República,Dia da Consciência Negra,Natal", ",")
NovaData = dataInformada
For j = 0 To UBound(k)
If k(j) = Format(dataInformada, "mmdd") Then
NovaData = dataInformada + 1
feriado = "feriado (" & F(j) & ")"
Exit For
End If
Next
If Weekday(NovaData) = 7 Then
NovaData = NovaData + 2
feriado = "Sábado"
End If
If Weekday(NovaData) = 1 Then
NovaData = NovaData + 1
feriado = "Domingo"
End If
If NovaData <> dataInformada Then NovaData = fncAjustaData(NovaData)
If (NovaData = dataInformada) And Not IsNull(feriado) Then MsgBox "Esta data cairá no " & feriado & vbCrLf & vbNewLine & "Será reagendado para: " & NovaData & " (" & WeekdayName(Weekday(NovaData)) & ")", vbInformation, "Aviso"
fncAjustaData = NovaData
End Function
-------------------------------------------------
Public Function fncFeriadosMoveis(ano%) As String
Dim dt_Pascoa As Date
Dim dt_Carnaval As Date
Dim dt_SextaSanta As Date
Dim dt_CorpusC As Date
Dim A%, B%, C%, D%, E%, F%, G%, H%, I%, k%, L%, M%, P%, Q%
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)
fncFeriadosMoveis = Format(dt_Carnaval, "mmdd") & "," & Format(dt_SextaSanta, "mmdd") & "," & Format(dt_CorpusC, "mmdd")
End Function
Aguardo Ajuda
Abraços