Excel: Impedir que el cursor se situe en celda bloqueada

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

Envía un comentario sobre Excel: Impedir que el cursor se situe en celda bloqueada