Excel: Impedir que el cursor se situe en celda bloqueada

Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Email this to someone

En Excel tenemos la posibilidad de proteger la hoja (menú Herramientas->Proteger->Proteger hoja…). Si aceptamos los valores predeterminados del cuadro de diálogo, cada vez que intentemos editar una celda bloqueada, se mostrará un mensaje advirtiendo que la celda que se intenta modificar es de sólo lectura.

Aunque también es posible, según la configuración de protección establecida, impedir situarnos en la celda sin mostrar mensaje, con el siguiente procedimiento vamos un paso adelante, ya que, además, situaremos el cursor en la celda editable más cercana. Partiendo del origen de la selección se busca la siguiente celda no bloqueada para situar el cursor en ella. Debe colocarse íntegramente en el módulo de la hoja a la que debe afectar.

'---------------------------------------------------------------------------------------
' Procedimiento : Worksheet_SelectionChange
' Autor         : ©David (www.davidcanton.com)
' Fecha         : 28/04/2011
' Finalidad     : Impedir que se posicione el cursor en una celda bloqueada.
' Parámetros    : -->Target: La selección.
'---------------------------------------------------------------------------------------
'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'También podría afectar a todo el libro en vez de sólo a una hoja.
'En ese caso, habría que incluirlo en el módulo "ThisWorkbook" 
'y el procedimiento sería: Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Definición del área de trabajo
'Const FILAPRIMERA = 3
Const FILAULTIMA = 34
Const COLUMNAPRIMERA = 3
Const COLUMNAULTIMA = 6
Dim iFila As Integer, iColumna As Integer
Dim rngCelda As Range
On Error GoTo Worksheet_SelectionChange_Error
    'Si se selecciona un área desbloqueada
    'o si la hoja no está protegida... No hacer nada
If Not Target.Locked Or Not Application.ActiveSheet.ProtectContents Then Exit Sub
    'Si estamos aquí es porque hemos seleccionado una o varias celdas bloqueadas
If Target.Row > FILAULTIMA Or (Target.Row = FILAULTIMA And Target.Column > COLUMNAULTIMA) Then
    'Si estamos por debajo de la última fila
    'o a la derecha de la última columna y en la última fila...
Set rngCelda = Cells(FILAULTIMA, COLUMNAULTIMA)
rngCelda.Select
Else
    'La situación más ordinaria:
    'Hemos seleccionado, al menos, una celda bloqueada
    'situada en el área de trabajo: antes de Cells(FILAULTIMA, COLUMNAULTIMA)
iColumna = Target.Column
For iFila = Target.Row To FILAULTIMA
Do While iColumna <= COLUMNAULTIMA
Set rngCelda = Cells(iFila, iColumna)
If Not rngCelda.Locked Then
rngCelda.Select
Exit For
End If
iColumna = iColumna + 1
Loop
iColumna = COLUMNAPRIMERA
Next iFila
End If
Worksheet_SelectionChange_Salida:
On Error Resume Next
Set rngCelda = Nothing
Exit Sub
Worksheet_SelectionChange_Error:
MsgBox "Error " & Err.Number & ": " & Err.Description & Chr(13) & Chr(10) & "Worksheet_SelectionChange"
Resume Worksheet_SelectionChange_Salida
End Sub

Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Email this to someone

Deja un comentario

Nombre
Correo electrónico
Web