Calcular horas entre dos fechas diferentes

Tengo el siguiente Formulario en el cual deseo obtener el numero de horas que ha laborado un trabajador, a partir de allí deseo obtener las horas ordinarias laboradas y las horas extras:

Pero en realidad el problema que enfrento es cuando el trabajador entra a trabajar en la noche y sale del trabajo al día siguiente.

En el ejemplo del formulario; deseo obtener en la Variable "tiempo" las 9 horas que trabajo el empleado, pero no he podido. He utilizado un código que halle en un foro:

Option Compare Database
Option Explicit
Dim xH_Ingreso As Date
Dim xH_Salida As Date
Dim tiempo As Date
Private Sub cmd_Calcular_Click()
xH_Ingreso = Me.txtHor_Ing.Value
xH_Salida = Me.txtHor_Sal.Value
'si la fecha de Salida es igual a la fecha de ingreso...
If Me.txtFech_Sal.Value = Me.txtFech_Ing.Value Then
    tiempo = xH_Ingreso - xH_Salida
Else
    tiempo = 24:00:00 - xH_Ingreso + xH_Salida
End If
End Sub

...Pero me manda error en 24:00:00

y me gustaría que el resultado fuera: tiempo= 9:00 a. M.

Agradezco de antemano su ayuda.

Los nombres de los cuadros de texto son:

Fecha Ingreso "txtFech_Ing"

Hora Ingreso "txtHor_Ing"

Fecha Salida "txtFech_Sal"

Hora Salida "txtHor_Sal"

Botón Calcular "cmd_Calcular"

Intente probando con: tiempo2 = DateDiff("h", txtFech_Ing, txtFech_Sal) pero no me sirve dado que necesito el numero de horas exacto que trabajaba el empleado.

Dejo el link aquí: Descargar Base de Datos Aquí

Respuesta
2

Hecha un vistazo a estos dos ejemplos, en ellos tienes la solución:

http://bit.ly/2is6h8W 

http://bit.ly/2hzbFme 

Los ejemplos tienen el código ampliamente comentado para que se pueda entender fácilmente.

¡Gracias! Espero entenderlo y adaptarlo a no que necesito.

Si no terminas de entender el código, siempre puedes calcular la diferencia usando la combinación de fecha y hora (que es lo que se hace en los ejemplos que te indico). Es decir, simplemente usa esto:

Dim laEntrada As Date
Dim laSalida As Date
Dim tiempo As Long
Private Sub cmd_Calcular_Click()
  laEntrada = CDate(Me.txtHor_Ing.Value & " " & Me.txtFech_Ing)
  laSalida = CDate(Me.txtHor_Sal.Value & " " & Me.txtFech_Sal)
  tiempo = DateDiff("h", laEntrada, laSalida)
End Sub

Y el valor de tiempo lo pasas a donde quieras. Fíjate que esa variable la tengo declarada como Long (valdría Integer o incluso Byte), pero no tiene mucho sentido declararla como Date, porque el resultado de la función DateDiff siempre será un número y no una fecha.

¡Gracias! En cualquier caso, Te Molestare nuevamente si algo se me sale de las manos.

Sin problema, puedes encontrarme por aquí o en Dudas Access Foro.

Tu Código lo Adapte así.

Option Compare Database
Option Explicit
'==================================
'Variables Generales de Asignacion.
Dim xH_Ingreso As Date
Dim xH_Salida As Date
Dim xFech_INGRESO As Date
Dim xFech_SALIDA As Date
Dim xHS_Descanso As Date
Dim xHR_Descanso As Date
Dim xFech_S_Descanso As Date
Dim xFech_R_Descanso As Date
Const IJLDiurna = #6:00:00 AM# 'Inicio Jornada Laboral Diurna
Const IJLNocturna = #9:00:00 PM# 'Inicio Jornada Laboral Nocturna
'==================================
'**************************************
'Varibles de Calculo Horas Nocturnas...
Dim NumHorasNocturnas As Double
Dim NumHorasDescansoNocturnas As Double
Dim NunDias As Integer
Dim xMiComprobacion As Double
Dim HorasLaboradasNoche As Double
'**************************************
'Dim xH_Laboradas As Date
'Dim xTotal_HOL As Date
'Dim xDiurnas_HOL As Date
'Dim xNocturnas_HOL As Date
'Dim xTotal_HEL As Date
'Dim xDiurnas_HEL As Date
'Dim xNocturnas_HEL As Date
'Dim xValor_Trab_Noct As Double
'Dim xValor_Trab_Ext_Diurno As Double
'Dim xValor_Trab_Ext_Noct As Double
'Dim xValor_Trab_Total As Double
'Dim xJornada_Nocturna As Date 'Horas Laboradas Nocturnas
'Dim xJornada_Diurna As Date 'Horas Laboradas Diurnas
Private Sub cmd_Cargar_Click()
'::::::::::::::::::::::::::::::::::::::::::::
'Asignacion de Valores a Variables Generales.
xFech_INGRESO = Me.Fech_INGRESO2.Value
xFech_SALIDA = Me.Fech_SALIDA2.Value
xH_Ingreso = Me.H_INGRESO2.Value
xH_Salida = Me.H_SALIDA2.Value
xFech_S_Descanso = Me.Fech_S_DESCANSO2.Value
xFech_R_Descanso = Me.Fech_R_DESCANSO2.Value
xHS_Descanso = Me.H_S_DESCANSO2.Value
xHR_Descanso = Me.H_R_DESCANSO2.Value
'::::::::::::::::::::::::::::::::::::::::::::
'============================================================================================================================
'Calculo de Horas Nocturnas...
NunDias = DateDiff("d", xFech_INGRESO, xFech_SALIDA)
If NunDias = 0 Then
    If (xH_Ingreso < IJLDiurna And xH_Salida < IJLDiurna) Or (xH_Ingreso >= IJLNocturna And xH_Salida >= IJLNocturna) Then
        NumHorasNocturnas = DateDiff("n", xH_Ingreso, xH_Salida) / 60
    ElseIf xH_Ingreso >= IJLDiurna And xH_Ingreso < IJLNocturna And xH_Salida >= IJLDiurna And xH_Salida < IJLNocturna Then
        NumHorasNocturnas = 0
    Else
        If xH_Ingreso < IJLDiurna Then
            NumHorasNocturnas = DateDiff("n", xH_Ingreso, IJLDiurna) / 60
        End If
        If xH_Salida > IJLNocturna Then
            NumHorasNocturnas = NumHorasNocturnas + DateDiff("n", IJLNocturna, xH_Salida) / 60
        End If
    End If
Else
    'Calculamos las horas nocturnas del día de entrada
    If xH_Ingreso < IJLDiurna Then
        NumHorasNocturnas = DateDiff("n", xH_Ingreso, IJLDiurna) / 60
        'Si entra a Trabajar entre las 09:00:00 p.m. y las 12:00:00 a.m. (Medianoche)
    ElseIf xH_Ingreso >= IJLNocturna And xH_Ingreso >= #12:00:00 AM# Then
        xMiComprobacion = (DateDiff("n", #12:00:00 AM#, xH_Ingreso)) / 60 'prueba mia
        NumHorasNocturnas = (1440 - DateDiff("n", #12:00:00 AM#, xH_Ingreso)) / 60
    Else
        NumHorasNocturnas = 3
    End If
    'Calculamos las horas nocturnas del día de salida, sumándolas a las que ya teníamos
    If xH_Salida < IJLDiurna Then
        NumHorasNocturnas = NumHorasNocturnas + DateDiff("n", #12:00:00 AM#, xH_Salida) / 60
    ElseIf xH_Salida >= IJLNocturna Then
        NumHorasNocturnas = NumHorasNocturnas + 6 + DateDiff("n", IJLNocturna, xH_Salida) / 60
    Else 'Si la Salida del trabajador es antes de las 9:00:00 p.m. sumamos 5 Horas Laborales Nocturnas Ordinarias.
        NumHorasNocturnas = NumHorasNocturnas + 6
    End If
    'Si la salida se produce con más de un día de diferencia, hay que añadirle 8 horas por día
    If NunDias > 1 Then
        NumHorasNocturnas = NumHorasNocturnas + 8 * (NunDias - 1)
    End If
End If
MsgBox NumHorasNocturnas
'Final de Calculo de Horas Nocturnas...
'============================================================================================================================
End sub

Pero Tengo una Duda: antes aclaro, en Colombia la Jornada Diurna es desde las 6:00 am hasta las 9:00 pm y la Nocturna es desde las 9:00 pm hasta las 6:00 am del dia siguiente.

Entonces mi duda es: 

Una persona entra a trabajar a el día 06/06/2019 a las 06:00:00 p.m. hasta el dia siguiente 07/06/2019 a las 07:00:00 am.

debo calcular:

1. las Horas Diurnas Ordinarias que son: 3 ( de 6 a 9 de la noche).

2. Las Horas Nocturnas Ordinarias "Para Completar la Jornada Ordinaria Laboral que es de 8 horas" las cuales serian las siguientes 5 horas (9 a 2 de la madrugada)

3. las horas que quedan desde las 2 hasta las 6 de la mañana que son 4 tengo que almacenarlas en Horas Extra Nocturnas y...

5. la Hora que queda de 6 a 7 de la mañana debo almacenarla en Horas Extras Diurnas.

Mi pregunta es si ¿dentro del mismo código que adapte en la parte de arriba puedo hacer todos estos cálculos o eventualmente me corresponde hacer otro fragmento de código aparte?

Sí, claro que puedes hacer todos esos cálculos. Si miras el segundo ejemplo que te enviaba en mi primera respuesta, verás que en él se calculan las horas que se trabaja en los turnos de mañana, tarde y noche dadas una fecha y hora de entrada y de salida. Solo has de seguir la mecánica y adaptarla a tus necesidades concretas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas