Calcular Horas Com Dias Diferentes, como somar horas quando os dias são diferentes |
![]() ![]() |
Calcular Horas Com Dias Diferentes, como somar horas quando os dias são diferentes |
Jul 19 2010, 09:50 AM
Post
#1
|
|
|
Analista ![]() ![]() ![]() ![]() Grupo: Moderadores Posts: 419 Registrado: 2-July 08 De: Muriaé - MG Membro N°: 4 |
Olá,
Não há necessidade de um módulo exclusivo para a função. Você pode colocá-la dentro de um módulo já exitente em seu sistema. Fica a seu critério. No meu caso eu costumo agrupar as funções que trabalham com datas em um módulo, as financeiras em outro e por aí vai. Fica mais fácil pra eu localizar. Quanto a atrapalhar a função do Roberto, creio que não atrapalhe. |
|
|
|
Jul 19 2010, 08:08 AM
Post
#2
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Oi, Nelson.
Bom dia! Devo estar fora esta semana, pelo menos até quarta (21.07) e assim que voltar vou testar este código que me passou. Basta apenas criar um módulo com ele? Já estou usando o código que o Roberto me passou. Atrapalha alguma coisa? Obrigado pela força. Celso Garcia |
|
|
|
Jul 16 2010, 04:26 PM
Post
#3
|
|
|
Analista ![]() ![]() ![]() ![]() Grupo: Moderadores Posts: 419 Registrado: 2-July 08 De: Muriaé - MG Membro N°: 4 |
Olá,
Eu tenho aqui uma função que formata intervalos entre datas, veja se ajuda: CODE Function FormatInterval(ByVal Interval As Variant, Fmt As String)
' Formats the difference between two dates or sum of two times ' to show day as well as hours, minutes, and seconds. ' ' Supports the following formats: ' D H 5 Days 5 Hours ' D H:MM 5 Days 5:15 ' D HH:MM 5 Days 05:15 ' D H:MM:SS 5 Days 5:15:45 ' D HH:MM:SS 5 Days 05:15:45 ' H M 125 Hours 15 Minutes ' H:MM 125:15 ' H:MM:SS 125:15:45 ' M S 7515 Minutes 45 Seconds ' Dim Days As Long, Hours As Long, Minutes As Long, Seconds As Long ' ' Check for Date or Double ' If varType(Interval) <> 7 And varType(Interval) <> 5 Then Exit Function ' ' Parse Days ' Days = Int(Interval) Interval = Interval - Days If Interval > #11:59:59 PM# Then Days = Days + 1 Interval = 0# End If ' ' Parse Hours ' Interval = Interval * 24 Hours = Int(Interval) Interval = Interval - Hours If Interval > 3599# / 3600# Then Hours = Hours + 1 Interval = 0# End If ' ' Parse Minutes ' Interval = Interval * 60 Minutes = Int(Interval) Interval = Interval - Minutes If Interval > 59# / 60# Then Minutes = Minutes + 1 Interval = 0# End If ' ' Parse Seconds ' Seconds = Int(Interval * 60 + 0.5) ' ' Normalize ' If Seconds = 60 Then Minutes = Minutes + 1 Seconds = 0 End If If Minutes > 59 Then Hours = Hours + 1 Minutes = Minutes - 60 End If If Hours > 23 Then Days = Days + 1 Hours = Hours - 24 End If ' ' Create format ' Select Case Fmt Case "D H" FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & IIf(Hours <> 1, " Hours", " Hour") Case "D H:MM" FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & ":" & Format(Minutes, "00") Case "D HH:MM" FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Format(Hours, "00") & ":" & Format(Minutes, "00") Case "D H:MM:SS" FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00") Case "D HH:MM:SS" FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Format(Hours, "00") & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00") Case "H M" Hours = Hours + Days * 24 FormatInterval = Hours & IIf(Hours <> 1, " Hours ", " Hour ") & Minutes & IIf(Minutes <> 1, " Minutes", " Minute") Case "H:MM" Hours = Hours + Days * 24 FormatInterval = Hours & ":" & Format(Minutes, "00") Case "H:MM:SS" Hours = Hours + Days * 24 FormatInterval = Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00") Case "M S" Minutes = Minutes + (Hours + Days * 24) * 60 FormatInterval = Minutes & IIf(Minutes <> 1, " Minutes ", " Minute ") & Seconds & IIf(Seconds <> 1, " Seconds", " Second") Case Else FormatInterval = Null End Select End Function |
|
|
|
Jul 16 2010, 04:09 PM
Post
#4
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Ok, Roberto.
Vou fazer isso, sim. Caso eu tenha dúvidas vou te pedir ajuda, mas entendi o que fazer. Obrigado. Celso Garcia |
|
|
|
Jul 16 2010, 03:07 PM
Post
#5
|
|
|
Programador ![]() ![]() ![]() Grupo: Membros Posts: 197 Registrado: 3-July 08 De: Fraiburgo-SC Membro N°: 11 |
Celso,
Você pode formatar assim sem problemas se for apenas para exibição. Para efetuar cálculos você teria que fazer uma modificação achando a fração dos minutos e segundos para o caso de valor/hora. Exemplo: CODE fracao_minutos = minutos / 60 fracao_segundos = segundos / 3600 HoraCalculo = Horas + fracao_minutos + fracao_segundos Veja um exemplo de função que já calcula o custo do total, bastando informar a Hora Chegada,Hora Saída e o Valor da Hora. CODE Public Function CalculaCustoTotal(HI As Date, HF As Date, ValorHora As Double) As Double On Error Resume Next Intervalo = HF - HI vdf = CDate(HF) vdi = CDate(HI) Interval = vdf - vdi Horas = Int(CSng(Interval * 24)) minutos = Int(CSng(Interval * 1440)) Mod 60 segundos = Int(CSng(Interval * 86400)) Mod 60 fracao_minutos = minutos / 60 fracao_segundos = segundos / 3600 HoraCalculo = Horas + fracao_minutos + fracao_segundos CalculaCustoTotal = FormatNumber(HoraCalculo * ValorHora, 2) End Function Uso na consulta: CODE CustoTotal: CalculaCustoTotal([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA];12,3)
|
|
|
|
Jul 16 2010, 10:47 AM
Post
#6
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Oi, Roberto.
Bom dia! Por gentileza, me esclarece uma dúvida. Eu formatei o campo INTERVALO como Hora Abreviada (00:00) e não surtiu efeito. Então formatei no "módulo criado" assim: Public Function CalculaIntervalo(HI As Date, HF As Date) As String On Error Resume Next Intervalo = HF - HI vdf = CDate(HF) vdi = CDate(HI) Interval = vdf - vdi Horas = Int(CSng(Interval * 24)) minutos = Int(CSng(Interval * 1440)) Mod 60 segundos = Int(CSng(Interval * 86400)) Mod 60 CalculaIntervalo = Horas & " : " & Format(Interval, "nn") End Function Não tem problema, né? Outra dúvida: Posso utilizar o campo INTERVALO para cálculos? Por exemplo: INTERVALO 08:50 * R$ 12,30 (custo por hora) Obrigado Celso Garcia |
|
|
|
Jul 15 2010, 02:29 PM
Post
#7
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Oi, Roberto.
Eu passei a manhã inteira tentando inverter a função para que desse certo e não estava conseguindo. Na realidade para se saber o total de horas gastas temos que diminuir a Hora de Saída da Hora de Chegada, ou seja, [HORA CHEGADA] - [HORA SAÍDA] = TOTAL HORAS GASTAS e agora, neste teu post, você me deu a solução. Eu fiz esta inversão (que eu não havia feito) assim: Intervalo: CalculaIntervalo([SAIDA] & " " & [HORA SAIDA];[CHEGADA] & " " & [HORA CHEGADA]) e deu certíssimo. Já fiz alguns testes e não encontrei nenhum erro. O arquivo "TESTE HORAS" está para download caso alguém se interesse em tirar as dúvidas ou usá-lo como exemplo. Muito obrigado, Roberto, valeu pela força e por sua paciência, meu amigo. (IMG:style_emoticons/default/rolleyes.gif) Celso Garcia (IMG:style_emoticons/default/rolleyes.gif) |
|
|
|
Jul 15 2010, 01:50 PM
Post
#8
|
|
|
Programador ![]() ![]() ![]() Grupo: Membros Posts: 197 Registrado: 3-July 08 De: Fraiburgo-SC Membro N°: 11 |
Celso,
Você deve estar invertendo a entrada dos Parâmetros na Função. Na minha Função você deve passar primeiro a Data e Hora de Chegada assim: CODE Intervalo: CalculaIntervalo([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA]) Ou verifique na função se você não trocou a ordem de subtração das variáveis. |
|
|
|
Jul 15 2010, 10:30 AM
Post
#9
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Oi, Roberto.
Bom dia! Obrigado por sua paciência em me explicar. Fiz como você citou e deu certo. Inclusive não estou mais usando os campos TOTALDIA e TOTALHORA que substitui pelo campo INTERVALO. Um detalhe não bateu: No INTERVALO (cálculo das horas) ele resulta em negativo ( -17 horas : -33 minutos : 0 segundos) e quando os horários tem minutos ( ex. 07:10 ou 17:00 ) ele acresce 01 hora. Exemplo: data saída 15.07.2010 data chegada 16.07.2010 (dia seguinte) ................hora saída 07:00 hora chegada 07:10 ................total de horas: 24:10 hrs ... mas no INTERVALO ele resulta em -25:10 hrs ............se mesmas datas ................hora saída 07:10 hora chegada 07:00 ................total de horas: 23:50 hrs mas no INTERVALO ele resulta em -24:50 hrs Estou tentando inverter e entender este resultado, mas tá meio difícil... Tem alguma coisa que eu possa arrumar por aqui? Grato, Celso Garcia |
|
|
|
Jul 14 2010, 03:46 PM
Post
#10
|
|
|
Programador ![]() ![]() ![]() Grupo: Membros Posts: 197 Registrado: 3-July 08 De: Fraiburgo-SC Membro N°: 11 |
Celso,
Para testar essa função faz assim: Cole a seguinte função em um novo módulo acessando: Menu-Criar-Macro-Módulo CODE Public Function CalculaIntervalo(HI As Date, HF As Date) As String On Error Resume Next Intervalo = HF - HI vdf = CDate(HF) vdi = CDate(HI) interval = vdf - vdi Horas = Int(CSng(interval * 24)) minutos = Int(CSng(interval * 1440)) Mod 60 segundos = Int(CSng(interval * 86400)) Mod 60 CalculaIntervalo = "Horas: " & Horas & " Minutos: " & minutos & " Segundos: " & segundos End Function Salve e adicione um novo campo na sua Consulta que está vinculada no Formulário assim: CODE Intervalo: CalculaIntervalo([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA]) Teste e modifique de acordo com sua necessidade. |
|
|
|
Jul 14 2010, 03:11 PM
Post
#11
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Olá, Roberto.
Boa Tarde! Não estou conseguindo colocar este código. No campo TotalDia eu abri o evento em "SUJO" e colei. Creio que esteja errado. Tomei a liberdade de colocá-lo no 4Shared, caso você possa dar uma olhada. http://www.4shared.com/file/y5JFrVsV/TESTE_HORAS.html De qualquer modo, obrigado pela atenção Celso Garcia |
|
|
|
Jul 14 2010, 02:04 PM
Post
#12
|
|
|
Programador ![]() ![]() ![]() Grupo: Membros Posts: 197 Registrado: 3-July 08 De: Fraiburgo-SC Membro N°: 11 |
Teste esse código:
CODE Private Sub CalculaIntervalo() Intervalo = Me.HORA_SAIDA - Me.HORA_CHEGADA vdf = CDate(Me.HORA_SAIDA) vdi = CDate(Me.HORA_CHEGADA) interval = vdf - vdi horas = Int(CSng(interval * 24)) minutos = Int(CSng(interval * 1440)) Mod 60 segundos = Int(CSng(interval * 86400)) Mod 60 MsgBox "Horas: " & horas & vbCrLf & "Minutos: " & minutos & vbCrLf & "Segundos: " & segundos End Sub Ou veja esse tópico: Calcular Horas |
|
|
|
Jul 14 2010, 10:21 AM
Post
#13
|
|
|
Calouro ![]() Grupo: Membros Posts: 18 Registrado: 1-December 09 De: Zona Sul - São Paulo - SP - Brasil Membro N°: 2.300 |
Olá, amigos.
Bom dia! Estou sem saber o que fazer. Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 01.07.2010 (mesmo dia) às 17:00hrs o total é de 09:00hrs trabalhadas. (já consegui fazê-lo) Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 02.07.2010 (dia seguinte) às 03:00hrs o total é de 17:00hrs trabalhadas. (também já consegui fazê-lo) Usei o seguinte caminho: Entrei no designe do formulário, fui em Editar Lista de Campos e criei um campo com esta fórmula: TOTAL HORAS: SeImed([HORA CHEGADA]>[HORA SAIDA];[HORA CHEGADA]-[HORA SAIDA];([24 HORAS]-[HORA SAIDA]+[acerto])+[HORA CHEGADA]) Agora me surgiu um problema e não consegui resolvê-lo: Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 02.07.2010 (dia seguinte) às 17:00hrs o total é de 31:00hrs trabalhadas. Como tenho dois campos DataSaída e Data Chegada, eu tentei subtrair o DataChegada e o DataSaída que deu certo. Consigo converter os dias (1 dia neste caso * 24) e aparece no campo TOTAL DIAS o número 24. Porém, quando tento somar estes 24 + as horas trabalhadas dá erro O que eu posso fazer? Grato, Celso Garcia |
|
|
|
![]() ![]() |
| Versão Simples | Horário: 7th September 2010 - 10:30 AM |