Como puedo hacer una macro en excel que bloquee a fila a la cual se le esta introduciendo valores en un determinado tiempo?

Tengo un formato al cual se le deben introducir valores numéricos, esos valores van desde la F10 hasta la AU(infinito), pasa que los valores se van introduciendo fila por fila, por ejemplo hoy se introducen valores desde la F10 hasta la AU10 luego a las 5 horas se introducen desde la F11 hasta la AU11 y así sucesivamente, quisiera una macro que bloquee esa fila para que no pueda ser modificada, es decir que pueda introducir los valores desde la F10 hasta la AU10 y me de un tiempo de 1 hora por si se comete algún error y pasado ese tiempo se bloquee esa fila y así sucesivamente con las demás filas, ¿no se si me doy a entender? ¿O si se pueda hacer?

1 Respuesta

Respuesta

Lo primero tienes que desbloquear todas las celdas que quieras tener disponibles

(formato-proteger-bloqueada=falso)

Después activar la protección de la hoja (Revisar-Proteger) Contraseña="tuclave"

Prueba este código:

Dim marcafila(10000)

Private Sub Worksheet_Change(ByVal Target As Range)
f = Target.Row: c = Target.Column
If c < 6 Or c > 47 Then Exit Sub ' limita la sub a las columnas F--AU

If marcafila(f) = "" Then marcafila(f) = Time
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
f = Target.Row

If marcafila(f) = "" Then Exit Sub
If Time > marcafila(f) + TimeValue("01:00:00") Then ' esto se va a ejecutar
' si hace mas de una hora que se hizo el primer cambio en la fila
ActiveSheet.Unprotect ("tuclave")
Range(Cells(f, "F").Address, Cells(f, "AU").Address).Cells.Locked = True
ActiveSheet.Protect ("tuclave")
End If

End Sub

Cuando relices un cambio en las celdas "F(f)" --"AU(f)" se activa una marca con la hora

Cada vez que vuelvas a seleccionar una celda de esa fila comprobara si ha pasado mas de una hora y en ese caso bloqueara el rango.

¡Gracias por tu respuesta! me ha servido perfectamente, solo hay un detalle, te explico, yo introduzco los valores en las celdas (una fila) y si le coloco 1 minuto, entonces se bloquean pasado ese tiempo, hasta ahí todo bien, el problema es que si antes de ese minuto yo decido cerrar el libro y guardarlo, sin haber llenado todas las celdas de esa fila entonces no se bloquean, sino que necesariamente debo introducir algún valor en esa celda y a partir de ahí vuelve a comenzar a correr el tiempo, en pocas palabras necesito que ademas de que se bloquee la fila que estoy usando con el libro abierto en un determinado tiempo, cosa que ya lo hace, necesito que al momento de cerrar el libro también se bloquee esa misma fila que estuve usando, no se si me doy a entender? si puedes ayudarme con eso te lo agradecería!

Añade este procedimiento

Esto hará que antes de cerrar la hoja se bloqueen las filas que estaban señaladas por tiempo.

Se bloquearán al cerrar o cambiar de hoja, si solo quieres que se bloqueen al cerrar el libro habría que modificarlo un poco.

Private Sub Worksheet_Deactivate()
For c = 6 To 47
u = Cells(10000, c).End(xlUp). Row 'Busca la ultima fila con alguna celda rellena en el rango "F-AU"
If u > uf Then uf = u
Next

For f = 1 To uf
If marcafila(f) > 0 Then
ActiveSheet.Unprotect ("miclave")
Range(Cells(f, "F").Address, Cells(f, "AU").Address).Cells.Locked = True
ActiveSheet.Protect ("miclave")
Next
End Sub

Perdona, el código que te he mandado tiene un error,

Te lo vuelvo a poner:

Private Sub Worksheet_Deactivate()
For c = 6 To 47
u = Cells(10000, c).End(xlUp). Row 'Busca la ultima fila con alguna celda rellena en el rango "F-AU"
If u > uf Then uf = u
Next

For f = 1 To uf
If marcafila(f) > 0 Then
ActiveSheet.Unprotect ("miclave")
Range(Cells(f, "F").Address, Cells(f, "AU").Address).Cells.Locked = True
ActiveSheet.Protect ("miclave")
End If
Next
End Sub

Hola disculpa que no había escrito, probé lo que me enviaste y al cambiar de hoja me da un error en esta linea

Range(Cells(f, "F").Address, Cells(f, "AU").Address).Cells.Locked = True

igual te adjunto la imagen para que lo veas mejor.

Agradezco que aportes lo de que se bloquee en cuanto cambia de hoja, pero eso no me funciona porque tienen que llenar otros datos en el mismo libro asi que necesariamente necesito es que la  fila que este usando se bloquee cuando pase el tiempo que le de y cuando cierre todo el libro aunque no se haya cumplido ese tiempo, espero puedas ayudarme!

Puedes hacer estas modificaciones en el código.

En vez de almacenar las marcas de tiempos en una variable, las escribimos en una celda lo suficientemente alejada para que no te estorbe ni se vea, he puesto en la columna "ZZ".

Así no hace falta la sub para que se bloquee al cambiar de hoja. (Esa sub la he eliminado, y era donde te daba error, aunque yo la probado y a mi no me daba)

Así queda el código:

Private Sub Worksheet_Change(ByVal Target As Range)
f = Target.Row: c = Target.Column
If c < 6 Or c > 47 Then Exit Sub ' limita la sub a las columnas F--AU
ActiveSheet.Unprotect ("miclave")
If Cells(f, "ZZ") = "" Then Cells(f, "ZZ") = Time
ActiveSheet.Protect ("miclave")
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
f = Target.Row

If Cells(f, "ZZ") = "" Then Exit Sub
If Time > Cells(f, "ZZ") + TimeValue("01:00:00") Then ' esto se va a ejecutar
' si hace mas de una hora que se hizo el primer cambio en la fila
ActiveSheet.Unprotect ("miclave")
Range(Cells(f, "F").Address, Cells(f, "AU").Address).Cells.Locked = True
ActiveSheet.Protect ("miclave")
End If

End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas