José luis leal Posted September 6, 2013 at 02:39 PM Report #523676 Posted September 6, 2013 at 02:39 PM Boa tarde, Será que alguém me pode ajudar na resolução de um problema que de seguida irei apresentar? Eu saquei da net estes códigos e guardei como função do Excel mas precisava que fosse alterado para o calendário português, Muito Agradecido abaixo tenho a lista dos feriados para 2014,e o feriado municipal de paredes que é a zona onde trabalho, espero que seja suficiente. aproveito para chatear mais um pouco, aumentando o pedido com o seguinte, será possível Alguém colocar no código isto que vou tentar explicar o melhor possível ? Eu tenho uma folha de calculo em que controlo todas as vertentes que entendo como necessárias para controlar a produção de uma Pequena fabrica de móveis, e o que eu pretendo com o código que lhe estou a pedir e fazer o seguinte; Tendo eu uma célula onde insiro a data e hora do inicio da Ordem de fabricação, e noutra célula é apresentada a soma do período que demora a ser produzida, o que eu preciso é que o código me apresente notra célula a data e hora para o fim da ordem de produção excluindo os Fim de semana, os feriados e as respetivas pausas de laboração,que são as seguintes: Entrada ás 08:00, Café da manha das 10:00 ás 10:10, período de almoço das 12:30 ás 14:00, café da tarde das 16:00 ás 16:10, saída às 18:00. Será que Alguém me puderia ajudar Fazendo um código que me resolve-se este problema ? ficaria muito Grato. Bom fim de semana e OBRIGADO Option Explicit Function dataFinalTarefa(argDataInicial As Date, argTempo As String) As Variant '=========================================================== 'Função que calcula uma data e hora final a partir de uma data 'e hora inicial somando-se uma quantidade de horas referentes 'a uma tarefa. ' 'Autor: Plinio Mabesi 'Contato: pliniomabesi@gmail.com 'Novembro - 2009 ' '=========================================================== Dim horaInicial As Double, horaFinal As Double Dim inicioExpediente As Double, fimExpediente As Double Dim inicioCafe As Double, fimCafe As Double Dim inicioAlmoco As Double, fimAlmoco As Double Dim TempoTarefa As Double Dim totalExpediente As Double Dim totalCafe As Double Dim totalAlmoco As Double Dim restante As Double Dim numeroDias As Integer Dim teste As Double Dim i As Integer 'Configuração dos dados iniciais. Para personalizar 'basta alterar os valores a serem utilizados. inicioExpediente = converteHoraDouble("08:00") inicioCafe = converteHoraDouble("10:00") fimCafe = converteHoraDouble("10:10") inicioAlmoco = converteHoraDouble("12:30") fimAlmoco = converteHoraDouble("14:00") fimExpediente = converteHoraDouble("18:30") TempoTarefa = converteHoraDouble(argTempo) totalCafe = fimCafe - inicioCafe totalAlmoco = fimAlmoco - inicioAlmoco totalExpediente = fimExpediente - inicioExpediente - totalAlmoco - totalCafe horaInicial = converteHoraDouble(Format(Hour(argDataInicial), "00") & ":" & Format(Minute(argDataInicial), "00")) numeroDias = ((horaInicial + TempoTarefa - inicioExpediente) * 10000) \ ((totalExpediente + 0.0001) * 10000) If horaInicial < inicioExpediente Or horaInicial > fimExpediente Or (horaInicial >= inicioCafe And horaInicial < fimCafe) Or (horaInicial >= inicioAlmoco And horaInicial < fimAlmoco) Then dataFinalTarefa = "Hora inicial inválida!" Exit Function End If dataFinalTarefa = argDataInicial For i = 1 To numeroDias Do dataFinalTarefa = dataFinalTarefa + 1 Loop Until diaUtil(dataFinalTarefa) Next i horaFinal = horaInicial + TempoTarefa If horaInicial < inicioCafe And horaFinal > inicioCafe Then horaFinal = horaFinal + totalCafe End If If horaInicial < inicioAlmoco And horaFinal > inicioAlmoco Then horaFinal = horaFinal + totalAlmoco End If If horaFinal > fimExpediente Then horaFinal = horaFinal - fimExpediente horaFinal = Round(horaFinal, 3) - Round(((horaFinal * 1000) \ (totalExpediente * 1000)) * totalExpediente, 3) horaFinal = horaFinal + inicioExpediente End If If horaFinal > inicioCafe And numeroDias > 0 Then horaFinal = horaFinal + totalCafe If horaFinal > inicioAlmoco Then horaFinal = horaFinal + totalAlmoco If horaFinal > fimExpediente Then restante = horaFinal - fimExpediente horaFinal = inicioExpediente + restante Do dataFinalTarefa = dataFinalTarefa + 1 Loop Until diaUtil(dataFinalTarefa) End If End If ElseIf horaFinal = inicioExpediente Then horaFinal = fimExpediente End If dataFinalTarefa = CDate(Day(dataFinalTarefa) & "/" & Month(dataFinalTarefa) & "/" & Year(dataFinalTarefa) & _ " " & Fix(horaFinal) & ":" & Round((horaFinal - Fix(horaFinal)) * 60)) End Function Function converteHoraDouble(argHora As String) As Double Dim lngHora As Long, dblMinuto As Double lngHora = CInt(Left(argHora, 2)) dblMinuto = CDbl(Right(argHora, 2)) dblMinuto = (dblMinuto * 100) / 60 converteHoraDouble = lngHora + dblMinuto / 100 End Function Function converteHoraTexto(argHora As Double) As String Dim intHora As Integer, intMinuto As Integer intHora = Fix(argHora) intMinuto = (argHora - intHora) * 100 intMinuto = (intMinuto * 60) / 100 converteHoraTexto = Format(intHora, "00") & ":" & Format(intMinuto, "00") End Function ------------------------------------------------------------------------------------------------------------------------------------------------------------------- Option Explicit Function diaUtil(ByVal argData As Date) As Boolean If Weekday(argData) = vbSunday Or Weekday(argData) = vbSaturday Then diaUtil = False Else If feriado(argData) Then diaUtil = False Else diaUtil = True End If End If End Function Function feriado(ByVal argData As Date) As Boolean On Error GoTo Err_Feriado '=========================================================== 'Esta função tem como objetivo verificar se a data inserida 'é um feriado brasileiro, retornando True em caso positivo. ' ' ' *** Função de livre uso se mantidos os créditos *** ' '=========================================================== If IsNull(argData) Then Exit Function Dim a%, b%, c%, d%, e%, f%, g%, h%, i%, j%, k%, l%, m%, p%, q% Dim intAno As Integer, intConta As Integer Dim Pascoa As Date, varData(12) As Date argData = Day(argData) & "/" & Month(argData) & "/" & Year(argData) feriado = False intAno = Year(CDate(argData)) ' Calcula a data da Páscoa If intAno >= 1583 Then ' Jean Baptiste Joseph Delambre (1749-1822) a = intAno Mod 19 b = Fix(intAno / 100) c = intAno Mod 100 d = Fix(b / 4) e = b Mod 4 f = Fix((b + 8) / 25) g = Fix((b - f + 1) / 3) h = (19 * a + b - d - g + 15) Mod 30 i = Fix(c / 4) k = c Mod 4 l = (32 + 2 * e + 2 * i - h - k) Mod 7 m = Fix((a + 11 * h + 22 * l) / 451) p = Fix((h + l - 7 * m + 114) / 31) q = (h + l - 7 * m + 114) Mod 31 Pascoa = DateSerial(intAno, p, q + 1) Else ' Calendário Juliano a = intAno Mod 4 b = intAno Mod 7 c = intAno Mod 19 d = (19 * c + 15) Mod 30 e = (2 * a + 4 * b - d + 34) Mod 7 f = Fix((d + e + 114) / 31) g = (d + e + 114) Mod 31 Pascoa = DateSerial(intAno, f, g + 1) End If ' Define feriados móveis varData(0) = Pascoa - 48 ' Segunda-feira de Carnaval varData(1) = Pascoa - 47 ' Terça-feira de Carnaval varData(2) = Pascoa - 2 ' Paixão de Cristo varData(3) = Pascoa ' Páscoa varData(4) = Pascoa + 60 ' Corpus Christi ' Feriados Nacionais (lei 10.607/2002) varData(5) = CDate("01/01/" & intAno) ' Confraternização Universal varData(6) = CDate("21/04/" & intAno) ' Tiradentes varData(7) = CDate("01/05/" & intAno) ' Dia do trabalho varData(8) = CDate("07/09/" & intAno) ' Independência varData(9) = CDate("12/10/" & intAno) ' Padroeira do Brasil varData(10) = CDate("02/11/" & intAno) ' Finados varData(11) = CDate("15/11/" & intAno) ' Proclamação da República varData(12) = CDate("25/12/" & intAno) ' Natal '... Insira aqui os feriados regionais e altere o tamanho da matriz ' Verifica data For intConta = 0 To UBound(varData) If CDate(argData) = varData(intConta) Then feriado = True Exit Function End If Next Sair: Exit Function Err_Feriado: MsgBox "Erro: " & Err.Number & " - " & Err.Description Resume Sair End Function Feriados 2014 em Portugal Janeiro 1 Janeiro (4º feira) Dia de Ano Novo Março 4 Março (3ª feira) Carnaval Abril 18 Abril (6ª feira) Sexta-Feira Santa 20 Abril (domingo) Páscoa 25 Abril (6ª feira) Dia da Liberdade/25 de Abril Maio 1 Maio (5ª feira) Dia do Trabalhador Junho 10 Junho (3ª feira) Dia de Portugal Agosto 15 Agosto (6ª feira) Assunção de Nossa Senhora Dezembro 8 Dezembro (2ª feira) Dia da Imaculada Conceição 25 Dezembro (5ª feira) Natal Paredes - 16 de julho (3ª feira)
edsudani Posted September 8, 2013 at 04:22 PM Report #523835 Posted September 8, 2013 at 04:22 PM Boa tarde José Luis. Poste o código que você fêz até o momento e se houver erro, em que ponto ocorre. Assim fica mais fácil te ajudarem. Edison
José luis leal Posted September 9, 2013 at 08:23 AM Author Report #523880 Posted September 9, 2013 at 08:23 AM Bom dia! Edison o código que tenho é esse aí, o problema é que eu não consigo Alterar para os feriados Portugueses e deixar ele funcionando igual ao que está, Abs
sergio.costa Posted September 9, 2013 at 12:55 PM Report #523914 Posted September 9, 2013 at 12:55 PM Bom dia... pelo k entendi do código ele foi feito para alterar os feriados, ou seja, a matriz "varData", de 12 elementos (Dim Pascoa as Date, varData(12) as Date), guarda os dias feriados com formato do tipo date (dd/mm/aaaa). A funçao primeiro de tudo define a data da pascoa. Nao sei o metodo utilizado pelo autor e correcto ou nao pois faço a minima ideia d como isso se faz. Depois ele calcula os feriado moveis em funçao do dia da parcoa. (+x dias ou -x dias) Ex. varData (0) = Pascoa - 48 Depois introduz os feriados fixos um a um... Ex. varData (5) = CDate ("01/01/" & intAno) Basicamente o k tens e a alterar estas datas a tua maneira. Se precisares de mais feriados so tens de alterar o comprimento da matriz varData. Ex. Dim Pascoa as Date, varData (X) as Date Em k X e o mumero de elementos que queres. Espero k ajude
José luis leal Posted September 9, 2013 at 01:46 PM Author Report #523920 Posted September 9, 2013 at 01:46 PM (edited) Boa tarde! Muito obrigado pela ajuda, mas o problema ta em eu nao conseguir fazer essas alterações porque não sei, dava para você as fazer por mim Edited September 9, 2013 at 02:40 PM by José luis leal
sergio.costa Posted September 9, 2013 at 04:16 PM Report #523934 Posted September 9, 2013 at 04:16 PM Se leres bem o codigo vais encontrar isto: ' Define feriados móveis varData(0) = Pascoa - 48 ' Segunda-feira de Carnaval varData(1) = Pascoa - 47 ' Terça-feira de Carnaval varData(2) = Pascoa - 2 ' Paixão de Cristo varData(3) = Pascoa ' Páscoa varData(4) = Pascoa + 60 ' Corpus Christi ' Feriados Nacionais (lei 10.607/2002) varData(5) = CDate("01/01/" & intAno) ' Confraternização Universal varData(6) = CDate("21/04/" & intAno) ' Tiradentes varData(7) = CDate("01/05/" & intAno) ' Dia do trabalho varData(8) = CDate("07/09/" & intAno) ' Independência varData(9) = CDate("12/10/" & intAno) ' Padroeira do Brasil varData(10) = CDate("02/11/" & intAno) ' Finados varData(11) = CDate("15/11/" & intAno) ' Proclamação da República varData(12) = CDate("25/12/" & intAno) ' Natal '... Insira aqui os feriados regionais e altere o tamanho da matriz e é isto que tens de alterar... tens de ver quais sao os feriados moveis e quais os fixos
edsudani Posted September 10, 2013 at 02:11 AM Report #523956 Posted September 10, 2013 at 02:11 AM (edited) Boa noite José Luis. Como disse o colega Sérgio Costa os feriados fixos são listados como feriados nacionais e alguns feriados religiosos como Natal e Finados que têm data fixa. Os móveis são aqueles que não têm uma data fixa no calendário brasileiro, como por exemplo o Carnaval que pode ocorrer em fevereiro ou março. A páscoa tabém tem sua data deslocada ano a ano, o mesmo se dá com a Paixão de Cristo e o feriado de Corpus Cristi. Estes feriados móveis são calculados tendo por base um certo número de dias antes e depois da Páscoa. Feriados 2014 em Portugal Janeiro 1 Janeiro (4º feira) Dia de Ano Novo ------ o mesmo que Confraternização Universdal ; data fixa Março 4 Março (3ª feira) Carnaval ------------um certo nº de dias antes da páscioa Abril 18 Abril (6ª feira) Sexta-Feira Santa -------------um certo nº de dias antes da páscoa 20 Abril (domingo) Páscoa -----------------------------podes manter como referência 25 Abril (6ª feira) Dia da Liberdade/25 de Abril ---- data fixa Maio 1 Maio (5ª feira) Dia do Trabalhador---------data fixa Junho 10 Junho (3ª feira) Dia de Portugal ------data fixa Agosto 15 Agosto (6ª feira) Assunção de Nossa Senhora ------data fixa Dezembro 8 Dezembro (2ª feira) Dia da Imaculada Conceição ------data fixa 25 Dezembro (5ª feira) Natal -----data fixa Paredes - 16 de julho (3ª feira) ------data fixa Os feriados regionais são datas fixas como fundação de uma cidade ( elevação à categoria de Vila ou município) ou datas religiosas como padroeira de uma cidade. Exemplos: 22 de janeiro, data de fundação da primeira cidade no Brasil --- São Vicente. 08 de setembro, data da padroeira da cidade de Santos -- Nossa Senhora do Monte Serrat. Estes feriados regionais não valem para todo território nacional, mas somente para uma cidade em questão. O de 22 de janeiro só p/ São Vicente e o de 08 de setembro só p/ Santos. Aí em Portugal deve haver algo similar portanto não deverás encontrar muitas dificuldades em adaptar o código se tiveres calma e persistência. Ps:Não conheço as datas comemorativas em Portugal, portanto desculpe-me se errei quando anotei como fixas certas datas. Foi apenas com a intensão de auxiliar o raciocínio. Sucesso Edison Edited September 10, 2013 at 02:15 AM by edsudani
José luis leal Posted September 10, 2013 at 09:56 AM Author Report #523964 Posted September 10, 2013 at 09:56 AM Bom dia! acho que consegui alterar o código no que se refere ao dias feriados, mas agora surgiu outro problema, a função tá a dar valores errados e eu não consegui corrigir depois de muito tentar, dá para dar uma ultima ajuda e ver o que se passa? Vou anexar um pequeno ficheiro a exemplificar o que pretendo. Desde já as minhas desculpas pela ignorância e MUITO OBRIGADO. abs. http://www.sendspace.com/file/dmu47o
José luis leal Posted September 10, 2013 at 04:12 PM Author Report #524003 Posted September 10, 2013 at 04:12 PM Então Vizinho vai uma ajudinha?
sergio.costa Posted September 10, 2013 at 09:09 PM Report #524039 Posted September 10, 2013 at 09:09 PM (edited) Boa noite.... para ser sincero nao percebi qual o teu objectivo... tambem nao encontrei qualquer macro associada pelo que deves gravar o ficheiro em "Livro com permissão para Macros Excel" *.xlsm Edited September 10, 2013 at 09:10 PM by sergio.costa
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now