MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Cálculo de horas com intervalos

    Compartilhe

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qua 14 Jun 2017, 13:45

    Bom dia amigos! Antes de mais nada, já pesquisei no fórum vários exemplos desse assunto, mas minha falta de conhecimento não me permite enxergar uma solução para meu problema. Este tópico do fórum é exatamente o que preciso, porém foi dado como "Resolvido" sem uma solução do problema.

    Neste exemplo, o usuário informa a data inicial da tarefa e o tempo gasto, e recebe o valor da data final e hora final.

    No meu caso, queria informar a data inicial e final e receber o resultado em "tempo gasto".

    O tópico referido é esse:[Você precisa estar registrado e conectado para ver este link.]

    O código é esse:
    Código:
    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: [Você precisa estar registrado e conectado para ver este link.]
    '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("07:00")
    inicioCafe = converteHoraDouble("09:00")
    fimCafe = converteHoraDouble("09:15")
    inicioAlmoco = converteHoraDouble("11:30")
    fimAlmoco = converteHoraDouble("12:30")
    fimExpediente = converteHoraDouble("17:00")

    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

    Desde já, agradeço imensamente a ajuda dos amigos!!
    Anexos
    Expediente.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (32 Kb) Baixado 12 vez(es)
    avatar
    JPaulo
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9703
    Registrado : 04/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  JPaulo em Qua 14 Jun 2017, 14:23

    Você quer digitar a data inicial e final e receber o resultado em "tempo gasto".

    Mas quer levar também em consideração os intervalos (café, almoço, ect..) ???


    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver este link.]

    Sucesso e Bons Estudos
    Success and Good Studies

    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qua 14 Jun 2017, 14:28

    Bom dia mestre JPaulo! Correto, inclusive são exatamente os mesmos valores do código postado.

    Obrigado!

    inicioExpediente = converteHoraDouble("07:00")
    inicioCafe = converteHoraDouble("09:00")
    fimCafe = converteHoraDouble("09:15")
    inicioAlmoco = converteHoraDouble("11:30")
    fimAlmoco = converteHoraDouble("12:30")
    fimExpediente = converteHoraDouble("17:00")
    avatar
    JPaulo
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9703
    Registrado : 04/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  JPaulo em Qua 14 Jun 2017, 15:56

    Ok, minha sugestão é:

    No cabeçalho do código tem lá o email do Plinio, primeiramente entre em contacto com ele, depois se não conseguir ajuda, volte e dê um grito.


    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver este link.]

    Sucesso e Bons Estudos
    Success and Good Studies

    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]
    [Você precisa estar registrado e conectado para ver esta imagem.] [Você precisa estar registrado e conectado para ver este link.]

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qua 14 Jun 2017, 17:03

    Mestre JPaulo, obrigado pelo retorno. Já tinha feito isso. Estou no aguardo de um possível retorno por parte dele. De qualquer forma, caso eu não tenha um retorno, volto aqui e, se aparecer a solução, posto para ajudar os amigos que precisarem.

    Atualmente este cálculo é feito manualmente, e caso eu consiga essa solução, irá simplificar muito o processo.

    Muito obrigado!!
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  Alexandre Neves em Qua 14 Jun 2017, 22:25

    Boa noite
    Código:
    Function TempoGasto(argDataInicial As Date, argDataFinal As Date) As Variant
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '  código criado por Alexandre Neves, do Fórum MaximoAccess  '
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim horaInicial As Date, horaFinal As Date
        Dim inicioExpediente As Date, fimExpediente As Date
        Dim inicioCafe As Date, fimCafe As Date
        Dim inicioAlmoco As Date, fimAlmoco As Date
        Dim totalExpediente As Date
        Dim numeroDias As Integer
       
       
        'Configuração dos dados iniciais. Para personalizar
        'basta alterar os valores a serem utilizados.
        inicioExpediente = #7:00:00 AM#
        inicioCafe = #9:00:00 AM#
        fimCafe = #9:15:00 AM#
        inicioAlmoco = #11:30:00 AM#
        fimAlmoco = #12:30:00 PM#
        fimExpediente = #5:00:00 PM#
       
       
        totalExpediente = DateDiff("n", inicioExpediente, inicioCafe)
        totalExpediente = totalExpediente + DateDiff("n", fimCafe, inicioAlmoco)
        totalExpediente = totalExpediente + DateDiff("n", fimAlmoco, fimExpediente)
        numeroDias = DateDiff("d", argDataInicial, argDataFinal) + 1
        TempoGasto = numeroDias * totalExpediente
        TempoGasto = TempoGasto \ 60 & "h" & TempoGasto Mod 60 & "m"
    End Function


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qui 15 Jun 2017, 01:54

    Boa noite Alexandre Neves! Primeiramente, muito obrigado por sua ajuda. O resultado obtido com seu código foi esse da foto. [Você precisa estar registrado e conectado para ver este link.]

    Na caixa de texto, coloquei este código: =TempoGasto ([ini];[fim])
    Onde ini=data inicial e fim= data final
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  Alexandre Neves em Qui 15 Jun 2017, 14:14

    Boa tarde,
    Apenas pediu para introduzir as datas inicial e final, não referindo horas, julguei que pretendesse cálculo de dias completos
    veja com horas
    Código:
    Function TempoGasto(argDataInicial As Date, argHoraInicial As Date, argDataFinal As Date, argHoraFinal As Date) As Variant
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '  código criado por Alexandre Neves, do Fórum MaximoAccess  '
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim dtData As Date
        Dim inicioExpediente As Date, fimExpediente As Date
        Dim inicioCafe As Date, fimCafe As Date
        Dim inicioAlmoco As Date, fimAlmoco As Date
        Dim TempoPrimDia As Date, TempoUltDia As Date, totalExpediente As Date
        Dim numeroDiasCompletos As Integer
       
        If argDataInicial = argDataFinal And argHoraFinal < argHoraInicial Then
            MsgBox "O fim não pode ser antes do início."
            Exit Function
        End If
        'Configuração dos dados iniciais. Para personalizar
        'basta alterar os valores a serem utilizados.
        inicioExpediente = #7:00:00 AM#
        inicioCafe = #9:00:00 AM#
        fimCafe = #9:15:00 AM#
        inicioAlmoco = #11:30:00 AM#
        fimAlmoco = #12:30:00 PM#
        fimExpediente = #5:00:00 PM#
       
        For dtData = argDataInicial To argDataFinal
            If dtData = argDataInicial Then
                If argDataInicial = argDataFinal Then
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        Select Case argHoraFinal
                        Case Is < inicioExpediente
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("n", inicioExpediente, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioCafe
                        Select Case argHoraFinal
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimCafe
                        Select Case argHoraFinal
                        Case Is < fimCafe
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioAlmoco
                        Select Case argHoraFinal
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimAlmoco
                        Select Case argHoraFinal
                        Case Is < fimAlmoco
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimExpediente
                        Select Case argHoraFinal
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, fimExpediente)
                        End Select
                    End Select
                Else
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < inicioCafe
                        TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimCafe
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < inicioAlmoco
                        TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimAlmoco
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimExpediente
                        TempoPrimDia = DateDiff("n", argHoraInicial, fimExpediente)
                    End Select
                End If
            ElseIf dtData = argDataFinal Then
                Select Case argHoraFinal
                Case Is < inicioExpediente
                Case Is < inicioCafe
                    TempoUltDia = DateDiff("n", inicioExpediente, argHoraFinal)
                Case Is < fimCafe
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                Case Is < inicioAlmoco
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, argHoraFinal)
                Case Is < fimAlmoco
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, inicioAlmoco)
                Case Is < fimExpediente
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, inicioAlmoco)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimAlmoco, argHoraFinal)
                End Select
            Else
                numeroDiasCompletos = numeroDiasCompletos + 1
            End If
        Next
       
        totalExpediente = totalExpediente + DateDiff("n", inicioExpediente, inicioCafe)
        totalExpediente = totalExpediente + DateDiff("n", fimCafe, inicioAlmoco)
        totalExpediente = totalExpediente + DateDiff("n", fimAlmoco, fimExpediente)
       
        TempoGasto = TempoPrimDia + numeroDiasCompletos * totalExpediente + TempoUltDia
        TempoGasto = TempoGasto \ 60 & "h" & TempoGasto Mod 60 & "m"
    End Function


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qui 15 Jun 2017, 17:35

    Boa tarde Alexandre Neves! Te agradeço muito pela boa vontade e ajuda. Fiz alguns testes com o código que você postou e realmente é perfeito. Um único detalhe que pude observar é que quando a hora de inicio é na parte da manhã, não está sendo incluída no total tempo gasto.

    Por favor, perdoe minha insistência, mas realmente não tenho conhecimento para tentar alguma alteração no código.
    [Você precisa estar registrado e conectado para ver este link.]
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  Alexandre Neves em Qui 15 Jun 2017, 18:00

    Boa tarde,
    Veja agora
    Código:
    Function TempoGasto(argDataInicial As Date, argHoraInicial As Date, argDataFinal As Date, argHoraFinal As Date) As Variant
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '  código criado por Alexandre Neves, do Fórum MaximoAccess  '
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim dtData As Date
        Dim inicioExpediente As Date, fimExpediente As Date
        Dim inicioCafe As Date, fimCafe As Date
        Dim inicioAlmoco As Date, fimAlmoco As Date
        Dim TempoPrimDia As Date, TempoUltDia As Date, totalExpediente As Date
        Dim numeroDiasCompletos As Integer
       
        If argDataInicial = argDataFinal And argHoraFinal < argHoraInicial Then
            MsgBox "O fim não pode ser antes do início."
            Exit Function
        End If
        'Configuração dos dados iniciais. Para personalizar
        'basta alterar os valores a serem utilizados.
        inicioExpediente = #7:00:00 AM#
        inicioCafe = #9:00:00 AM#
        fimCafe = #9:15:00 AM#
        inicioAlmoco = #11:30:00 AM#
        fimAlmoco = #12:30:00 PM#
        fimExpediente = #5:00:00 PM#
       
        For dtData = argDataInicial To argDataFinal
            If dtData = argDataInicial Then
                If argDataInicial = argDataFinal Then
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        Select Case argHoraFinal
                        Case Is < inicioExpediente
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("n", inicioExpediente, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioCafe
                        Select Case argHoraFinal
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimCafe
                        Select Case argHoraFinal
                        Case Is < fimCafe
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioAlmoco
                        Select Case argHoraFinal
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimAlmoco
                        Select Case argHoraFinal
                        Case Is < fimAlmoco
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimExpediente
                        Select Case argHoraFinal
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("n", argHoraInicial, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("n", argHoraInicial, fimExpediente)
                        End Select
                    End Select
                Else
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        TempoPrimDia = DateDiff("n", inicioExpediente, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < inicioCafe
                        TempoPrimDia = DateDiff("n", argHoraInicial, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimCafe
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < inicioAlmoco
                        TempoPrimDia = DateDiff("n", argHoraInicial, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimAlmoco
                        TempoPrimDia = TempoPrimDia + DateDiff("n", fimAlmoco, fimExpediente)
                    Case Is < fimExpediente
                        TempoPrimDia = DateDiff("n", argHoraInicial, fimExpediente)
                    End Select
                End If
            ElseIf dtData = argDataFinal Then
                Select Case argHoraFinal
                Case Is < inicioExpediente
                Case Is < inicioCafe
                    TempoUltDia = DateDiff("n", inicioExpediente, argHoraFinal)
                Case Is < fimCafe
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                Case Is < inicioAlmoco
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, argHoraFinal)
                Case Is < fimAlmoco
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, inicioAlmoco)
                Case Is < fimExpediente
                    TempoUltDia = DateDiff("n", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimCafe, inicioAlmoco)
                    TempoUltDia = TempoUltDia + DateDiff("n", fimAlmoco, argHoraFinal)
                End Select
            Else
                numeroDiasCompletos = numeroDiasCompletos + 1
            End If
        Next
       
        totalExpediente = totalExpediente + DateDiff("n", inicioExpediente, inicioCafe)
        totalExpediente = totalExpediente + DateDiff("n", fimCafe, inicioAlmoco)
        totalExpediente = totalExpediente + DateDiff("n", fimAlmoco, fimExpediente)
       
        TempoGasto = TempoPrimDia + numeroDiasCompletos * totalExpediente + TempoUltDia
        TempoGasto = TempoGasto \ 60 & "h" & TempoGasto Mod 60 & "m"
    End Function


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qui 15 Jun 2017, 19:55

    Boa tarde Alexandre Neves! Muito, mais muito obrigado mesmo pela paciência e ajuda. Ficou perfeito. Mais uma vez muito obrigado!! cheers
    Abraço!
    [Você precisa estar registrado e conectado para ver este link.]

    "A essência do saber não está em somar verdades ou em subtrair incertezas e sim em compartilhar o conhecimento compreendido"
    Diego Góes

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qui 15 Jun 2017, 19:57

    Faltou resolvido! Very Happy
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  Alexandre Neves em Qui 15 Jun 2017, 21:55

    Novamente
    Detectei 1 erro e eliminei as horas, minutos e segundos a zero
    Código:
    Function TempoGasto(argDataInicial As Date, argHoraInicial As Date, argDataFinal As Date, argHoraFinal As Date) As Variant
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '   código criado por Alexandre Neves, do Fórum MaximoAccess   '
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim dtData As Date
        Dim inicioExpediente As Date, fimExpediente As Date
        Dim inicioCafe As Date, fimCafe As Date
        Dim inicioAlmoco As Date, fimAlmoco As Date
        Dim TempoPrimDia As Long, TempoUltDia As Long, totalExpediente As Long
        Dim numeroDiasCompletos As Integer
        
        If argDataInicial = argDataFinal And argHoraFinal < argHoraInicial Then
            MsgBox "O fim não pode ser antes do início."
            Exit Function
        End If
        'Configuração dos dados iniciais. Para personalizar
        'basta alterar os valores a serem utilizados.
        inicioExpediente = #7:00:00 AM#
        inicioCafe = #9:00:00 AM#
        fimCafe = #9:15:00 AM#
        inicioAlmoco = #11:30:00 AM#
        fimAlmoco = #12:30:00 PM#
        fimExpediente = #5:00:00 PM#
        
        For dtData = argDataInicial To argDataFinal
            If dtData = argDataInicial Then
                If argDataInicial = argDataFinal Then
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        Select Case argHoraFinal
                        Case Is < inicioExpediente
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("s", inicioExpediente, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioCafe
                        Select Case argHoraFinal
                        Case Is < inicioCafe
                            TempoPrimDia = DateDiff("s", argHoraInicial, argHoraFinal)
                        Case Is < fimCafe
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimCafe
                        Select Case argHoraFinal
                        Case Is < fimCafe
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("s", fimCafe, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("s", fimCafe, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", fimCafe, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < inicioAlmoco
                        Select Case argHoraFinal
                        Case Is < inicioAlmoco
                            TempoPrimDia = DateDiff("s", argHoraInicial, argHoraFinal)
                        Case Is < fimAlmoco
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioAlmoco)
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", argHoraInicial, inicioAlmoco)
                            TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimAlmoco
                        Select Case argHoraFinal
                        Case Is < fimAlmoco
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", fimAlmoco, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", fimAlmoco, fimExpediente)
                        End Select
                    Case Is < fimExpediente
                        Select Case argHoraFinal
                        Case Is < fimExpediente
                            TempoPrimDia = DateDiff("s", argHoraInicial, argHoraFinal)
                        Case Else
                            TempoPrimDia = DateDiff("s", argHoraInicial, fimExpediente)
                        End Select
                    End Select
                Else
                    Select Case argHoraInicial
                    Case Is < inicioExpediente
                        TempoPrimDia = DateDiff("s", inicioExpediente, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                    Case Is < inicioCafe
                        TempoPrimDia = DateDiff("s", argHoraInicial, inicioCafe)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                    Case Is < fimCafe
                        TempoPrimDia = DateDiff("s", fimCafe, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                    Case Is < inicioAlmoco
                        TempoPrimDia = DateDiff("s", argHoraInicial, inicioAlmoco)
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                    Case Is < fimAlmoco
                        TempoPrimDia = TempoPrimDia + DateDiff("s", fimAlmoco, fimExpediente)
                    Case Is < fimExpediente
                        TempoPrimDia = DateDiff("s", argHoraInicial, fimExpediente)
                    End Select
                End If
            ElseIf dtData = argDataFinal Then
                Select Case argHoraFinal
                Case Is < inicioExpediente
                Case Is < inicioCafe
                    TempoUltDia = DateDiff("s", inicioExpediente, argHoraFinal)
                Case Is < fimCafe
                    TempoUltDia = DateDiff("s", inicioExpediente, inicioCafe)
                Case Is < inicioAlmoco
                    TempoUltDia = DateDiff("s", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("s", fimCafe, argHoraFinal)
                Case Is < fimAlmoco
                    TempoUltDia = DateDiff("s", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("s", fimCafe, inicioAlmoco)
                Case Is < fimExpediente
                    TempoUltDia = DateDiff("s", inicioExpediente, inicioCafe)
                    TempoUltDia = TempoUltDia + DateDiff("s", fimCafe, inicioAlmoco)
                    TempoUltDia = TempoUltDia + DateDiff("s", fimAlmoco, argHoraFinal)
                End Select
            Else
                numeroDiasCompletos = numeroDiasCompletos + 1
            End If
        Next
        
        totalExpediente = totalExpediente + DateDiff("s", inicioExpediente, inicioCafe)
        totalExpediente = totalExpediente + DateDiff("s", fimCafe, inicioAlmoco)
        totalExpediente = totalExpediente + DateDiff("s", fimAlmoco, fimExpediente)
        
        TempoGasto = TempoPrimDia + numeroDiasCompletos * totalExpediente + TempoUltDia
        TempoGasto = TempoGasto \ 3600 & "h" & TempoGasto \ 60 Mod 60 & "m" & TempoGasto Mod 60 & "s"
        If Left(TempoGasto, 2) = "0h" Then TempoGasto = Mid(TempoGasto, 3)
        If Right(TempoGasto, 3) = "m0s" Then TempoGasto = Mid(TempoGasto, 1, Len(TempoGasto) - 2)
        If TempoGasto Like "*h0m*" Then TempoGasto = Mid(TempoGasto, 1, InStr(1, TempoGasto, "h")) & Mid(TempoGasto, InStr(TempoGasto, "m") + 1)
    End Function


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    ictsp
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 02/09/2016

    Re: [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp em Qui 15 Jun 2017, 23:24

    Alexandre Neves, simplesmente perfeito!! Muito obrigado por compartilhar tamanho conhecimento!! cheers

      Data/hora atual: Ter 21 Nov 2017, 17:35