Hojas de cálculo en Excel - página principal

Proteger y desproteger mediante macros

Hace unos días, vimos como desproteger una hoja de cálculo, de la cual desconocíamos (o de la que habíamos olvidado) su password o contraseña.

Hoy toca algo muy sencillito. ¿Cómo podemos proteger y desproteger nuestro libro de excel, y nuestras hojas de cálculo, mediante un macro?. Pues de una forma muy sencilla. Nos bastará con colocar unas brevísimas líneas de código.

Si deseamos proteger una hojas de cálculo (una pestaña, para entendernos):


'Protegemos la hoja activa, es decir,
'la hoja donde ejecutamos el código

ActiveSheet.Protect "aquí_va_la_contraseña_que_quieres_ponerle_a_la_hoja"


Si deseamos desproteger una hoja de cálculo (una pestaña, para entendernos):

'Desprotegemos la hoja activa, es decir,
'la hoja donde ejecutamos el código

ActiveSheet.Unprotect "aquí_va_la_contraseña_que_tenga_la_hoja"


Si deseamos proteger un libro de excel:

'Protegemos el libro activo, es decir,
'el libro donde ejecutamos el código

ThisWorkbook.Protect "aquí_va_la_contraseña_que_quieres_ponerle_al_libro"


Si deseamos desproteger un libro de excel:

'Desprotegemos el libro activo, es decir,
'el libro donde ejecutamos el código

ThisWorkbook.Unprotect "aquí_va_la_contraseña_que_tenga_el_libro"


La contraseña de la hoja, y del libro, deben ir entre comillas, tal y como aparece en esas líneas de código anterior. Podéis ponerle la contraseña que queráis, tanto a las hojas, como al libro.

Como veis, es extremadamente sencillo.



46 comentarios:

Cristian Hernandez Gonzalez dijo...

Muy bueno tu post, espero poder seguir revisando, lo que es a mi, me ayudo un monton para realizar una macro en un libro de excel, y quede como rey.

Gracias por tu blog



Cristian Hernandez G.

Javier Marco dijo...

Muchas gracias. Me alegro que te haya servido,

Salu2

Unknown dijo...

Hola, nuevamente yo te comento y te externo una duda, existe un codigo, con el cual, despues de que se ejecute una macro X, automaticamente se ejecute esa misma macro, y automanticamente ponga una contraseña?

Se me ocurre algo asi (claro que no se codigos ni nada)

if visualbasic.run then
thisworksheet.active.protection "contraseña"

Por si la macro que ejecutaron fue una para desbloquear tu hoja, automaticamente despues de esa macro se vuelve a bloquear.

Javier Marco dijo...

Hola C.P.Gerardo.

Para hacer lo que pretendes, primero tienes que incluir como primera línea del macro, algo como esto para desproteger la hoja (tal y como explico en este mismo artículo):

ActiveSheet.Unprotect "tu_contraseña"

Las siguientes líneas serían las de tu macro, que se ejecutaría con la hoja desprotegida, pues eso es lo que hemos hecho poniendo esa primera línea, y al final del macro, tendrías que incluir esta última línea:

ActiveSheet.Protect "tu_contraseña"

Sustituye tu_contraseña por la contraseña que tenga o que quieras ponerle a la hoja (las comillas dobles debes dejarlas como aparecen ahí).

Salu2

Unknown dijo...

Hola:

Creo que esta vez si no me supe explicar bien, lo intentare de nuevo:
Aqui mismo en tu pagina tienes un código con el cual desproteger una hoja de excel, logicamente yo en mi trabajo no voy a incluir esa macro, pero cualquiera podria intentar desproteger mi hoja con ella, ahora bien, ¿algun modo para que si en mi hoja se ejecuta una macro "no deseada" al finalizar la macro no deseada se vuelva a poner mi contraseña u otra contraseña, o tal vez algo mas drastico como borrar todo el contenido de la hoja, dejandola inservible?

Javier Marco dijo...

Hola C.P. Gerardo.

Si pones una contraseña lo más larga posible, y combinando letras, números y otro tipo de caracteres, entonces va a ser mucho más difícil que alguien de con el password.

Aunque ya sabes que en temas de software, no hay nada inviolable. Es más, existe un programa llamado "Password Recovery" que lo que hace precisamente es recuperar contraseñas "olvidadas" de Office (Excel, Word, etc...), con lo cual, si alguien quiere desproteger una hoja, libro, o incluso módulo VBA, lo podrá hacer con ese software.

Además, ten en cuenta que lo que pretendes hacer es imposible, ya que ¿qué pasaría si fueses tú quien quisieses desproteger la hoja para realizar algún cambio?. ¿Se borraría la hoja?. ¿Se borraría el macro?. ¿Te quedarías sin todo el trabajo realizado?. No se puede hacer eso.

Salu2

Unknown dijo...

Hola:

Mira creo que solucione el problema, solo que mal, por que, tarda en ejecutarse esta macro, tal vez tengas una mejor idea, pero esto funciono

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Range("a1").Value = "a"
ActiveSheet.Protect "pepe"
End Sub

donde a1 es una celda protegida, si la hoja esta protegida, marca error y se debe brincar hasta el final, osea se acaba, y si puede escribir en a1, es que la hoja esta desprotegida, asi que procede a protegerla de nuevo. Como vez, alguna idea para mejorar este intento de macro :p

Javier Marco dijo...

Prueba esto dentro de un módulo:

Sub ejemplo()
'si hay errores que siga ejecutando el macro
On Error Resume Next
'desprotegemos la hoja
ActiveSheet.Unprotect "pepe"
'escribimos algo en la celda A1
Range("a1").Value = "a"
'protegemos la hoja
ActiveSheet.Protect "pepe"
End Sub

Anónimo dijo...

Gracias amigo

tu aporte esta muy bien y me sirvio de mucho

gracias

john yate

Javier Marco dijo...

Me alegro que te haya servido.

Gracias por tu comentario.

Salu2

Anónimo dijo...

Hola Javier,
Se que me ayudaras por eso te escribo... Te explico mi problema, yo tengo una hoja protegida que requiero modificar sin embargo no tengo la clave, pero el usuario que ejecutará la macro si la tiene. Entonces, yo quisiera obtener esa clave para proseguir con la modificación de la hoja (la macro es quien realizara las modificaciones) hice algo asi:

while Not Salir
if (ActiveSheet.Unprotect) = vbCancel then
pregunto si cierro la modificacion
else
salir = true
prosigo
endif
wend

pero no funciona cuando ingresa la clave correcta,. el bucle se hace infinito.

Espero me haya explicado bien y se que me ayudaras.

Gracias.

Jesica

Javier Marco dijo...

Tienes mucha seguridad en tí misma Jesica (lo digo por la coletilla de que "estás segura que te ayudaré")...

Échale un vistazo a esta entrada donde hablo de como desproteger una hoja de cálculo sin saber la contraseña.

Un saludo.

Anónimo dijo...

Muchas gracias JAVIER... tu pagina es mi sitio de consulta indispensable.... como te dije alguna vez no te pido todo resuelto ya que eso es parte de nuestro trabajo pero como experto busco en ti siempre un referente...

GRACIAS... ya revise el link y me ayudo me dio luces de lo que debo hacer...

Jesica
Peru

Javier Marco dijo...

Gracias Jesica, pero para nada me considero un experto, y ni mucho menos un referente. Soy un usuario llamémosle "despierto", sin más calificativos.

Además, me es imposible recordar el nombre de todos los usuarios que dejan mensajes en los artículos, y tampoco sé si Jesica, la que deja un mensaje hoy, es la misma Jesica que dejó un mensaje hace 4 meses. Ni mi memoria es tan prodigiosa, ni un mensaje firmado como "anónimo", me da tanta información :-)

En cualquier caso, muchas gracias por tus palabras, y espero haberte ayudado.

Un saludo.

Anónimo dijo...

buenos muchachos, les tengo una perlita. tengo una macro en visual, es una factura del office 97, resulta que yo le pretendo hacer unas modificaciones;pero cuando ingreso herramientas-macros-editor de visual Basic, me pide contraseña la cual no tengo, me podrian informar como hago para desprotegerla, ojala sea un paso a paso no soy experto. gracias

Anónimo dijo...

Me encanta esta página que acabo de descubrir. Tengo una pregunta dando vueltas y es un problema que me surge con frecuencia en mis archivos, ¿puedo aplicar esta macro (aunque haya que modificarla) a un grupo de hojas ?

Javier Marco dijo...

Si deseas proteger/desproteger hojas, puedes aplicar ese código a tantas hojas como desees. Eso sí, lo que no puedes hacer es seleccionar todo el grupo de hojas a la vez para aplicarles la protección/desprotección de hojas. Deberás hacerlo, hoja a hoja, tanto si todas las hojas tienen el mismo password, como si tienen una contraseña distinta cada una.

No sé si era esa tu consulta...

Anónimo dijo...

Realmente lo que buscaba era el modo de seleccionarlas todas y de una sóla vez protegerlas, pero aún así me ha ayudado bastante.....
Gracias

Javier Marco dijo...

Tienes una opción muy sencilla, que es meter esas líneas de código en un bucle que lo que hace es recorrer todas las hojas. Algo tan sencillo como esto, por ejemplo para proteger todas las hojas:

Sub proteger_todas()
'para todas las hojas del libro...
For i = 1 To Sheets.Count
'protegemos la hoja de que se trate con el password: pepe
Sheets(i).Protect "pepe"
'continuamos con la siguiente hoja
Next
End Sub

Mírate esto otro, que igual te interesa. Es otra forma para proteger un libro de excel.

Javier Marco dijo...

Hola giuliano. Échale un vistazo a este artículo donde se explica como proteger y desproteger una hoja de excel sin usar macros.

Saludos.

Robert Blanco dijo...

Muy agradecido por compartir sus conocimientos. Una consulta sobre el punto, como puedo usar un control activex, estando la hoja protegida?, por ejemplo el calendario? o el monthview?, porque al intentar desproteger por macro cuando se de un evento click, solo me permite hacer el click en ciertas zonas del objeto y no justamente en las fechas donde necesito.

Anónimo dijo...

Wow Javier, excelente página. Quería hacerte una consulta (como todo lector!!!)
Tengo una hoja que protejo cada vez con una clave diferente, en total uso un listado de 12 claves posibles que yo conozco pues la asigno yo misma. Lo que deseo es que en esa misma hoja, cuando corra la macro a crear, se prueben las contraseñas una a una hasta dar con la que en esas 12, es la correcta y al dar con la clave, interrumpa la búsqueda y desproteja de una vez. Supongo que necesito un ciclo que lo controle, pero no se hacer esto. Siempre será una de esas 12 claves pero cada vez que guardo la hoja debo poner la clave de mi lsta y lo que colocar manualmente la que tiene sino que la macro lo haga por mi. ?hay forma? Espero que si y que me puedas ayudar. Desde ya gracias Y FELICITACIONES POR ESTE BLOG QUE ES EXCELENTE!!!

Javier Marco dijo...

Mira que os gusta complicaros la vida... ¡¡¡12 passwords!!!.

Puedes probar algo como esto... Es un ejemplo con 3 passwords.

No me preguntes como volver a proteger, porque eso te lo dejo para que investigues. Puedes volver a proteger, por ejemplo, metiendo el password en una variable global (googlea, para saber que es eso). Luego ya no necesitarás ejecutar este macro que te pongo, si tienes que volver a proteger/desproteger, pues el password estará almacenado en una variable global.

Para lo que pides, prueba esto:

Sub desproteger()
'Si hay errores, que continúe
On Error Resume Next
'definimos las posibles contraseñas
passwords = "juan, pepe, ana"
'separamos cada password para probarlas
pass = Split(passwords, ",")
'probamos...
For i = 0 To UBound(pass)
'desprotegemos, probando
ActiveSheet.Unprotect pass(i)
Next
End Sub

No quites la 1ª línea del macro (On error resume next), porque si probamos la primera contraseña, y no es esa la elegida, nos dará error, y se detendrá el macro. Con esa línea, contínua haciendo lo que tiene que hacer, incluso con errores.

Un saludo.

Enrique Herrera dijo...

Excelente blog, la verdad me ha ayudado de sobremanera la información publicada aquí.

Quisiera que me ayudaran con algo en lo que he estado trabajando y que aún no he podido solucionar.

¿Hay alguna forma de que una macro guarde un archivo asignando un password mediante la opción nativa de excel "contraseña de apertura" que se encuentra en el apartado de "herramientas" cuando se "guarda como..."?

Es decir, que al abrir el archivo que he guardado mediante la macro, éste pida la contraseña de apertura del mismo (opción que obviamente se encuentra disponible en excel).

Yo se que lo más fácil sería hacerlo manualmente, pero he pensado en incluir un botón en l libro que tengo para aquellos usuarios que no dominan este procedimiento.

De antemano muchas gracias por sus respuestas. Exitos!

Enrique Herrera.

Javier Marco dijo...

En este artículo tienes un ejemplo desarrollado con VBA: Proteger un libro excel.

No obstante, si lo quieres hacer con la solución que implementa el propio Excel, puedes probar con algo como esto:

Sub Guardar_con_password()
ruta = "C:\Mis cosas personales\ejemplo.xls"
pass_apertura = "Enrique"
ActiveWorkbook.SaveAs Filename:=ruta, Password:=pass_apertura
End Sub

Por cierto, hoy he publicado un nuevo artículo con cuestiones relacionadas con la protección de ficheros excel.

Enrique Herrera dijo...

Muchas gracias Javier!

Lo que me has propuesto me ha funcionado excelentemente. Muchas gracias por compartir tus conocimientos.

El problema que tenía era simple, yo estaba usando el parámetro:

ActiveWorkbook.SaveCopyAs

que me imagino no admite la opción:

Password:="abc"

porque me devolvía un error. Sin embargo, al utilizar el código que me detallaste me di cuenta que lo correcto era:

ActiveWorkbook.SaveAs

que obviamente si admite la opcion para asignar password.

Yo estaba utilizando "...SaveCopyAs" porque pense que era la sintaxis correcta para guardar una copia del archivo original. Sin embargo ahora me doy cuenta que no es indispensable.

Obviamente tan sencillo error no lo hubiera solucionado sin tu ayuda. Muchas gracias!

Por cierto, disculpa mi tardanza en agradecer.

Att. Enrique Herrera

Anónimo dijo...

Hola..soy nueva en el tema..en realidad ando en el Visual Basic de pasadita..x eso estoy con una dificultad he creado una serie de macros que tienen como principal objetivo pedir contraseñas para habilitar ciertas hojas que estan "hidden", la dificultad es que cuando el usuario logra abrir la hoja y cierra el archivo de excel,una vez que se abre el archivo de nuevo estas hojas que no deseo que sean visibles lo están, que puedo hacer para q no se guarde eso?

Javier Marco dijo...

Mírate este artículo donde explico como ocultar o mostrar hojas, con macros

Gonzalo Grossetete dijo...

Re-bueno tu blog y sabes queria hacerte una preguntas... estoy haciendo unas macros y nececito que una vez finalizada la macro el archivo se guarde automaticamente, eso lo hace, pero ademas necesito que se guarde en una direccion que no siempre va a estar disponible, entonces queria saber como puedo saber si la direccion donde guardo la copia esta disponible o no

de entemano
gracias

Anónimo dijo...

JAVIER EXCELENTE PAGINA MUCHAS FELICIDADES, TE LLEVASTE UN 110 DE CALIFICACION.
A TODOS LOS QUE NOS HACIA FALTA UNA AYUDADITA DEBEMOS ESTAR AGRADECIDOS CON TIGO.
Y PARA VARIAR YO TAMBIEN TENGO UNA PREGUNTA Y SOLICITO TU AYUDA. ESPERO DARME A ENTENDER.
TENGO UN PROGRAMA QUE REALICE PARA ELABORAR MENUS DE COMIDA Y QUE REALIZA HOJAS DE PRODUCCION Y ORDENES DE COMPRA. NADA MAS HAY QUE INTODUCIR LA RECETA Y PROGRAMAR EL MENU Y VA! TODO EL TRABAJO ESTA LISTO.
ESTE PROGRAMITA ME LO QUIEREN COMPRAR PERO DESEO QUE TENGA UNA CONTRASEÑA DE APERTURA QUE NADA MAS YO LA CONOSCA, Y QUE CON UNA MACRO PROTEGIDA SE PUEDA HABRIR. VAMOS AL ABRIR EL LIBRO ME PIDE EL PASSWORD, Y HAY QUE INGRESARLO, PERO QUIERO INSTALAR UN BOTON EN LA BARRA DE MENU QUE REALICE ESTE PROCESO EN EL ORDENADOR QUE LO DEJE Y QUE CUANDO LO QUIERAN ABRIR EN OTRO NO PUEDAN Y SE PIDA LA CONTRASEÑA.

TE AGRADECERE INFINITAMENTE TU GRAN AYUDA.

L.C.P. JUAN MANUEL LEAL

Javier Marco dijo...

En este blog, tienes varios artículos relacionados con el tema de la protección de trabajos en Excel. El que más te interesa es el de proteger un libro de excel (puedes incluir las 2 técnicas que se explican allí). También te interesan estos artículos:
Protegiendo nuestros trabajos en excel
Leer el número de serie de los discos
Impedir que se le cambie el nombre al fichero

Anónimo dijo...

DISCULPA QUE TE CONTESTE HASTA HOY.

MUCHAS GRACIAS POR TU AYUDA, ME SIRVIO MUCHISIMO.

Y DE NUEVA CUANTA FELICIDADES POR TU WEB.

UN SALUDO A TODOS DESDE ACA GUADALAJARA, JALISCO, MEXICO.

JUAN MANUEL

Raul Guajardo dijo...

Javier, tu página está excelente y me ha ayudado mucho.
Estoy creando un control de operaciones que consta de varios módulos y los he protegido contra escritura por medio de macros en la cual incluyo la contraseña, y uno de ellos es una tabla dinámica, y es en este módulo que al protegerlo mediante macros no permite activar el filtro de informe. Para que funcione el filtro de informe estando protegido el módulo tengo que protegerlo manualmente activando la casilla "Usar informes de tabla dinámica". Me puedes decir como resolver el problema mediante la protección con macros?
Agradezco tus atenciones

Anónimo dijo...

Saludos, despues de pasar varias horas haciendo el intento de ver una hoja oculta y que además tenia contraseña la hoja y el libro, la instrucción siguiente funciono perfecto:
Sub desproteger()
On Error Resume Next
passwords = "juan, pepe, ana"
pass = Split(passwords, ",")
For i = 0 To UBound(pass)
ActiveSheet.Unprotect pass(i)
Next
End Sub
Primero desprotegi el libro, luego la hoja y finalmente con BVA di la instrucción en la hoja correspondiente, por ultimo cambie el valor de Visible que estaba Hidde a -1-xlsheetvisible.

Muchas gracias

Daltonbuc66

Unknown dijo...

Es interesante todo lo que hay en este Blog; no soy programadora y con toda la informacion que colocas, los detalles, las explicaciones y los ejemplos he logrado hacer mi primer macro en execel!! Me agrda trabajar con excel y tu página es lo mejor que he encontrado para darle mejor utilidad a mis hojas de cálculo.
Felicidades por tu Blog, y muchas gracias por compartir todos tus conocimientos sin mezquindades.

sadid montero dijo...

hola, me gustaria saber como hago para desproteger la contraseña de un archivo de excel que lo tenia hace años, cuando abro el archivo de excel, de entrada me pide una contraseña y no me la se, me gustaria mucho que me ayudaran, he aprendido mucho de este blog, gracias por la ayuda

Javier Marco dijo...

Échale un vistazo a este artículo: Desproteger una hoja de cálculo.

Saludos.

clar dijo...

Hola necesito ayuda..........
No puedo ver el codigo de una macro de esxcel pq tiene contraseña
Lo intente con el codigo q adjunto pero no se puede pq; puedo crear el nobre de la macro, pero para copiar el codigo ya no abre la nueva ventana, sino q abre una para solicitar contraseña.

Por favor ayudenme es urgente y sumamente importante.
Gracias.

1.Sub breakit()
2.
3. Dim i As Integer, j As Integer, k As Integer
4. Dim l As Integer, m As Integer, n As Integer
5.
6. On Error Resume Next
7. For i = 65 To 66
8. For j = 65 To 66
9. For k = 65 To 66
10. For l = 65 To 66
11. For m = 65 To 66
12. For i1 = 65 To 66
13. For i2 = 65 To 66
14. For i3 = 65 To 66
15. For i4 = 65 To 66
16. For i5 = 65 To 66
17. For i6 = 65 To 66
18. For n = 32 To 126
19.
20. ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
21. Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
22. Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
23.
24. If ActiveSheet.ProtectContents = False Then
25. MsgBox "Un password valido es " & Chr(i) & Chr(j) & _
26. Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) _
27. & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
28. Exit Sub
29. End If
30. Next
31. Next
32. Next
33. Next
34. Next
35. Next
36. Next
37. Next
38. Next
39. Next
40. Next
41. Next
42.
43.End Sub

Javier Marco dijo...

Mírate este artículo: desproteger una hoja de cálculo.

Saludos

YVANTERAN dijo...

muy interesante tu blog, tengo un caso, manejo una base de datos en la que tengo que ingresar fechas y que se colorean automaticamente en un rango de fecha de un color y de otro en otro rango de fecha.
Lo que mas me interesa es que al ingresar una fecha a la celda esta se bloquee automaticamente, y no deje modificar la celda que se ingreso el dato.
Es posible hacer eso?
por favor escribeme a mi correro yvanteran@hotmail.com
Gracias.

Luis Fuentes dijo...

Gracias por compartir tus conocimientos! Me ayudó para proteger y desproteger una hoja al activarla. ¡Que sencillo!

Gracias y felicitaciones!

Luis Fuentes
Venezuela

Anónimo dijo...

hola, ante todo muchas gracias por estas macros, que sirven de mucho en mi trabajo. bueno mi problema es el sigueinte, quiero desporteger varias hojas de excel, que tienen la misma clave, y tengo como 300 arhivos de excel, con el mismo problema, quiero saber si hay uma macro que se ejecute y desprotega todos los libros de cada uno de los 300 archivos de exceles que hay, alguien me puede ayudar.. leonardo castilla, bogota colombia

Unknown dijo...

Hola. Necesito ayuda por favooooorrrrr....cómo hacer para que luego unos segundos de ingresado un dato en una celda de excel, este no se pueda modificar.....Gracias. Si me pueden responder a glopez4@gmail.com ó a calidad@lamaria.com.co

Saludos,

Gloria L.

Julio Aguilar dijo...

Buenas Javier Marco la macro para proteger el libro esta buena, pero sucede que cuando la ejecuto al habrir el libro automaticamente me cancela todas las macros y no me permite activarlas, habrá algún modo para evitar esto? y la otra pregunta es hay alguna macro para evitar que se creen mas hojas de calculo en un libro. y por ultimo mire la macro para crear hojas en solo clip y es buena pero deseo saber si una vez que se crea la hoja que se evite en volver a crear la misma hoja?

Anónimo dijo...

HOLA!!!
EL TEMA ES QUE EN MI HOJA DE EXCEL TENGO TEXTO NUMEROS Y CONTROLES ACTIVEX, ENTONCES PROTEGO MI HOJA CON LA OPCION DE MODIFICAR EXCENARIOS Y OBJETOS, MI DILEMA RADICA CUANDO QUIERO CAMBIAR LOS ESCENARIOS DE MIS CONTROLES ACTIVEX EXCEL ME MANDA EL MENSAJE ""LA CELDA O EL GRAFICO QUE INTENTA MODIFICAR ESTAN PROTEGIDOS POR TANTO SON SOLO DE LECTURA"" SABEN COMO TENGO QUE HACER PARA QUE NO APAREZCA, YA DECLARE LOS RANGOS QUE QUIERO MODIFICAR, ASI COMO ESCENARIOS PERO NO PUEDO. URGENTE POR FAVOR....

Anónimo dijo...

POR FAVOR AYUDA DESEO DESHABILITAR EL BLOQUEO SE LA CONTRASEÑA LO PUEDO ABRIR Y TODO PERO ESA INFORMACION LA DEBO PASAR POR CORREO TODOS LOS DIAS Y MIS JEFES NO LA PUEDEN ABRIR NI SIQUIERA CON LA CONTRASEÑA NECESITO DESHABILITAR LA CONTRASEÑA POOOOR FFAAAAA