Sum and display more than 24 hours hours in Access 2007 VBA

Asked

Viewed 938 times

0

I’m using Access 2007 to develop a garage control form, which contains information about trips made by drivers. I need to calculate the total time of each trip, and that period can be longer than 24 hours. I was able to calculate without problems when the period is less than 24 hours, but I noticed that the Access Date/Time field cannot store the information I need in this situation. Calculated time field information is stored in text format.

Follows my code

Calculation of Common Hours:

Private Sub txtHoraChegada_LostFocus()
Dim HoraChegada As Date
Dim HoraSaida As Date
Dim HoraTotal As Date
Dim DataViagem As Date
Dim HorasCalculadas
Dim DiasCalculados

DataViagem = Me.txtDataViagem.Value
HoraChegada = Me.txtHoraChegada.Value
HoraSaida = Me.txtHoraSaida.Value

If HoraChegada < HoraSaida Then 'Verifica se a Hora de Chegada é MENOR que a Hora de Saída
    If HoraChegada = 0 Then 'Verifica se a Hora de Chegada foi meia noite
        HoraChegada = 24
        HoraTotal = DateAdd("h", HoraChegada, HoraSaida)
        DiasCalculados = DateAdd("d", 1, DataViagem)
    End If
    HoraTotal = ((HoraChegada - HoraSaida) + 24) * (-1)
    DiasCalculados = DateAdd("d", 1, DataViagem)
    MsgBox "O período da viagem é maior que 24h, a data de chegada foi ajustada", vbInformation, "Atenção" 'Mensagem ao usuário
End If

If HoraChegada = HoraSaida Then 'Verifica se a Hora de Chegada é igual à Hora de Saída
    HoraTotal = 24
    Dias = 1
    DiasCalculados = DateAdd("d", 1, DataViagem)
End If

If HoraChegada > HoraSaida Then 'Verifica se a Hora de Chegada é Maior que a Hora de Saída
    HoraTotal = HoraChegada - HoraSaida
    DiasCalculados = DataViagem
End If

Me.txtQtdeDias = Dias
Me.txtDuracaoTotal.Value = Format(HoraTotal, "hh:nn") 'Imprime o valor calculado da duração da viagem na caixa de texto
Me.txtDataChegada.Value = DiasCalculados 'Imprime a data de chegada do motorista na caixa de texto

End Sub

I made a button that should add an extra day (or 24h) to the previously calculated hours

Private Sub btnMaisDias_Click()
  dteStart = txtDataViagem
  dteEnd = txtDataChegada
  Call DisplayHours((dteStart), (dteEnd))

End Sub

And this is the function called by the button (gives division error by zero)

Public Function DisplayHours(dteStart As Date, dteEnd As Date) As String
    Dim lngMin As Long, lngHrs As Long
    lngMin = DateDiff("n", dteStart, dteEnd)
    lngHrs = lngMin / 60
    DisplayHours = lngHrs & ":" & Format(lngMin Mod lngHrs, "00")

End Function

I am relatively beginner in programming, someone can identify what I am doing wrong?

1 answer

0

According to some information I found out there, the Access Date/Time field is unable to store a value greater than 24 hours, so I took a different approach. I transformed the field into a text field and made the calculation as follows.

Private Sub txtHoraChegada_LostFocus()
Dim HoraChegada As Date
Dim HoraSaida As Date
Dim HoraTotal As Date
Dim DataViagem As Date
Dim HorasCalculadas
Dim DiasCalculados
Dim horas, minutos
Dim interval

DataViagem = Me.txtDataViagem
HoraChegada = Me.txtHoraChegada
HoraSaida = Me.txtHoraSaida
DataChegada = Me.DataChegada

        If HoraChegada < HoraSaida Then 'Verifica se a Hora de Chegada é MENOR que a Hora de Saída
            If HoraChegada = 0 Then 'Verifica se a Hora de Chegada foi meia noite
                HoraChegada = 24
                HoraTotal = DateAdd("h", HoraChegada, HoraSaida)
                DiasCalculados = DateAdd("d", 1, DataViagem)
            End If
            HoraChegada = HoraChegada + 24
            HoraTotal = DateDiff("n", HoraSaida, HoraChegada)
        End If

        If HoraChegada = HoraSaida Then 'Verifica se a Hora de Chegada é igual à Hora de Saída
            HoraTotal = 24
            Dias = 1
            DiasCalculados = DateAdd("d", 1, DataViagem)
        End If

        If HoraChegada > HoraSaida Then 'Verifica se a Hora de Chegada é Maior que a Hora de Saída
            HoraTotal = HoraChegada - HoraSaida
            DiasCalculados = DataViagem
        End If


        interval = HoraChegada - HoraSaida
        Dias = DateDiff("d", DataViagem, DataChegada)
        horas = DateDiff("n", HoraViagem, HoraChegada)
        minutos = Int(CSng(interval * 1440)) Mod 60

        If Dias > 0 Then
            Me.txtDuracaoTotal.Value = Dias & " d " & Format(HoraTotal, "hh") & " h " & minutos & " m"
        Else
            Me.txtDuracaoTotal.Value = Format(HoraTotal, "hh") & " h " & minutos & " m"
        End If
        txtDuracaoTotal.SetFocus
End Sub

Browser other questions tagged

You are not signed in. Login or sign up in order to post.