🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Lock Cells en Excel — la propiedad Locked que no hace nada por sí sola

|

VBA Lock Cells en Excel — la propiedad Locked que no hace nada por sí sola

TL;DRRange.Locked es una etiqueta, no un bloqueo. Poner Locked = True no cambia nada que puedas ver ni notar; la celda solo se vuelve no editable una vez que la hoja está protegida, momento en el que Excel lee la etiqueta de cada celda y congela las marcadas como Locked. Por eso la queja clásica —«puse Locked = True pero los usuarios aún pueden editar la celda»— no es un fallo: la hoja nunca se protegió. Y como cada celda nace con Locked = True, el flujo real está invertido: desbloqueas las celdas de entrada (Locked = False) y luego proteges, dejando que todo lo demás herede el bloqueo por defecto.

Sub MarkEditableCells()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Form")

    ws.Cells.Locked = True                 ' cada celda ya lo esta - solo lo hacemos explicito
    ws.Range("C4:C12").Locked = False      ' las entradas son las excepciones
    ws.Range("C4:C12").FormulaHidden = False
    ws.Protect Password:="ac"              ' AHORA las etiquetas empiezan a significar algo
End Sub

Locked es la casilla de Formato de celdas ▸ Protección (la casilla «Bloqueada»), y es la propiedad peor entendida de toda la automatización de Excel, porque fijarla parece no hacer nada. Ejecutas cell.Locked = True, haces clic en la celda, y sigues pudiendo escribir en ella. Todo funciona exactamente como está diseñado; solo has descubierto que Locked es inerte por sí sola. En cuanto interiorizas que Locked es una nota para el sistema de protección y no un acto de bloquear, toda la función se vuelve predecible.

Lo que aprenderás

  • El modelo mental — Locked es una etiqueta que el interruptor de protección lee, no un bloqueo en sí
  • La regla que explica el bug número uno — Locked no hace nada hasta que proteges la hoja
  • Por qué cada celda nace bloqueada, y el flujo invertido de «desbloquear las entradas» que se sigue
  • Por qué Locked devuelve Null en una selección mixta, y cómo comprobarlo
  • FormulaHidden — la etiqueta compañera que oculta una fórmula de la barra de fórmulas
  • Por qué debes fijar Locked con la hoja desprotegida

El modelo mental: una etiqueta, no un bloqueo

Imagina Locked como una nota adhesiva en cada celda que dice «congélame cuando la protección esté activada». Escribir la nota no congela nada; solo registra una intención. La congelación de verdad ocurre después, y la hace otro —Worksheet.Protect—, que recorre la hoja, lee cada nota y la aplica. Dos celdas pueden llevar etiquetas Locked idénticas y comportarse de forma completamente distinta, según sea únicamente si su hoja está protegida o no.

Por eso Locked y Protect son una pareja que hay que entender junta. Locked es el mapa de quién-puede-editar-qué; Protect es el interruptor que empieza a respetar el mapa. Ninguno hace el trabajo solo: un mapa que nadie aplica no cambia nada, y un interruptor sin mapa simplemente lo bloquea todo (porque el mapa por defecto marca cada celda como bloqueada).

La regla que explica el bug número uno: Locked es inerte hasta que proteges

La frustración más buscada detrás de este tema es «puse la celda en Locked = True pero el usuario aún puede editarla». Nunca es un fallo de Locked. Significa que la hoja no está protegida, así que nada está aplicando la etiqueta. La propiedad Locked no tiene efecto alguno en una hoja desprotegida: puedes fijarla en cada celda del libro y no cambiar nada de lo que cualquiera puede escribir.

ws.Range("A1").Locked = True    ' A1 ahora esta etiquetada como bloqueada...
' (la hoja no esta protegida)   ' ...y sigue siendo totalmente editable
ws.Protect                      ' AHORA A1 esta congelada

Así que Locked es siempre la mitad de un dos-pasos, y el segundo paso es el que la gente olvida. Si una celda debe resistirse a la edición, poner Locked = True es necesario pero no suficiente: la hoja tiene que estar protegida para que la etiqueta muerda. Cada vez que el bloqueo «no funciona», lo primero que hay que comprobar es si ws.ProtectContents es siquiera True.

Cada celda nace bloqueada, así que desbloquea las excepciones

Este es el hecho que le da la vuelta a todo el flujo: cada celda de una hoja nueva ya está Locked = True. Eso significa que «bloquear las celdas que quiero proteger» casi nunca es el movimiento correcto: ya están bloqueadas. El patrón correcto es el inverso: deja el valor por defecto en su sitio y desbloquea el puñado de celdas que quieres que la gente edite.

ws.Cells.Locked = True              ' el valor por defecto; dilo para el siguiente lector
ws.Range("C4:C12").Locked = False   ' desbloquea las entradas - las excepciones
ws.Protect Password:="ac"           ' todo lo demas hereda el bloqueo

Piensa en términos de «¿qué celdas son las entradas?» y desbloquea esas; todo lo demás —etiquetas, fórmulas, encabezados— conserva el bloqueo por defecto y queda congelado en cuanto proteges. Esto escala mucho mejor que intentar enumerar cada celda que debería ser de solo lectura, y es la razón por la que las plantillas bien construidas desbloquean una región de entrada pequeña y evidente y bloquean el resto por omisión.

La trampa de Null: leer Locked en una selección mixta

Locked se lee de forma limpia solo cuando un rango es uniforme. Si un rango contiene a la vez celdas bloqueadas y desbloqueadas, leer .Locked devuelve Null, no True ni False. Así que una comprobación ingenua revienta:

If ws.Range("A1:A10").Locked Then      ' error en tiempo de ejecucion si el rango es mixto (Null)

Cuando A1:A10 tiene algunas celdas bloqueadas y otras desbloqueadas, .Locked es Null, y If Null Then lanza "Invalid use of Null". Protégelo con IsNull cuando un rango pueda ser mixto:

Dim state As Variant
state = ws.Range("A1:A10").Locked
If IsNull(state) Then
    ' mixto - decide celda por celda
ElseIf state Then
    ' todas bloqueadas
Else
    ' todas desbloqueadas
End If

Es el mismo comportamiento de tres estados que ves con WrapText y otras propiedades de celda: los rangos uniformes dan un Boolean, los rangos mixtos dan Null. Lee una celda cada vez cuando necesites certeza.

FormulaHidden: bloquea la celda, oculta la receta

Locked tiene una etiqueta compañera, FormulaHidden, y juntas cubren las dos cosas que sueles querer de un modelo entregado: que el usuario no pueda cambiar la fórmula, y que ni siquiera pueda verla. Como Locked, FormulaHidden no hace nada hasta que la hoja está protegida; una vez que lo está, una celda con FormulaHidden = True muestra su resultado en la cuadrícula pero una barra de fórmulas en blanco cuando se selecciona (la casilla «Oculta» de Formato de celdas ▸ Protección).

ws.Range("D4:D100").Locked = True
ws.Range("D4:D100").FormulaHidden = True   ' oculta el calculo de la barra de formulas
ws.Protect Password:="ac"

Úsala cuando entregas un cálculo como una caja negra —un modelo de precios, una fórmula de puntuación— y quieres que la gente confíe en el número sin levantar el capó. Como siempre, es un gesto de comodidad y propiedad intelectual, no de seguridad: como las contraseñas de protección, se burla con facilidad. Pero para mantener una fórmula fuera de la vista casual es exactamente la etiqueta adecuada.

Por qué debes fijar Locked con la hoja desprotegida

El mapa de Locked hay que dibujarlo con la hoja abierta. Intentar cell.Locked = False en una hoja protegida lanza el error en tiempo de ejecución 1004: no puedes reescribir el mapa mientras el interruptor que lo aplica está encendido. Así que el orden es fijo e innegociable: Unprotect (si hace falta), fija cada etiqueta Locked y FormulaHidden, y luego Protect. Si una macro necesita cambiar qué celdas son editables en tiempo de ejecución, tiene que desproteger primero, ajustar las etiquetas y volver a proteger: nunca puedes editar las etiquetas a través de un bloqueo activo.

Cómo te ayuda ExcelMaster

Locked falla en silencio de la forma más confusa posible: no hace absolutamente nada, sin ningún error, hasta que la hoja está protegida, así que la gente la fija, ve a los usuarios editar celdas «bloqueadas» igualmente, y da por hecho que la propiedad está rota. Luego el flujo inverso les hace tropezar, o una lectura de rango mixto lanza "Invalid use of Null", o intentan reetiquetar celdas a través de una protección activa y se chocan con el 1004.

ExcelMaster te deja decir el objetivo —«deja que la gente edite solo las celdas de entrada amarillas y oculta las fórmulas»— y fija Locked y FormulaHidden en el orden correcto, desbloquea las entradas en vez de intentar bloquear todo lo demás, empareja las etiquetas con la llamada a Protect que de verdad las aplica, y protege las lecturas de rango mixto contra Null. Tú conservas el libro y el código.

Preguntas frecuentes

¿Por qué los usuarios aún pueden editar una celda después de poner Locked en True en VBA?

Porque Locked no hace nada hasta que la hoja está protegida. Es solo una etiqueta que el sistema de protección lee: una hoja desprotegida la ignora por completo. Pon las celdas en Locked = True (o deja el valor por defecto) y luego llama a ws.Protect. Si después de eso la edición sigue siendo posible, confirma que la hoja está realmente protegida con ws.ProtectContents.

¿Cómo bloqueo solo algunas celdas y dejo el resto editable?

Usa el flujo invertido. Cada celda nace con Locked = True, así que desbloquea las excepciones en vez de bloquear los objetivos: ws.Cells.Locked = True y luego ws.Range("C4:C12").Locked = False para las celdas de entrada, y después ws.Protect. Todo lo que no hayas desbloqueado hereda el bloqueo por defecto y queda congelado en cuanto la hoja está protegida.

¿Por qué leer la propiedad Locked da un error?

Porque el rango es mixto. Locked devuelve Null cuando un rango contiene a la vez celdas bloqueadas y desbloqueadas, y If Range.Locked Then sobre un Null lanza "Invalid use of Null". Comprueba con IsNull primero, o lee una celda cada vez: un rango uniforme devuelve un Boolean, uno mixto devuelve Null.

¿Cuál es la diferencia entre Locked y FormulaHidden?

Locked impide que una celda se edite una vez que la hoja está protegida; FormulaHidden impide que su fórmula se vea en la barra de fórmulas una vez que la hoja está protegida. Ambas son etiquetas que solo surten efecto bajo protección. Úsalas juntas para entregar un cálculo que el usuario no pueda cambiar ni inspeccionar: bloquea la celda y oculta la fórmula, y luego protege.

¿Puedo cambiar el estado Locked de una celda con la hoja protegida?

No. Fijar Locked (o FormulaHidden) en una hoja protegida lanza el error en tiempo de ejecución 1004. Tienes que dibujar el mapa con la aplicación apagada: Unprotect si hace falta, fija las etiquetas Locked, y luego Protect. Una macro que cambia la editabilidad en tiempo de ejecución tiene que desproteger, ajustar y volver a proteger.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 11/09/2026.

Guías relacionadas: VBA Protect Sheet · VBA Unprotect · VBA Ajustar texto · VBA Range · VBA Formula