Macro para determinar una función que analice fechas y horas para aplicar retardos

Requiero establecer una función personalizada en vba, que me permita analizar las siguientes variables de fecha y hora:

De lunes a viernes el horario matutino es a las 07:00 horas. Y cuentan con 15:59 como tolerancia posterior al minuto 16:00 se aplica un retardo.

Sábados y domingos el ingreso matutino es a las 08:00 horas. Y de igual manera cuentan con 15:59 de tolerancia para aplicar retardo después del minuto 16:00

El ingreso nocturno corresponde a las 19:00 invariablemente de lunes a domingo con los 15:59 minutos de tolerancia.

Que dependiendo si la fecha corresponde de lunes a viernes antes de las 07:00 analice si el horario de ingreso obtiene un retardo después de 15 min osea 15:59

Si la fecha corresponde a sábado o domingo antes de las 08:00 analice si el horario de ingreso obtiene un retardo después de las 08:15:59

Y por ultimo si la hora de ingreso es a las 19:00 horas. De lunes a domingo analice el retardo después de los 15:59 minutos

Solo he logrado obtener que la macro coloque el día de la semana que corresponde a la fecha con un llamado a la aplicación day y un select case, pero no puedo avanzar con la sentencia if then

Aquí va el cuerpo de la macro hasta donde llevo

Function diasemana(dia As Date) As String

  Dim num_dia As Integer

  num_dia = Application.WorksheetFunction.Weekday(dia)

  Select Case num_dia

    Case 1

      diasemana = "Domingo"

    Case 2

      diasemana = "Lunes"

    Case 3

      diasemana = "Martes"

    Case 4

      diasemana = "Miércoles"

    Case 5

      diasemana = "Jueves"

    Case 6

      diasemana = "Viernes"

    Case 7

      diasemana = "Sábado"

    Case Else

      diasemana = "????"

    End Select

  End Function

1 Respuesta

Respuesta
1

Puedes explicar todo con ejemplos reales, si puedes pon una imagen de lo que tienes, procura que en la imagen se vean las filas y las columnas de excel.

Pon en los ejemplos todos los casos:

¿Si es lunes y matutino (cómo saber si tiene que registrarse a las 7 o a las 19?

Si es lunes y nocturno

Si es sábado y matutino

etc...

En la imagen se debe apreciar en alguna parte el resultado que esperas.

¿En la celda a analizar tienes la fecha y la hora?

¿O en una celda tienes la fecha y en otra celda tienes la hora?

Te anexo una fórmula para revisar si tiene retardo en el caso del turno matutino:

La fórmula funciona suponiendo que en la celda B2 tienes la fecha y en la celda D2 tienes la hora, entonces pon la siguiente fórmula en la celda D2

=SI(O(DIASEM(B2)=1, DIASEM(B2)=7), SI(C2>HORANUMERO("08:15:59"),"Retardo",""), SI(C2>HORANUMERO("07:15:59"),"Retardo",""))

Tienes que decirme cómo saber si es matutino o vespertino. Sin ese dato no se puede completar la fórmula o la función VBA.

Antes que nada muchas gracias por tu respuesta y las necesidades

Ante esto añado más detalles

Los horarios son para personal operativo, esto es que tienen un horario de 12 horas. De trabajo por 24 horas. De descanso, lo que no me puede dar la constante de periodo fijo por ser volátil, ejemplo: Nombre 1 lunes 07:00, Martes 19:00, Miércoles descansa, Jueves 07:00, Viernes 19:00, Sábado descansa, Domingo 08:00, Lunes 19:00.

Esto en la tendencia de que asistan en horario ordinario, si en algún caso existiera un cambio o cobertura de turno.

Se podría pre establecer los horarios en los cuales deben presentarse y a partir de esto realizar una comparativa para calificar la asistencia o retardo, sin embargo estaba buscando.

Por lo tanto lo buscado seria una función definida que permita solo analizar la fecha para extraer para el horario diurno de lunes a viernes 07:00 hasta las 07:15:59 y si es para el horario nocturno no importando el día la entrada será a las 19:00:00 hasta las 19:15:59

Total para ello seria establecer una fórmula que analizara así

Si Fecha=a lunes a viernes no es mayor a 07:15:59, "Asistencia", Si es mayor, "Retardo", Si fecha=a sábado y domingo a las 08:15:59, si es mayor "Retardo", Si Fecha y hora de lunes a domingo a 19:15:59, "Asistencia" si es mayor "Retardo"

Como verán la cadena de comprobación Si seria Muy larga y no dudo que se pudiese a completar, sin embargo mi objetivo era una UDF que con solo hacer referencia a la celda de fecha y a la celda de hora retornara el análisis algo así como =Asistencia(CeldaFecha, CeldaHora)

Nuevamente Gracias.

Te vuelvo a preguntar:

1. ¿En cuál columna tienes la fecha?

2. ¿En cuál columna tienes la hora?

3. ¿En cuál columna vas a identificar que es turno matutino?

Espero tus comentarios en ese orden

Te puedo entregar una fórmula o una macro, lo que quieras, pero sin esos 3 datos no es posible.

esta es una aplicación a la formula que desarrollaste, como veras la opción que analiza el horario de noche no aplica puesto que aunque esta en tolerancia de los 15 min. lo marca como error

Las columnas son o serán contiguas la formula debe analizar las dos variables variables puede ser en cualquier celda es por ello que requería una función programada para que fuera por ejemplo y solo por ejemplo 

=Asistencia(Celda de fecha[D2],Celda de hora[F2])

por ello no indico directamente cuales serán las celdas destino pero por ejemplo y solo por ejemplo serian las de arriba. 

Ahora la función personalizada en Vba al ejecutarla en excel (si gustas probarla) al hacer referencia a una celda que tenga una fecha arroja el dia en texto. lo que me falta es que analice la hora en función del dia y arroje la cadena de texto "Asistencia" o "Retardo" según el caso

aquí un ejemplo de la función: 

Es lo mismo que la función Diasem por defecto en Excel pero aplicando las cadenas de texto que corresponden luego del resultado analiza el caso de la hora debería ser con cadenas de If Then pero no he logrado hacerlo 

si se elabora una UDF la celda de fecha y la celda de hora serán del estilo variable

La fórmula que te envié aplica solamente para el horario matutino:

"Te anexo una fórmula para revisar si tiene retardo en el caso del turno matutino:"

Te vuelvo a preguntar.

1. ¿En cuál columna tienes la fecha? Deduzco que en la "D"

2. ¿En cuál columna tienes la hora? Deduzco que en la "E"

3. ¿En cuál columna vas a identificar que es turno matutino?

Si no pones un indicador de turno, no se puede verificar la hora. Ya se por fórmula o por UDF.

Te pongo un ejemplo.

Fecha                        Hora

12-jun-2015               10:00 am

Si no me dices cuál es el turno, puedo poner que es retardo; pero también puede ser que es del turno nocturno, entonces llegó muy temprano, pero no tiene retardo.

Para el breviario, con lo siguiente obtienes el día de la semana.

Pon una fecha en la celda D6

Ahora en otra celda pon esta fórmula:

=TEXTO(D6,"dddd")

Lo que te regresa es el día de la semana.

En VBA sería así:

Function dias(fec As Range)
'Por.Dante Amor
    dias = Format(fec, "dddd")
End Function

En la D6 pon una fecha, en otra celda escribe =dias(D6)

Y te regresa el día de la semana.

la cadena de celdas es la que vez ya que el horario es de 24 hrs. ¿Hay que agregar una columna mas para indicar si es matutino o vespertino el ingreso? Si es en la mañana la entrada es a las 07:00:00 con 15 minutos de tolerancia y en sábado o domingo la entrada es a las 08:00:00. para la tarde es invariable la entrada es a las 19:00:00 hrs. 

En el ejemplo que te indique esta como debe trabajar un empleado y sus horarios de ingreso y descansos.

Es correcto, tienes que agregar una columna para saber si está entrando en el turno matutino o vespertino.

¿Dime en cuál columna vas a poner ese indicador?

pues en ese caso seria recorrer la columna del resultado y colocar el turno y pues la verdad eso es lo mismo que colocarle a la par si entra a las 07:00 o a las 19:00

con la formula =SI.ERROR(SI(E2>(F2+0.011099537037037),"Retardo","Asistencia"),"Descanso")

es lo que hago pero creo que hay otras opciones. 

eso no facilita los análisis la verdad la solución de esta manera la tengo solo creo que se puede hacer de otra forma tal y como me lo demostraste resumiendo la función.

No entiendo esto : "pues en ese caso seria recorrer la columna del resultado y colocar el turno "

Lo que te estoy diciendo es que necesitas 3 datos, ejemplo:

Fecha                         Hora              Turno                  Función

1-jun-2015                7:25                Matutino               =fx()

1-jun-2015                19:25               Verpertino            =fx()

Si no estableces un dato "Matutino" o "Vespertino" por cada registro, no se puede saber si vas a verificar las 7:00 o las 19:00

Ya te puse otro ejemplo:

Fecha                        Hora

12-jun-2015               10:00 am

Si no me dices cuál es el turno, puedo poner que es retardo; pero también puede ser que es del turno nocturno, entonces llegó muy temprano, pero no tiene retardo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas