Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Por rit
Posts
#49482
Boa tarde,

O Jimmy fez esse código para mim separar a quantidade de horas por turno levando com base a hora inicio e fim, é uma function funciona muito bem, porem quando eu tenho a situação de que a a hora inicio e a hora fim são coisas que nao existem ele me trazer a informação errada por exemplo..

uma parada que começa as 00:00:00 do dia 20/10/2019 e termina na hora 23:59:59 do dia 20/10/2019 ele me trazer muitas horas.. sendo que era pra nao trazer nada... nesses casos..

Preciso de ajuda para ajustar esse problema alguem pode me auxliar?
Código: Selecionar todos
Function Turnos(Ini As Double, Fim As Double, Tur)
    Dim TI(1 To 3), TF(1 To 3)
    TI(1) = TimeValue("05:00:00"):     TF(3) = TI(1)
    TI(2) = TimeValue("13:30:00"):     TF(1) = TI(2)
    TI(3) = TimeValue("22:00:00"):     TF(2) = TI(3)
    
    Hora = Ini - Int(Ini)
    TI(Tur) = Int(Ini) + TI(Tur) - (Hora > TI(Tur))
    TF(Tur) = Int(Ini) + TF(Tur) - (Hora > TF(Tur))
    If TF(Tur) < TI(Tur) Then Soma = 1 Else Soma = 0
    Turnos = 0
    Do While Soma < 2
        If Soma = 1 Then
            Soma = 0
            If Fim < TF(Tur) Then TF(Tur) = Fim: Soma = 9
            If TF(Tur) < Ini Then Exit Do
            Turnos = Turnos + (TF(Tur) - Ini)
            Ini = TF(Tur): TF(Tur) = TF(Tur) + 1
        Else
            Soma = 1
            Ini = TI(Tur): TI(Tur) = TI(Tur) + 1
        End If
    Loop
End Function
Avatar do usuário
Por Jimmy
Avatar
#49486
Olá Rit,
uma parada que começa as 00:00:00 do dia 20/10/2019 e termina na hora 23:59:59 do dia 20/10/2019 ele me trazer muitas horas.. sendo que era pra nao trazer nada... nesses casos..
Porque era pra não trazer nada? Foram quase 24h (faltou 1 segundo) de parada. Não entendi o porque. Poderia explicar menlhor?

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Por rit
Posts
#49503
Na verdade eu me equivoquei ali na informação, o que acontece é o seguinte dia 20 é um domingo, então no sabado eu não tenho tempo full 24hrs.. a minha semana é das 22:30 de domingo até 13:30 de sabado.. ai ta dando pau ali.. voce consegue me ajudar com isso?

Fazer sempre que for domingo ele começar das 22:30.. e sempre que for sabado ele considerar apenas até as 13:30.. algumas vezes vai ter horario entre esse tempo ai não sei como tratar...

Será que da pra por uma condição?
Avatar do usuário
Por Jimmy
Avatar
#49511
Agora entendi!

Vou olhar o código e tentar contornar isso. Te respondo até sexta.

Nas mensagens que colaboram para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Avatar do usuário
Por Jimmy
Avatar
#49531
Rit,

Uma pergunta: você disse que no sábado vai até 13:30h, que é justamente o horário de término do turno 2. Até aqui Ok.

Disse também que no domingo, a semana começa às 22:30h, que difere um pouco do início do turno 3, que normalmente inicia 22:00h. É isso mesmo? No domingo o turno 3 inicia meia hora mais tarde que nos demais dias da semana?

Nas mensagens que colaboram para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Avatar do usuário
Por Jimmy
Avatar
#49647
Olá Rit,

Sim, podemos. Estou terminando.
Tive um problema com arredondamentos que me custaram alguns neurônios, mas estou finalizando.

Ainda hoje posto.

Pergunta: Você vê possibilidade de ter que contabilizar esse tempo do final de semana, em alguma situação? Por exemplo, um domingo em que se trabalhou em caráter de emergência? Se for possível, podemos incluir um parâmetro opcional na Funcção, que indicaria se esse tempo deve ou não ser contabilizado, e se for omitido o padrão pode ser "não contabilizar". O que acha disso?

Jimmy San Juan
Editado pela última vez por Jimmy em 28 Out 2019 às 13:02, em um total de 1 vez.
Por rit
Posts
#49648
Em alguns finais de semana sim iremos trabalhar.Se não for algo complicado seria interessante ter isso na função.
Avatar do usuário
Por Jimmy
Avatar
#49652
Não é complicado. Esta é a hora de pensar nas possibilidades e facilitar a operação, pois algo que não pensemos nesse instante, será um peso e gerará falta de produtividade durante muito tempo. Claro que dentro do limite do possível. Pra saber se é ou não, pode perguntar.

Vou fazer isso. Pense se há mais alguma coisa.

Jimmy San Juan
Por rit
Posts
#49667
Não, se fizer com essas variaveis:

Sabado até as 13:00
domingo começa as 22:30
algumas vezes iremos trabalhar no final de semana..

é para atender 99% aqueles 1% é se aparecer algo de novo que eu não enxergo.
Avatar do usuário
Por Jimmy
Avatar
#49672
Olá rit,

Segue o código. Teste sem piedade.

Estou assumindo que no seu post passado, escreveu 13:00h quando na verdade queria dizer 13:30h. Correto ou mudou?

Os 3 parâmetros da função continuam os mesmos (Data e hora inicial, Data e hora final, e Turno), mas agora tem um quarto parâmetro que deve ser Verdadeiro ou Falso, mas que é opcional. Se for especificado Verdadeiro, o final de semana será domado. Se for espeficifado Falso, ou não informado, o final de semana não será contabilizado.
Código: Selecionar todos
Function Turnos(Ini As Double, Fim As Double, Tur, Optional FDS As Boolean = False)
    
    'Os parâmetros são: Data ie hora nicial / Data e hora final / turno (de 1 a 3) / Final de semana
    'Se FDS (4º parâmetro opcional) for VERDADEIRO irá somar entre sáb 13:00 - Dom 22:30. O padrão é não somar
    
    Dim TI(1 To 3), TF(1 To 3)
    TI(1) = TimeValue("05:00:00"):     TF(3) = TI(1)    'Turno 1
    TI(2) = TimeValue("13:30:00"):     TF(1) = TI(2)    'Turno 2
    TI(3) = TimeValue("22:00:00"):     TF(2) = TI(3)    'Turno 3
    
    TVDET = TimeValue("22:30:00")   'Horário de retorno ao trabalho no domingo
    HIn = Round(Ini - Int(Ini), 8): HTI = Round(TI(Tur), 8): HTF = Round(TF(Tur), 8) 'Horas arredondadas
    
    TI(Tur) = Int(Ini) + TI(Tur) - (HIn > TI(Tur))
    TF(Tur) = Int(Ini) + TF(Tur) - (HIn > TF(Tur))
    If TF(Tur) >= TI(Tur) Then Ini = TI(Tur): TI(Tur) = TI(Tur) + 1

    Turnos = 0
    Do While Parar = ""
        If Fim < Ini Then Exit Do
        If Fim < TF(Tur) Then TF(Tur) = Fim:   Parar = "S"
        
        Dia = Weekday(Ini, vbSaturday)
        HIn = Round(Ini - Int(Ini), 8): If HIn >= 1 Then HIn = HIn - 1
        TVDET = Int(Ini) + TVDET - Int(TVDET)  'TVDET assume o dia do INI, mantendo a hora
        If FDS <> True And _
           ((Dia = 1 And (Tur = 2 Or (Tur = 3 And HIn >= HTI))) Or _
            (Dia = 2 And (Tur = 2 Or (Tur = 3 And HIn < HTF) Or Tur = 1))) _
                        Then Soma = 0 _
                        Else Soma = (TF(Tur) - Ini)
        'Como o turno 3 inicia 22:00, e no domingo inicia 22:30, para domingo subtrai 0:30h
        If FDS <> True And (Dia = 2 And (Tur = 3 And HIn >= HTF)) And Ini < TVDET Then
            If TF(Tur) < TVDET Then Soma = Soma - (TF(Tur) - Ini) _
                               Else Soma = Soma - (TVDET - Ini)
        End If
        
        Turnos = Turnos + Soma
        Ini = TI(Tur):   TI(Tur) = TI(Tur) + 1:   TF(Tur) = TF(Tur) + 1
    Loop
End Function
Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Por rit
Posts
#49680
Bom dia Jimmy,

Cara esse código vai ajudar de mais apenas a parte do trabalhar aos fins de semana queria tirar uma duvida é possivel voce colocar isso para ele ver automatico? quando for fim de semana se tiver hora entre 13:00 de sabado até 22:30 de domingo ele conta se não houver ele nao conta.. por eu tenho 335000 linhas para inserir essa função, só para voce entender eu estou fazendo uma analise de maquina parada por turno, eu tenho o inicio o fim e a quantidade de hora parada motivo etc.. só não tinha o turno por que o meu sistema se limitou a isso e a implementação do turno vai demorar ainda, então essa função que voce fez vai ajudar muita gente e ver o gargalo das coisas..

uma outra duvida eu consigo usar essa function em uma tabela? escrever a função em uma celula e ele replicar para as outras? não esta dando certo, só funciona se eu fizer individual tem algum motivo para isso?
Por rit
Posts
#49682
Na verdade 100% ja, acabei de descobrir que a gente ignora tudo entre 13:00 sabado e 22:30 domingo... código atende 100% muito obrigado!
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord