Como insertar de forma separada registros en diferentes columnas en una misma fila

Estoy tratando de realizar un formulario de registro de asistencia que registre la hora de entrada, la hora de inicio y fin del cafe, la hora de inicio y fin del amuerzo y la hora de la salida. Hay unos botones de opción que seleccionan el tipo de registro deseado y un boton de registrar que guarda los valores en una hoja.

Codigo, nombre, turno, fecha, entrada, i nicio café, fin café, inicio almuerzo fin almuerzo, salida

Por ejemplo para el día 30/7/2020 se completa la jornada y debería tener llena la fila con los diferentes tipos de regisro (entrada, cafes, almuerzo, salida) por cada usuario y para el 31/7/2020 , el ciclo debe iniciar de nuevo al otro día, pero en una fila difrente por usuario.

Pero cada vez que registro algun tipo de registro diferente (entrada, almuerzo, etc) me multiplica las filas varias veces.

Este es el procedimiento que uso: (no me deja guardar cuand lo pego) pero se los puedo pasar de otra forma

Igualmente me gustaría saber cómo hago para restrigir que un usario que ya guardó por ejemplo la "Entrada" un día ya no pueda volver a guardarla, actualemente el procedimiento lo deja y lo que hace es sobrescribir el valor actual sobre el valor anterior.

Si ocupan el archivo lo subo dónde me indiquen.

1 respuesta

Respuesta
1

Entiendo la situación, y esto es algo común cuando se diseña un sistema de registro en Excel para capturar datos de asistencia de manera estructurada. Vamos a desglosar el problema en dos partes: evitar que se repitan filas y restringir la entrada de registros duplicados para un mismo día.

1. Evitar la duplicación de filas

Cuando cada tipo de registro (entrada, café, almuerzo, salida) se registra en una nueva fila, suele suceder porque el código está configurado para añadir una fila cada vez que se hace clic en el botón de registro. Para que todos los registros del mismo día se guarden en la misma fila, se puede usar una macro en VBA (Visual Basic para Aplicaciones) que busque si ya existe una fila para ese usuario en la fecha actual. Si encuentra una coincidencia, debería actualizar los valores en las columnas correspondientes en lugar de insertar una fila nueva.

Un ejemplo de código básico sería:

Sub RegistrarAsistencia()
Dim ws As Worksheet
Dim lastRow As Long
Dim fechaRegistro As Date
Dim usuario As String
Dim tipoRegistro As String
Dim hora As Date
Set ws = ThisWorkbook.Sheets("NombreDeTuHoja") ' Cambia el nombre de la hoja según corresponda

' Definir las variables
fechaRegistro = Date ' Asume que estás registrando la fecha del día actual
usuario = Range("A1").Value ' Aquí tendrías el nombre o código del usuario
tipoRegistro = Range("A2").Value ' Aquí identificas el tipo de registro: entrada, café, etc.
hora = Now ' O define la hora desde otra celda o de forma automática

' Busca la última fila utilizada
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

' Recorre las filas para encontrar si ya existe el usuario y la fecha de hoy
Dim fila As Long
For fila = 2 To lastRow
If ws.Cells(fila, 1).Value = usuario And ws.Cells(fila, 4).Value = fechaRegistro Then
' Si ya existe, inserta el tipo de registro en la columna adecuada y termina el sub
Select Case tipoRegistro
Case "Entrada"
ws.Cells(fila, 5).Value = hora
Case "Inicio Café"
ws.Cells(fila, 6).Value = hora
Case "Fin Café"
ws.Cells(fila, 7).Value = hora
Case "Inicio Almuerzo"
ws.Cells(fila, 8).Value = hora
Case "Fin Almuerzo"
ws.Cells(fila, 9).Value = hora
Case "Salida"
ws.Cells(fila, 10).Value = hora
End Select
Exit Sub
End If
Next fila

' Si no existe, crea una nueva fila
ws.Cells(lastRow + 1, 1).Value = usuario
ws.Cells(lastRow + 1, 4).Value = fechaRegistro
' Y luego guarda el registro en la columna correspondiente
Select Case tipoRegistro
Case "Entrada"
ws.Cells(lastRow + 1, 5).Value = hora
Case "Inicio Café"
ws.Cells(lastRow + 1, 6).Value = hora
Case "Fin Café"
ws.Cells(lastRow + 1, 7).Value = hora
Case "Inicio Almuerzo"
ws.Cells(lastRow + 1, 8).Value = hora
Case "Fin Almuerzo"
ws.Cells(lastRow + 1, 9).Value = hora
Case "Salida"
ws.Cells(lastRow + 1, 10).Value = hora
End Select
End Sub

2. Evitar registros duplicados en el mismo campo (por ejemplo, “Entrada”)

Para evitar que un usuario registre un tipo de entrada más de una vez, podrías agregar una validación antes de que el código inserte el dato. Si, por ejemplo, el campo de “Entrada” ya está lleno, muestra un mensaje de error y no sobrescribas el valor.

Podrías añadir algo como esto en la sección del código donde defines cada tipo de registro:

If ws.Cells(fila, 5).Value <> "" And tipoRegistro = "Entrada" Then
MsgBox "La entrada ya fue registrada para hoy.", vbExclamation
Exit Sub
End If

Esto se repite para cada tipo de registro en su columna correspondiente. Así, si alguien intenta registrar de nuevo la “Entrada” o cualquier otro tipo que ya esté en la fila, el código no permitirá sobrescribir el valor.

Con estas adaptaciones, deberías poder tener un registro estructurado por filas sin duplicaciones y sin sobrescribir datos accidentalmente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas