TL;DR —
Worksheet.Unprotectes el interruptor maestro apagado. Deja de pedirle a Excel que aplique las etiquetasLocked, pero no toca esas etiquetas: desproteger una hoja no desbloquea sus celdas, solo deja de respetar los bloqueos por ahora. Si la hoja se protegió con una contraseña, tienes que pasar exactamente la misma, o te llevas el error en tiempo de ejecución 1004 (contraseña incorrecta) o un cuadro de diálogo modal que deja colgada una macro desatendida. Casi toda macro de edición envuelve su trabajo en un sándwich de desproteger ▸ cambiar ▸ proteger, y la única regla que importa es esta: vuelve a proteger dentro de un controlador de errores, para que un fallo nunca deje la hoja abierta.
Sub UpdateAndReLock()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Form")
ws.Unprotect Password:="ac" ' apaga la aplicacion de los bloqueos (contrasena exacta)
On Error GoTo ReLock ' pase lo que pase a continuacion...
ws.Range("C4:C12").ClearContents ' ...haz el trabajo...
ReLock:
ws.Protect Password:="ac" ' ...vuelve a activarla SIEMPRE
End Sub
Unprotect es el código que hay detrás de Revisar ▸ Desproteger hoja, y es el primer movimiento
obligado siempre que una macro tiene que escribir en una hoja que has dejado bloqueada. Parece
trivial —una línea, un argumento opcional— y lo es, justo hasta que la hoja tiene contraseña o la
macro falla a mitad de camino. Cualquiera de las dos cosas convierte una línea en un ticket de
soporte. El modelo mental que te mantiene fuera de problemas es que Unprotect es temporal y va
emparejado: quitas el bloqueo para hacer un trabajo, y eres responsable de volver a ponerlo.
Lo que aprenderás
- El modelo mental —
Unprotectdesactiva la aplicación, no cambia las etiquetasLocked - La regla que más importa — vuelve a proteger dentro de un controlador de errores para que un fallo nunca deje la hoja abierta
- La trampa de la contraseña: por qué una contraseña incorrecta o ausente lanza 1004 o se queda colgada en un diálogo
- Por qué llamar a
Unprotecten una hoja ya abierta es un no-op inofensivo con el que puedes contar - Cómo desproteger todas las hojas de un libro con un solo bucle
- El límite honesto — VBA no puede recuperar una contraseña que has olvidado
El modelo mental: apaga el interruptor, las etiquetas no se tocan
La protección son dos capas: la etiqueta Locked por celda (la decisión sobre quién puede editar
qué) y Protect/Unprotect (el interruptor que aplica o ignora esas etiquetas). Unprotect
actúa solo sobre el interruptor. Cada celda conserva el estado Locked exacto que tenía; solo le has
dicho a Excel que deje de aplicarlo.
Esto importa porque la gente espera que Unprotect «abra las celdas», y luego se sorprende cuando
vuelve a hacer Protect y las mismas celdas quedan bloqueadas que antes. No se desbloqueó nada: la
aplicación se pausó y luego se reanudó. Si quieres cambiar qué celdas son editables, ese es un
trabajo para la propiedad Locked con la hoja desprotegida, no para el
propio Unprotect.
La regla que más importa: vuelve a proteger dentro de un controlador de errores
La forma estándar de cualquier macro que edita una hoja protegida es un sándwich: desproteger, hacer
el trabajo, volver a proteger. El peligro vive en la loncha del medio. Si el paso de «hacer el
trabajo» lanza un error —una referencia mala, una hoja que falta, un tipo que no cuadra—, la
ejecución se detiene, el Protect de cierre nunca corre, y la hoja se queda abierta de par en par.
El usuario cierra el archivo sin enterarse de nada, y tu plantilla, tan cuidadosamente bloqueada,
ahora la puede editar cualquiera.
El arreglo es hacer que el volver a proteger sea incondicional con un controlador de errores, para que corra tanto si el trabajo sale bien como si revienta:
Sub SafeEdit()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Form")
ws.Unprotect Password:="ac"
On Error GoTo CleanExit
' ... el trabajo real, que podria fallar ...
ws.Range("C4:C12").ClearContents
CleanExit:
ws.Protect Password:="ac", UserInterfaceOnly:=True
If Err.Number <> 0 Then MsgBox "Update failed: " & Err.Description
End Sub
Es la misma disciplina de CleanExit que usa toda macro fiable para cerrar archivos o restaurar
ScreenUpdating: una única etiqueta de salida por la que pasan todos los caminos, donde vive el
código que «vuelve a dejarlo todo en su sitio». Consulta manejo de errores
para el patrón completo. El criterio es simple: la línea que vuelve a proteger la hoja no puede ser
alcanzable solo por el camino feliz.
La trampa de la contraseña
Si una hoja se protegió con contraseña, Unprotect necesita esa contraseña exacta, y equivocarse
falla de dos maneras distintas e igual de molestas. Pasa la contraseña incorrecta y te llevas el
error en tiempo de ejecución 1004, "The password you supplied is not correct". Pasa ninguna
contraseña a una hoja protegida con contraseña y, en una sesión interactiva, Excel abre el cuadro
de diálogo que pide la contraseña, que deja colgada para siempre y en silencio una macro
desatendida o programada, porque no hay nadie ahí para escribirla.
ws.Unprotect Password:="ac" ' correcto: contrasena exacta, se ejecuta limpio
ws.Unprotect ' en una hoja con contrasena: abre un dialogo modal - cuelga un proceso por lotes
ws.Unprotect Password:="wrong" ' error en tiempo de ejecucion 1004
De aquí sale la regla: una macro automatizada debe pasar siempre la contraseña de forma explícita, y nunca debe confiar en que haya una persona presente para responder a un diálogo. Si proteges con una contraseña en cualquier sitio, guárdala en una constante que tu código de desproteger pueda leer, para que las dos nunca se separen.
Unprotect en una hoja abierta no hace nada y es seguro
Un pequeño hecho que hace más limpio el código defensivo: llamar a Unprotect en una hoja que no
está protegida no hace nada y no lanza ningún error. Eso significa que puedes hacer Unprotect al
principio de una rutina sin comprobar antes ws.ProtectContents: si la hoja ya estaba abierta, la
llamada es un paso inofensivo; si estaba bloqueada, la abre. Es algo insólitamente indulgente para
VBA, y te deja escribir el paso de desproteger sin una guarda. (Lo contrario no es simétrico:
Protect en una hoja ya protegida sí lanza un error, así que volver a proteger a ciegas requiere
más cuidado.)
Desproteger todas las hojas en un solo bucle
Una tarea real frecuente es quitar la protección de todo un libro antes de una reconstrucción
masiva. Recorre la colección Worksheets y desprotege cada una, pasando la contraseña compartida:
Sub UnprotectAllSheets()
Const PW As String = "ac"
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Unprotect Password:=PW ' no hace nada en una hoja que no estaba protegida
Next ws
End Sub
Como Unprotect no hace nada en las hojas desprotegidas, el bucle es seguro incluso cuando solo
algunas pestañas estaban bloqueadas. Emparéjalo con un bucle de proteger-todas al final de la
reconstrucción. Si distintas hojas usaron distintas contraseñas, este bucle sencillo no funcionará,
lo cual es un buen argumento para usar una sola contraseña (o ninguna) en un libro que tienes que
automatizar. Consulta Worksheets para iterar la colección.
El límite honesto: contraseñas olvidadas
Vale la pena decirlo con claridad, porque es una de las búsquedas más habituales detrás de este
tema: Unprotect requiere la contraseña que se fijó. VBA no te da ninguna forma admitida de
recuperar o revelar una contraseña que has olvidado de verdad; el lenguaje solo puede aplicar
una contraseña que ya conoces. Si protegiste tu propia hoja y perdiste la contraseña, el camino
práctico es restaurar desde una copia de seguridad o una versión anterior del archivo. Coge la
costumbre de guardar la contraseña en una constante junto al código que la usa, para que el «se me
olvidó» nunca le pase a un libro que mantienes.
Cómo te ayuda ExcelMaster
Desproteger es fácil de hacer casi bien y que luego te muerda: una macro falla entre el desproteger y el volver a proteger y deja tu plantilla abierta en silencio, un trabajo programado se queda colgado para siempre en un diálogo de contraseña que nadie ve, o un bucle tropieza con hojas que tenían cada una una contraseña distinta.
ExcelMaster te deja describir
el trabajo —«actualiza estas celdas de la hoja bloqueada y vuelve a poner la protección»— y escribe
el sándwich de desproteger-trabajar-proteger con el volver a proteger dentro de un controlador
CleanExit, para que un fallo nunca pueda dejar la hoja abierta, pasa la contraseña de forma
explícita para que nada se quede colgado en un diálogo, y te recuerda que una contraseña olvidada no
se puede recuperar desde el código. Tú conservas el libro y el código.
Preguntas frecuentes
¿Cómo desprotejo una hoja con contraseña en VBA?
Pasa la contraseña exacta al argumento Password: ws.Unprotect Password:="ac". Tiene que coincidir
con la contraseña usada cuando se protegió la hoja. Una contraseña incorrecta lanza el error en
tiempo de ejecución 1004; omitir la contraseña en una hoja protegida con contraseña abre un cuadro de
diálogo modal que dejará colgada una macro desatendida. Pasa siempre la contraseña de forma explícita
en código automatizado.
¿Por qué obtengo el error 1004 al desproteger una hoja?
La causa más habitual es una contraseña incorrecta: "The password you supplied is not correct".
Comprueba que la contraseña de Unprotect coincide con la usada en Protect, idealmente guardando
las dos en una única constante. El error 1004 también puede aparecer si haces referencia a una hoja
que no existe; confirma que el nombre de Worksheets("...") está escrito exactamente igual que la
pestaña.
¿Desproteger una hoja desbloquea sus celdas?
No. Unprotect solo apaga la aplicación de las etiquetas Locked; cada celda conserva el estado
Locked exacto que tenía. Cuando vuelves a proteger la hoja, las mismas celdas quedan bloqueadas que
antes. Para cambiar qué celdas son editables, fija la propiedad Locked con la hoja desprotegida:
desproteger por sí solo no cambia nada de los bloqueos.
¿Cómo desprotejo todas las hojas de un libro?
Recorre la colección y desprotege cada una con la contraseña compartida:
For Each ws In ThisWorkbook.Worksheets: ws.Unprotect Password:="ac": Next ws. Como Unprotect no
hace nada en las hojas que no estaban protegidas, el bucle es seguro incluso cuando solo algunas
pestañas estaban bloqueadas. Esto supone una única contraseña en todo el libro; contraseñas distintas
por hoja necesitarían cada una su propio valor.
¿Puede VBA recuperar una contraseña de protección olvidada?
No. VBA solo puede aplicar una contraseña que ya conoces; no tiene ninguna forma admitida de revelar o recuperar una olvidada. Si perdiste la contraseña de tu propia hoja, restaura el libro desde una copia de seguridad o una versión anterior. Guarda la contraseña en una constante junto a tu código de desproteger para que nunca se pierda en un archivo que mantienes.
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 Lock Cells · VBA Manejo de errores · VBA Worksheets · VBA Workbook_Open
