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