Bloquear celdas una vez escritas

Tengo un código en el que me ingresa la hora, fecha y usuario por celda modificada. Por ejemplo, si en a1 ingreso un dato, en a2 ingresa la fecha, a3 la hora, a4 el usuario.
Ahora, una vez que se ingreso el dato, necesito que no se modifique la información de las celdas a2:a4.
Si protejo la hoja mediante una contraseña, y selecciono los rangos que se pueden modificar funcionaria, pero la macro no escribe sobre las celdas bloqueadas.
Cómo puedo hacer para que, una vez ingresado el dato en a1, modifique las celdas a2:a4, y una vez que ya tienen la fecha y hora escritas, no se puedan volver a modificar, a menos que se desproteja la hoja?
Te paso el código con el que estoy trabajando:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then Target.Offset(0, 7) = Date
If Target.Column = 3 Then Target.Offset(0, 8) = Time
If Target.Column = 3 Then Target.Offset(0, 9) = Application.UserName
End Sub

1 Respuesta

Respuesta
1

Puedes usar la instrucción Protect, de la siguiente forma

Me.Protect Password:="tu_passsword", UserInterfaceOnly:=true

Puedes usarlo en el evento Activate de la hoja y te quedaría mas o menos así

Private Sub Worksheet_Activate()
    Me.Protect Password:="tu_passsword", UserInterfaceOnly:=True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 3 Then Target.Offset(0, 7) = Date
    If Target.Column = 3 Then Target.Offset(0, 8) = Time
    If Target.Column = 3 Then Target.Offset(0, 9) = Application.UserName
End Sub

Aquí la clave es esta UserInterfaceOnly:=true, ya que esto indica que la hoja va a estar bloqueada pero solo para el usuario y no para el código por lo que podrías modificar los valores de las celdas desde el código pero no directamente.

También puedes desbloquear la hoja y volver a bloquearla después de hacer las modificaciones. Esto se haría con la instrucción Unprotect y Protect, de la siguiente forma

Me.UnProtect Password:="tu_passsword"
Me.Protect Password:="tu_passsword"

y te quedaría así

Private Sub Worksheet_Change(ByVal Target As Range)
    Me.UnProtect Password:="tu_passsword"
    If Target.Column = 3 Then Target.Offset(0, 7) = Date
    If Target.Column = 3 Then Target.Offset(0, 8) = Time
    If Target.Column = 3 Then Target.Offset(0, 9) = Application.UserName
    Me.Protect Password:="tu_passsword"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas