MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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


3 participantes

    [Resolvido]Cálculo de horas com intervalos

    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

    [Resolvido]Cálculo de horas com intervalos Empty [Resolvido]Cálculo de horas com intervalos

    Mensagem  ictsp 14/6/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:https://www.maximoaccess.com/t5932-resolvidocalculo-de-horas

    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: 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("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
    [Resolvido]Cálculo de horas com intervalos AttachmentExpediente.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (32 Kb) Baixado 42 vez(es)
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  JPaulo 14/6/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.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    [Resolvido]Cálculo de horas com intervalos Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Cálculo de horas com intervalos Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Cálculo de horas com intervalos Folder_announce_new Instruções SQL como utilizar...
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 14/6/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")
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  JPaulo 14/6/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.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    [Resolvido]Cálculo de horas com intervalos Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Cálculo de horas com intervalos Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Cálculo de horas com intervalos Folder_announce_new Instruções SQL como utilizar...
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 14/6/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!!
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Alexandre Neves 14/6/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
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 15/6/2017, 01:54

    Boa noite Alexandre Neves! Primeiramente, muito obrigado por sua ajuda. O resultado obtido com seu código foi esse da foto. [Resolvido]Cálculo de horas com intervalos Foto10

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


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Alexandre Neves 15/6/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
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 15/6/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.
    [Resolvido]Cálculo de horas com intervalos Foto_210
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Alexandre Neves 15/6/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
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 15/6/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!
    [Resolvido]Cálculo de horas com intervalos Foto_310

    "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
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 15/6/2017, 19:57

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


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Alexandre Neves 15/6/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
    avatar
    ictsp
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  ictsp 15/6/2017, 23:24

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

    Conteúdo patrocinado


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

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 28/3/2024, 18:30