top of page
Foto del escritorSistema MRP

Control de asistencia en Excel y VBA

Actualizado: 13 dic 2019


Hola emprendedores y entusiastas productivos. En este artículo vamos a realizar un formulario para el registro de asistencia de personal con Excel y VBA. Por medio de este formulario se podrá registrar la asistencia de la nómina de trabajo, la misma podría estar relacionada de manera automática con las multas que incumplan los trabajadores por incurrir en atrasos, además estar asociada a una base de datos de justificaciones por faltas de un trabajador en un periodo dado; la asistencia refleja los días reales laborados por cada empleado, lo que se contabiliza en el rol de pagos, mismo que forma parte de los costos indirectos de fabricación.


Bien, en este artículo se tratará 3 temas íntimamente relacionados a la asistencia de personal y son los siguientes:


* Formulario de registro de asistencia de personal.

* Código añadido al registro de asistencia para determinar multas automáticamente.

* Formulario para la relación de la asistencia con una base de datos de justificaciones.


En el mercado existen relojes de asistencia biométricos los cuales serían la primera opción para hacer el registro automático del personal, pues desde los mismos se pueden enviar los datos a libros de Excel; si este no se pudiera conseguir por A o B motivo, se puede optar por una opción semiautomática más económica, por Excel y VBA.

Así entonces, vamos con el procedimiento para el desarrollo del reloj de asistencia.


1. Base de datos de nómina y claves de acceso

Se debe tener la plantilla de nombres que forman parte del proyecto o de la compañía, estos pueden ser asignados como rangos dinámicos y ser asociados a un nombre. Una ilustración que muestra una forma en que deben introducirse los datos de nómina es la siguiente:



Si deseas observar detalladamente el esquema del formulario y el código antes mostrado puedes ir al siguiente enlace:Base de datos en Excel para nómina.

A la vez que se crea la base de datos para nómina, se debe colocar el password o clave de acceso que tendrá el personal para el registro de su asistencia.


2. Creación de formulario

Vamos ahora con la elaboración de un formulario para asignar el registro de asistencia, como se observa en la gráfica siguiente:


Registro de asistencia de personal en Excel y VBA
Reloj de asistencia en Excel y VBA

La elaboración del diseño de un formulario en Vissual Basic es bastante sencillo, basta con seguir los pasos a continuación:

- Abrir Excel.

- Abrir Vissual Basic (Alt+F11) o en su defecto, click en la pestaña programador y click en Vissual Basic. Si no lo tienes activado, vamos a archivo, personalizar cinta de opciones, en la parte pestañas principal seleccionar Desarrollador, click en agregar y aceptar.

- En el entorno Vissual Basic (VBA) click en la pestaña ver, click en explorador de proyectos si no se tiene activado.

- Click en la pestaña Insertar, User Form.

- Click en la pestaña ver, ventana propiedades, en el caso de tenerla abierta.

- Click en la pestaña ver, cuadro de herramientas, en caso de no tenerla abierta.

- Modificar las esquinas del User Form abierto, para hacer más grande o más pequeño el espacio del formulario.

- Con el cuadro de herramientas activo, añadir los diferentes elementos para disponer un formulario personalizado como el mostrado anteriormente (si pasamos el cursor por las herramientas nos muestra el nombre de la herramienta).


Vamos a ver qué hacen los diferentes campos del cuadro de herramienta en el formulario anterior:

* Label 1 o Etiqueta 1: Muestra la fecha actual.

* Label 2 o Etiqueta 2: Muestra la hora actual.

* Label 3 o Etiqueta 3: Muestra el nombre de la persona a quien corresponde el password.

* Label 4 o Etiqueta 4: Muestra el cargo de la persona.

* Text box o caja de texto: Muestra las horas que han sido asignadas por el trabajador(a) y no pueden ser modificadas.

* Button o Botón: Registra las diferentes horas del día.

* Frame o Marco: Asocia los diferentes campos para que actúen en conjunto y no de forma aislada.


Esta es una forma de realizar un formulario para registro de asistencia, los diferentes usuarios podrán personalizarlo a sus necesidades.


3. Codificación VBA

Los formularios deben contener controladores de error para guiar al usuario y generar una correcta entrada de datos. Los casilleros de horas deben estar bloqueados contra escritura, y serán de lectura solamente, pues aquí se mostrará la hora real de los diferentes tiempos. Los diferentes códigos se anotan con diferentes eventos dentro del formulario. Para ir dentro del formulario y colocar el código completo asociado al mismo basta con hacer click derecho en el formulario o UserForm y click en ver código. Bien, observemos parte del código que contendrá este formulario, específicamente cuando se necesite añadir el registro de asistencia para la hora de entrada, y el tiempo señalado en las etiquetas 1 y 2:


Añadir Tiempo real a las etiquetas 1 y 2:

 

Public exitTime As Double


Private Sub UserForm_Initialize()


'Formato de la fecha y hora

Label1.Caption = Time

Label1.FontSize = 16

Label1.ForeColor = vbBlack


'Optimizar la ejecución de la macro

Application.ScreenUpdating = False


'Nombre del formulario o UserForm: Reloj Marcador

RELOJMARCADOR.Label1.Caption = Time


'Variable de salida

exitTime = Now + TimeValue("00:00:01")


Application.OnTime exitTime, "reloj"


Label2.Caption = Format(Now, "dd/mm/yyyy")

Label2.FontSize = 16

Label2.ForeColor = vbBlack


End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

'Función para el reloj marcador

If CloseMode = 0 Then

exitTime = Now + TimeValue("00:00:01")

Application.OnTime exitTime, "reloj"

Application.OnTime exitTime, "reloj", , False

End If

End Sub

 

Los nombres de las etiquetas, textbox o formularios se lo modifica en la ventana de propiedades en la parte (Name), las mismas se encuentran de color café en el código anterior.


Registro de la Hora de entrada

 

Private Sub CommandButton1_Click() 'Botón de la hora de ingreso


' Control de error : Si no hay usuario a quien buscar

If nombre.Caption = "" Then

MsgBox ("No existe un nombre para registrar la hora de de ingreso"), vbCritical

Exit Sub

End If


'Colocar la hora

hingreso.Text = TimeValue(Now)

hingreso.FontSize = 14


'Guardar la hora de ingreso

Sheets("BD").Select 'Hoja del libro

For i = 7 To 1000000 'Número de Fila

If Cells(i, 84).Value = "" Then 'Número de Columna

Cells(i, 84).Value = Format(Now, "mm/dd/yyyy")

Cells(i, 85).Value = nombre.Caption

Cells(i, 86).Value = Label9.Caption

Cells(i, 87).Value = TimeValue(Now)


Exit For

End If

Next


MsgBox ("Hora de ingreso almacenada" & vbNewLine & "Bienvenido(a) " & nombre.Caption), vbInformation

End sub

 

Así mismo los casilleros y etiquetas pueden reemplazarse por otros nombres; debemos recordar que los formularios deben contener otros controladores de error para evitar una incorrecta entrada de datos. Los otros botones de hora de break, hora del fin del break y hora de salida pueden tener un código similar, pero sin olvidar de colocar controladores de error, que indudablemente representan una guía del usuario para una correcta entrada de datos.


4. Establecer política por multas

La organización puede establecer multas por atrasos, los cuales si no son justificados se podrían reflejar en el rol de pagos del personal, siempre y cuando se decida ejecutar este tipo de políticas. Si este es el caso se podría primero asignar las variables que entran en este tipo de táctica. Observemos la siguiente tabla:

Control de asistencia y multas en Excel y VBA
Control de asistencia y multas en Excel

Los espacios en gris son aquellas variables que se pueden modificar, pero siempre manteniendo el mismo formato, pues si vamos a relacionarlo con una fórmula integrada a una macro esta no podrá ejecutarse de igual forma si su formato varía.

Esta tabla nos dice lo siguiente:

La hora de entrada es a las 8:00 AM y la salida es a las 14:00 PM. El tiempo de atraso máximo en la hora de entrada es de 5 minutos. Es decir, si la persona llega a las 8:05:00 minutos, esta persona llegará tarde e incurrirá en 4 tipos de atraso:

* Si llega hasta con 30 minutos de atraso, la multa será del 30% sobre su sueldo diario.

* Si llega de 30 minutos a 1 hora de atraso, la multa será del 40% sobre su sueldo diario.

* Si llega de 1 hora a 2 horas de atraso, la multa será del 50% sobre su sueldo diario.

* Si llega con más de 2 horas de atraso, la multa será del 100% sobre su sueldo diario.

Asimismo, la tabla indica que el tiempo de descanso (break) es de 1 hora, si la persona llega con más de 1 hora de descanso podría incurrir 3 tipos de multas:

* Si llega hasta con 15 minutos de atraso, la multa será del 30% sobre su sueldo diario.

* Si llega de 16 minutos a 30 minutos de atraso, la multa será del 50% sobre su sueldo diario.

* Si llega con más de 30 minutos de atraso, la multa será del 85% sobre su sueldo diario.

Ahora bien, tenemos que el sueldo diario es el simple cálculo del sueldo base dividido para el periodo de cálculo, en este caso, 30 días.

Como se puede observar, existen varias combinaciones en que la multa exceda el 100%, esto podría modificarse para no verse como "rajatabla", o en su defecto, verse como una manera de mejorar la puntualidad; esto ya es una forma de perspectiva y por lo tanto depende enteramente de la administración.


5. Asignar fórmulas para asociar variables

Como se ha observado, hay dos tipos de multas en los atrasos, para la hora de entrada y para la hora de descanso. Por lo tanto, hay dos fórmulas para asociar las variables anteriormente vistas.


Multa entrada

Podemos realizar una forma anidada como la presente u otra que el usuario observe.

Notas:

* Las políticas anteriormente observadas se pueden encontrar en una hoja del libro de cálculo, en este caso se llama "PLANDECUENTAS". Las variables se denotan en las celdas que se observan a continuación:

Control de asistencia de personal y multas en Excel y VBA
Control de asistencia y multas en Excel

* La hora de entrada, se asigna en una celda, en este caso la GP7.

* El nombre de la persona se asigna en una celda, en este caso la GN7.

* El sueldo base de la persona, está en el rango de búsqueda de la nómina de personal BD!$BD$7:$CA$1000; posición en la columna 24.


Con estas premisas, se presenta una forma de anidar la información en una fórmula:

=SI.ERROR(SI(Y(GP7-PLANDECUENTAS!$EN$3>PLANDECUENTAS!$EN$13;GP7-PLANDECUENTAS!$EN$3<=PLANDECUENTAS!$EN$5);(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$5;SI(Y(GP7-PLANDECUENTAS!$EN$3<=PLANDECUENTAS!$EN$6;GP7-PLANDECUENTAS!$EN$3>PLANDECUENTAS!$EN$5);(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$6;SI(Y(GP7-PLANDECUENTAS!$EN$3>PLANDECUENTAS!$EN$6;GP7-PLANDECUENTAS!$EN$3<=PLANDECUENTAS!$EN$7);(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$7;SI(GP7-PLANDECUENTAS!$EN$3>PLANDECUENTAS!$EN$7;(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$8;0))));"HAY ERROR")


Las variables de la política por multas se presenta con color café.


Multa por hora de descanso

Las premisas son exactamente las mismas, excepto para GQ7 Y GR7, las cuales representan la hora inicial de descanso, y la hora final del descanso respectivamente. Con ello, se presenta la fórmula como sigue:


=SI.ERROR(SI(Y(GR7-GQ7>PLANDECUENTAS!$EN$12;GR7-GQ7<=PLANDECUENTAS!$EN$9);(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$9;SI(Y(GR7-GQ7>PLANDECUENTAS!$EN$9;GR7-GQ7<=PLANDECUENTAS!$EN$10);(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$10;SI(GR7-GQ7>PLANDECUENTAS!$EN$10;(BUSCARV(BD!GN7;BD!$BD$7:$CA$1000;24;FALSO)/PLANDECUENTAS!$EN$14)*PLANDECUENTAS!$EO$11;0)));"HAY ERROR")


6. Asociar fórmulas a código VBA

Una vez desarrolladas las fórmulas, es momento de transformarlas a código y asignarlas a un evento, como puede ser al botón hora de salida del formulario para control de asistencia creado con anterioridad.

 

'Fórmula multa entrada

Range("GU" & Rows.Count).End(xlUp).Offset(1).Select

ActiveCell.FormulaR1C1 = _

"=IFERROR(IF(AND(RC[-5]-PLANDECUENTAS!R3C144>PLANDECUENTAS!R13C144,RC[-5]-PLANDECUENTAS!R3C144<=PLANDECUENTAS!R5C144),(VLOOKUP(BD!RC[-7],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUENTAS!R5C145,IF(AND(RC[-5]-PLANDECUENTAS!R3C144<=PLANDECUENTAS!R6C144,RC[-5]-PLANDECUENTAS!R3C144>PLANDECUENTAS!R5C144),(VLOOKUP(BD!RC[-7],BD!R7C56:R1000C79,24,FALSE)/PLANDE" & _

"CUENTAS!R14C144)*PLANDECUENTAS!R6C145,IF(AND(RC[-5]-PLANDECUENTAS!R3C144>PLANDECUENTAS!R6C144,RC[-5]-PLANDECUENTAS!R3C144<=PLANDECUENTAS!R7C144),(VLOOKUP(BD!RC[-7],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUENTAS!R7C145,IF(RC[-5]-PLANDECUENTAS!R3C144>PLANDECUENTAS!R7C144,(VLOOKUP(BD!RC[-7],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUEN" & _

"TAS!R8C145,0)))),""HAY ERROR"")"


'Fórmula multa break

Range("GV" & Rows.Count).End(xlUp).Offset(1).Select

ActiveCell.FormulaR1C1 = _

"=IFERROR(IF(AND(RC[-4]-RC[-5]>PLANDECUENTAS!R12C144,RC[-4]-RC[-5]<=PLANDECUENTAS!R9C144),(VLOOKUP(BD!RC[-8],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUENTAS!R9C145,IF(AND(RC[-4]-RC[-5]>PLANDECUENTAS!R9C144,RC[-4]-RC[-5]<=PLANDECUENTAS!R10C144),(VLOOKUP(BD!RC[-8],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUENTAS!R10C145,IF(RC[-4]-RC[-5]" & _

">PLANDECUENTAS!R10C144,(VLOOKUP(BD!RC[-8],BD!R7C56:R1000C79,24,FALSE)/PLANDECUENTAS!R14C144)*PLANDECUENTAS!R11C145,0))),""HAY ERROR"")"

 

Nota:

Para pasar a código VBA una fórmula basta con copiar la fórmula desarrollada con Ctrl + C, borrarla de la celda con supr, ir a la pestaña desarrollador, grabar macros, asignar un nombre a la macro, ir a la celda, desplegar la barra de fórmula y pegarla en ese sitio con Ctrl + V, dar enter, y detener la grabación de la macro. Después de ello, se debería depurar el código, puesto la mayoría de las veces las grabaciones tienen código innecesario que se puede eliminar.


Si deseas visualizar la ejecución del programa para el proceso de multas puedes observar el siguiente vídeo:


7. Elaborar formulario de "Justificaciones" para guardar las variables en una base de datos

Vamos ahora con la elaboración de un formulario en el entorno VBA para asignar justificaciones de los días de falta incurridos por los trabajadores, como se observa en la gráfica siguiente:

Base de datos en Excel y VBA  de justificaciones
Base de datos en Excel de justificaciones

Los formularios o formas son bastante fáciles e intuitivas de realizar, sin embargo, si requieres ayuda para el desarrollo de su construcción puedes entrar al siguiente enlace: Construcción de formularios en Excel y VBA, el detalle se encuentra en el punto 3 de este post.


8. Codificación VBA

Los formularios deben contener controladores de error para guiar al usuario y generar una correcta entrada de datos. El casillero de Fecha puede estar bloqueado contra escritura si se va a utilizar un calendario emergente, o estar envuelta en código en el evento change para colocar un único formato de fecha. Los comboBox o listas desplegables que muestra el formulario se pueden asociar a un rango dinámico. Si aún no sabes como hacerlo, entra al siguiente enlace: Rangos dinámicos en Formularios.


Los diferentes códigos se anotan con diferentes eventos dentro del formulario. Para ir dentro del formulario y colocar el código completo asociado al mismo basta con hacer click derecho en el formulario o UserForm y click en ver código. Bien, observemos parte del código que contendrá este formulario, específicamente cuando se necesite añadir el registro de justificaciones en base a la base de datos de multas:


Nota adicional del código:

Una forma de verificar si es necesario añadir justificaciones del tipo " multas por atrasos" es mediante el uso de las siguientes variables, las cuales se aplican al código posteriormente:

- Multa por atraso 1: Sheets("PLANDECUENTAS").Range("CK3").Value

- Multa por atraso 2: Sheets("PLANDECUENTAS").Range("CK4").Value

- Fecha del atraso en la BD de atrasos: Sheets("BD").Columns(195)

- Nombre de la persona que incurrió en el atraso: Sheets("BD").Columns(196)


 

'Controlador de error: vacíos

If TextBox1.Text = "" Or ComboBox1.Text = "" Or ComboBox2.Text = "" Or TextBox2.Text = "" Then

MsgBox ("Faltan campos por rellenar"), vbCritical

Exit Sub

End If


'Controlador de error 2: Datos no coinciden para justificar multas por atrasos

If ComboBox2.Text = Sheets("PLANDECUENTAS").Range("CK3").Value Or ComboBox2.Text = Sheets("PLANDECUENTAS").Range("CK4").Value Then

Registro = Format(TextBox1.Text, "mm/dd/yyyy")

Registro2 = ComboBox1.Text

contarduplicado = Application.WorksheetFunction.CountIfs(Sheets("BD").Columns(195), Registro, Sheets("BD").Columns(196), Registro2)


If contarduplicado = 0 Then ' No coinciden

MsgBox ("Datos no coinciden." & vbNewLine & "No existen multas para esta persona en éste día"), vbCritical

Exit Sub

End If

End If


'Optimizar la ejecución de la macro

Application.ScreenUpdating = False


'Colocar los datos para justificaciones

Sheets("BD").Select

For i = 7 To 100000

If Cells(i, 137).Value = "" Then

Cells(i, 137).Value = Format(TextBox1.Text, "mm/dd/yyyy")

Cells(i, 138).Value = ComboBox1.Text

Cells(i, 140).Value = ComboBox2.Text

Cells(i, 143).Value = TextBox2.Text


Exit For

End If

Next


MsgBox ("Datos sobre justificaciones almacenados con éxito"), vbInformation


End Sub

 

Parte del código que se encuentra de color café representan las variables a modificar por parte del usuario si quiere mantener el código funcionando exactamente como se muestra en el ejemplo.


Si deseas visualizar la ejecución del programa para el formulario de justificaciones puedes observar el siguiente vídeo:

Eso sería el procedimiento para tener un control de asistencia de personal con Excel y VBA. Si deseas realizar tu propio reloj marcador para el registro de asistencia de personal, multas y justificaciones puedes considerar adquirir nuestro sistema a un costo bastante accesible, el cual muestra todo el código empleado para los formularios en cuestión con un único pago y licencia perpetua, el mismo te permite editar todo el código sin ningún tipo de restricción, y muchos otros beneficios y funcionalidades que puedes observar en esta web en el apartado Descripción - Funciones.


Si deseas visualizar la ejecución del programa para el formulario del control de asistencia puedes observar el siguiente vídeo:

Por mi parte, me despido, sin antes desearles un genial día. Y, no se olviden de sonreír, para recordar que la vida sonríe siempre.

378 visualizaciones0 comentarios

Comentários


bottom of page