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.