RE:DESAFIO:Formula para horas personal
Federico me ha comentado que la función VBA que a continuación expongo le ha funcionado perfectamente. Para todos los que la necesiten ...
------------inicio del código--------------
Function HorasTrabajo(HEntrada As Date, HSalida As Date, QTipoHora As String) As Integer
'Calcula las horas trabajadas y devuelve la cantidad de horas según QTipoHora.
'El empleado debe hacer un mínimo de horas -var HorasNormales- para que se contabilicen
'las horas extra
'El tipo de horas (TipoHoras) está definido por las variables HNormalI, HNormalF
'Sólo funciona con horas enteras
'::: QTipoHora : Tipo de hora a calcular
'::: HEntrada : Hora a la que comienza a trabajar
'::: HSalida : Hora a la que sale de trabajar
'---------------------------------------------------------------------------
Dim HorasDiaTipo(24) As String
Dim TipoHoras(4, 2)
Dim CIni(2) As Integer
Dim CFin(2) As Integer
Dim Limite(2) As Integer
Dim i, j, NCiclos As Integer
'
'Constantes que pueden ser parámetros
Const HorasNormales As Integer = 8
Const HNormalI As Integer = 6 ' Desde las 6:00 es Diaria
Const HNormalF As Integer = 20 ' Hasta las 20:59 es Diaria
'
'Asignacion de variables
TipoHoras(0, 0) = "TOTAL"
TipoHoras(1, 0) = "NOCTURNA"
TipoHoras(2, 0) = "NOCTURNA50"
TipoHoras(3, 0) = "NORMAL"
TipoHoras(4, 0) = "NORMAL50"
For i = 0 To 4
TipoHoras(i, 1) = 0
Next i
For i = 0 To 24
Select Case i
Case HNormalI To HNormalF
HorasDiaTipo(i) = "NORMAL"
Case Else
HorasDiaTipo(i) = "NOCTURNA"
End Select
Next i
' HEntrada del cálculo
' Día normal
CIni(1) = Hour(HEntrada)
CFin(1) = Hour(HSalida)
Limite(1) = 23
NCiclos = 1
' Si hay cambio de día (la hora de salida es menor que la de entrada)
If CIni(1) > CFin(1) Then
'Prepara dos ciclos de cálculo
' Primer ciclo cálculo
CIni(1) = Hour(HEntrada)
CFin(1) = 24
Limite(1) = 24
' Segundo ciclo cálculo
CIni(2) = 0
CFin(2) = Hour(HSalida)
Limite(2) = 23
NCiclos = 2
End If
'
'Calcula las horas para todos los tipos de horas
For Ciclo = 1 To NCiclos
'Recorre el día
For i = 0 To Limite(NCiclos)
' Si la hora del día está dentro del rango de horas trabajadas
If i >= CIni(Ciclo) And i < CFin(Ciclo) Then
' Incrementa una hora en la Suma Todas las horas
TipoHoras(0, 1) = TipoHoras(0, 1) + 1
' Localiza el tipo de hora, normal o nocturna
For j = 1 To 4
If HorasDiaTipo(i) = TipoHoras(j, 0) Then
'Controla suma de horas Normales y Nocturnas si >= 8
If (TipoHoras(1, 1) + TipoHoras(3, 1)) >= HorasNormales Then
'Caso de ser cierto, incrementa el valor de J para asignarlo
' a las del 50%
j = j + 1
End If
'Suma las horas según el tipo detectado
TipoHoras(j, 1) = TipoHoras(j, 1) + 1
Exit For
End If
Next j
End If
If i >= CFin(Ciclo) Then Exit For
Next i
Next Ciclo
'
'Localiza las horas según el tipo solicitado
For i = 0 To 4
If UCase(QTipoHora) = TipoHoras(i, 0) Then
Exit For
End If
Next i
'Transfiere las horas del tipo indicado a la función
HorasTrabajo = TipoHoras(i, 1)
End Function
-----------fin del código-------------------
Es posible que algunas líneas queden en dos o más líneas en el post. Tened en cuenta esto por si aparece algún error.
Saludos a todos.
José Luis