TL;DR —
Range.Lockedes una etiqueta, no un bloqueo. PonerLocked = Trueno 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 comoLocked. Por eso la queja clásica —«puseLocked = Truepero los usuarios aún pueden editar la celda»— no es un fallo: la hoja nunca se protegió. Y como cada celda nace conLocked = 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 —
Lockedes una etiqueta que el interruptor de protección lee, no un bloqueo en sí - La regla que explica el bug número uno —
Lockedno 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é
LockeddevuelveNullen 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
Lockedcon 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
