Inhabilitar guardar como...
Tengo un archivo excel para realizar unas simulaciones y necesito protegerlo inhabilitando las opciones de guardar y guardar como... Del submenú. ¿Es posible hacerlo?
1 respuesta
Respuesta de fejoal
2
2
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
En principio deberías asociar la macro de desactivar al evento de Apertura de archivo.
Luego, antes de cerrarlo, otra macro debería devolver la situación a su estado normal.
Para hacerlo, activa el editor de Visual Basic (presiona Alt+F11) y busca la hoja que dice "ThisWorkbook" Da doble click sobre ella.
Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic:
Private Sub Workbook_Open()
' Pone en gris e inhabilita la opción "Guardar" de "Archivo"
With Application.CommandBars("Worksheet Menu Bar")
With .Controls("&Archivo")
With .Controls("&Guardar")
.Enabled = False
.Visible = True
End With
End With
End With
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Devuelve funcion a menú
With Application.CommandBars("Worksheet Menu Bar")
With .Controls("&Archivo")
With .Controls("&Guardar")
.Enabled = True
.Visible = True
End With
End With
End With
End Sub
Cierra el editor de Visual Basic y graba el archivo.
La próxima vez que abras este archivo la opción aparecerá "grisada" e inoperable.
Un alternativa es que directamente no esté siquiera visible, para ello usa
.Visible = False
En la primer macro.
---
Hasta aquí tu pregunta. Con lo indicado, bloqueas *este* camino para grabar archivos.
Pero existen otras formas de grabar un archivo sin usar esas opciones. Por ejemplo, usando Ctrl + G o con la tecla de función F12 o cuando cierras el archivo y te consulta si quieres guardar los cambios...
En tal caso, una mejor opción que la anterior es interceptar cualquier intento de grabar el archivo (eso incluye cuando TU quieras hacerlo, pero tiene solución)
Para ello, en el mismo lugar donde colocaste los macros anteriores, pega este código:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "No debes grabar este archivo", vbCritical, ">>>>> NO GRABAR!!!"
Cancel = True
End Sub
Cierra el editor de Visual Basic.
No es necesario que elimines los otros procedimientos pues no deja de ser un mensaje para que no intenten grabar.
A partir de ahora, ante cualquier intento de grabar el archivo aparecerá un mensaje alertando al usuario que no es posible grabar el archivo y -de hecho- no lo hará.
... PERO
Todo esto es muy eficiente siempre que, claro está, el usuario haya habilitado macros cuando MS Excel le avisó que los tenía.
Si abrió sin habilitar macros todo lo anterior es inútil y el archivo podrá ser grabado.
Una solución alternativa es cambiarle -por fuera y con el archivo cerrado - las propiedades a tal archivo (con el Explorador de Windows) y configurarlo como "de Sólo lectura".
Este procedimiento es sencillo y tu usuario también puede hacer el camino contrario para convertirlo en "grabable" nuevamente.
Por ello, tu mejor opción aunque no infalible es grabar tu archivo como plantilla y asignarle una contraseña de grabación para que sólo quien la conozca pueda grabar el archivo. Esto sin perjuicio de que apliques todas las otras recomendaciones que te dí.
(Considera que la valoración que figura predeterminada
es 3/5. Tal vez quieras cambiarla...)
En caso contrario, puedes preguntarme nuevamente
Aclarando qué entendí mal o qué faltó.
Luego, antes de cerrarlo, otra macro debería devolver la situación a su estado normal.
Para hacerlo, activa el editor de Visual Basic (presiona Alt+F11) y busca la hoja que dice "ThisWorkbook" Da doble click sobre ella.
Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic:
Private Sub Workbook_Open()
' Pone en gris e inhabilita la opción "Guardar" de "Archivo"
With Application.CommandBars("Worksheet Menu Bar")
With .Controls("&Archivo")
With .Controls("&Guardar")
.Enabled = False
.Visible = True
End With
End With
End With
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Devuelve funcion a menú
With Application.CommandBars("Worksheet Menu Bar")
With .Controls("&Archivo")
With .Controls("&Guardar")
.Enabled = True
.Visible = True
End With
End With
End With
End Sub
Cierra el editor de Visual Basic y graba el archivo.
La próxima vez que abras este archivo la opción aparecerá "grisada" e inoperable.
Un alternativa es que directamente no esté siquiera visible, para ello usa
.Visible = False
En la primer macro.
---
Hasta aquí tu pregunta. Con lo indicado, bloqueas *este* camino para grabar archivos.
Pero existen otras formas de grabar un archivo sin usar esas opciones. Por ejemplo, usando Ctrl + G o con la tecla de función F12 o cuando cierras el archivo y te consulta si quieres guardar los cambios...
En tal caso, una mejor opción que la anterior es interceptar cualquier intento de grabar el archivo (eso incluye cuando TU quieras hacerlo, pero tiene solución)
Para ello, en el mismo lugar donde colocaste los macros anteriores, pega este código:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "No debes grabar este archivo", vbCritical, ">>>>> NO GRABAR!!!"
Cancel = True
End Sub
Cierra el editor de Visual Basic.
No es necesario que elimines los otros procedimientos pues no deja de ser un mensaje para que no intenten grabar.
A partir de ahora, ante cualquier intento de grabar el archivo aparecerá un mensaje alertando al usuario que no es posible grabar el archivo y -de hecho- no lo hará.
... PERO
Todo esto es muy eficiente siempre que, claro está, el usuario haya habilitado macros cuando MS Excel le avisó que los tenía.
Si abrió sin habilitar macros todo lo anterior es inútil y el archivo podrá ser grabado.
Una solución alternativa es cambiarle -por fuera y con el archivo cerrado - las propiedades a tal archivo (con el Explorador de Windows) y configurarlo como "de Sólo lectura".
Este procedimiento es sencillo y tu usuario también puede hacer el camino contrario para convertirlo en "grabable" nuevamente.
Por ello, tu mejor opción aunque no infalible es grabar tu archivo como plantilla y asignarle una contraseña de grabación para que sólo quien la conozca pueda grabar el archivo. Esto sin perjuicio de que apliques todas las otras recomendaciones que te dí.
(Considera que la valoración que figura predeterminada
es 3/5. Tal vez quieras cambiarla...)
En caso contrario, puedes preguntarme nuevamente
Aclarando qué entendí mal o qué faltó.
Hola Fejoal
Hasta ahora todo me ha servido sin problemas, pero necesito más ayuda.
Lo que pasa es que el archivo excel que tengo necesito protegerlo también de la copia y el corte (de celdas y hojas) para pegarlo en un nuevo documento.
Ya pude inhabilitar la opción copiar de edición > copiar, pero me falta el ícono y el menú que aparece con el botón derecho.
Gracias por tu ayuda
Yoly
Hasta ahora todo me ha servido sin problemas, pero necesito más ayuda.
Lo que pasa es que el archivo excel que tengo necesito protegerlo también de la copia y el corte (de celdas y hojas) para pegarlo en un nuevo documento.
Ya pude inhabilitar la opción copiar de edición > copiar, pero me falta el ícono y el menú que aparece con el botón derecho.
Gracias por tu ayuda
Yoly
¡Qué caras me van a salir estas cinco estrellas! ;))
OK.
Vamos por partes como dijo Hannibal Lecter:
a.- Para inhabilitar el ícono de "Copiar", debes colocar la siguiente sentencia a abrirse el archivo [ya sabes: en Private Sub Workbook_Open()]
Application.CommandBars("Standard").Controls(8).Enabled = False
Como siempre, al cerrar el archivo debería habilitarlo nuevamente para que puedas usarlo en otras planillas.
Por ello, también en Private Sub Workbook_BeforeClose(Cancel As Boolean)
coloca esta reversión:
Application.CommandBars("Standard").Controls(8).Enabled = True
Listo lo del ícono.
---
b.- Menú contextual
Otra vez busca la hoja que dice "ThisWorkbook" ( o "EsteLibro" según la versión). Da doble click sobre ella.
Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic. Si ya tienes allí macros, pégalo a continuación del último:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
Cancel = True
End Sub
Cierra el editor de VBA.
A partir de ahora, al dar click derecho sobre cualquiera de sus hojas NO aparecerá el menú contextual.
Bien, esto resuelve tu segunda pregunta.
¿Por qué imagino que tu siguiente pregunta será: Y si también quiero evitar que copien usando los atajos de teclado Ctrl + C y Ctrl + V?
Si acerté, lee lo siguiente:
La solución pasa por instruir en VBA qué hacer cuando ambas teclas son presionadas.
Para ello necesitarás unos comandos también al abrir el archivo que luego deberán ser revertidos al cerrarlo para que restablecer su funcionamiento normal.
Inserta un módulo nuevo y pega allí todo esto:
Sub Nocopia() 'Inhabilita los atajos para copiar,cortar y pegar
Application. OnKey "^c", "cancelalo"
Application. OnKey "^C", "cancelalo"
Application. OnKey "^v", "cancelalo"
Application. OnKey "^V", "cancelalo"
Application. OnKey "^x", "cancelalo"
Application. OnKey "^X", "cancelalo"
End Sub
Sub cancelalo()
Cancel = True
End Sub
Sub Sicopia() 'Habilita los atajos para copiar,cortar y pegar
Application. OnKey "^c"
Application. OnKey "^C"
Application. OnKey "^v"
Application. OnKey "^V"
Application. OnKey "^x"
Application. OnKey "^X"
End Sub
Tienes ahora tres macros más. El primero inhabilita los comandos de copiar, cortar y pegar diparando el segundo macro cuando se presionen cualquiera de esos atajos. El segundo macro, simplemente cancela la instrucción que el usuario haya dado. Finalmente el tercer macro restituye la funcionalidad a la teclas para que puedan ser usadas nuevamente al salir del formulario.
Por lo tanto, Yoli, deberías tener un llamado a la primera macro al abrir el archivo, esw decir en el procedimiento que ya tienes sobre Workboook_Open, simplemente agrega esta línea:
Nocopia
Y en la macro de salida del archivo, una línea con:
Sicopia
Calculo que esto resolverá tu problema. Si así fuera, ya sabes qué hacer...
Un gran abrazo!
Fernando
OK.
Vamos por partes como dijo Hannibal Lecter:
a.- Para inhabilitar el ícono de "Copiar", debes colocar la siguiente sentencia a abrirse el archivo [ya sabes: en Private Sub Workbook_Open()]
Application.CommandBars("Standard").Controls(8).Enabled = False
Como siempre, al cerrar el archivo debería habilitarlo nuevamente para que puedas usarlo en otras planillas.
Por ello, también en Private Sub Workbook_BeforeClose(Cancel As Boolean)
coloca esta reversión:
Application.CommandBars("Standard").Controls(8).Enabled = True
Listo lo del ícono.
---
b.- Menú contextual
Otra vez busca la hoja que dice "ThisWorkbook" ( o "EsteLibro" según la versión). Da doble click sobre ella.
Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic. Si ya tienes allí macros, pégalo a continuación del último:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
Cancel = True
End Sub
Cierra el editor de VBA.
A partir de ahora, al dar click derecho sobre cualquiera de sus hojas NO aparecerá el menú contextual.
Bien, esto resuelve tu segunda pregunta.
¿Por qué imagino que tu siguiente pregunta será: Y si también quiero evitar que copien usando los atajos de teclado Ctrl + C y Ctrl + V?
Si acerté, lee lo siguiente:
La solución pasa por instruir en VBA qué hacer cuando ambas teclas son presionadas.
Para ello necesitarás unos comandos también al abrir el archivo que luego deberán ser revertidos al cerrarlo para que restablecer su funcionamiento normal.
Inserta un módulo nuevo y pega allí todo esto:
Sub Nocopia() 'Inhabilita los atajos para copiar,cortar y pegar
Application. OnKey "^c", "cancelalo"
Application. OnKey "^C", "cancelalo"
Application. OnKey "^v", "cancelalo"
Application. OnKey "^V", "cancelalo"
Application. OnKey "^x", "cancelalo"
Application. OnKey "^X", "cancelalo"
End Sub
Sub cancelalo()
Cancel = True
End Sub
Sub Sicopia() 'Habilita los atajos para copiar,cortar y pegar
Application. OnKey "^c"
Application. OnKey "^C"
Application. OnKey "^v"
Application. OnKey "^V"
Application. OnKey "^x"
Application. OnKey "^X"
End Sub
Tienes ahora tres macros más. El primero inhabilita los comandos de copiar, cortar y pegar diparando el segundo macro cuando se presionen cualquiera de esos atajos. El segundo macro, simplemente cancela la instrucción que el usuario haya dado. Finalmente el tercer macro restituye la funcionalidad a la teclas para que puedan ser usadas nuevamente al salir del formulario.
Por lo tanto, Yoli, deberías tener un llamado a la primera macro al abrir el archivo, esw decir en el procedimiento que ya tienes sobre Workboook_Open, simplemente agrega esta línea:
Nocopia
Y en la macro de salida del archivo, una línea con:
Sicopia
Calculo que esto resolverá tu problema. Si así fuera, ya sabes qué hacer...
Un gran abrazo!
Fernando
- Compartir respuesta
1 comentario
Interesante. Me podrías ayudar como hacer una macro para que vuelva a activar las opciones de Guardar; es decir, que estén desactivados y solo cuando pulse en un botón se pueda guardar. Gracias por la ayuda. - aniava