Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

José luis leal

Alterar Còdigo

Mensagens Recomendadas

José luis leal

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)

Editado por Rui Carlos
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
edsudani

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
José luis leal

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sergio.costa

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
José luis leal

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

Editado por José luis leal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sergio.costa

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
edsudani

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

Editado por edsudani

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
José luis leal

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sergio.costa

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

Editado por sergio.costa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.