none
Deshabilitar boton de Proteger/Desproteger hoja. RRS feed

  • Pregunta

  • Saludos, es mi primera pregunta, sin embargo muchas veces me he beneficiado de sus aportes.

    Y en esta ocasión necesito saber, si hay posibilidad de hacer que un archivo que esta protegido por una contraseña pero que hace modificaciones por medio de botones asignados a macros y esos macros contienen la contraseña para deshabilitar la opción de protección, a pesar de estar protegido por contraseña el código del macros, si el usuario hace clic en desproteger no le pregunta la contraseña.

    Lo que quiero es deshabilitar la pestaña y que solo se pueda acceder con un botón que pregunte una clave o algún mecanismo alterno para evitar que desbloqueen la hoja.

    No se que se les puede ocurrir...? De antemano, gracias.
    viernes, 21 de septiembre de 2012 3:10

Respuestas

  • Editado:

    Creo que acabo de pillar tu problema, ahora, después de haber escrito la Biblia en verso, jaja. Tú dices de un botón que desbloquee la hoja, el usuario ingresa el registro y automáticamente luego se bloquee? Si es así, tu solución es utilizar formularios (los puedes crear desde el mismo editor de VBA y es muy fácil). Si no, entonces mira si lo que he escrito más adelante te sirve. Un saludo.


    Como hago para que solo los que se dedican a cargar registros no puedan de ninguna manera desbloquear el archivo? Sino que sea solo mediante en los segundos que el macro se ejecuta para permitir el registro y luego se bloquee.

    Es que lo que no entiendo es lo que comentas. Para hacer lo pides basta con en la macro desbloquear y bloquear la hoja al principio y al final respectivamente. Con ello tendrías que tener solucionado tu problema.

    Sería del tipo:

    Sub Ingresar_Reg()

    On Error Goto Bloquear

    Dim Ws As Worksheet

    Application.EnableCancelKey = xlDisabled

    For Each Ws In ThisWorkbook.Worksheets Ws.Unprotect "TuContraseña" Next Ws ' ... ' Tu código para ingresar los registros AQUí. ' ...

    Bloquear: For Each Ws In ThisWorkbook.Worksheets Ws.Protect "TuContraseña" Next Ws

    Application.EnableCancelKey = xlInterrupt

    End Sub


    De este modo estará habilitado el Desproteger... de la pestaña de la hoja, pero le pedirá una contraseña que no conoce (debes proteger el código VBA para que no sea visible la contraseña, claro).

    Y si aún así, si la macro es parada porque ha habido un error, la macro irá hasta la etiqueta Bloquear y bloqueará todas las hojas antes de detenerse.

    Y si además, con la instrucción Application.EnableCancelKey = xlDisabled deshabilitas la capacidad de interrumpir la macro con ESC (luego, una vez protegidas todas las hojas, lo vuelves a habilitar).

    Yo tendría el botón para los que solo deben ingresar registros con este último código. Los otros usuarios, que pueden desbloquear las hojas, les haría un botón con el siguiente código:

    Sub Desproteger_Hoja() PWD = InputBox("Indique la contraseña para ejecutar la macro.") On Error GoTo PWDincorrect

    Dim Ws As Worksheet

    For Each Ws In ThisWorkbook.Worksheets Ws.Unprotect PWD Next Ws Exit Sub PWDincorrect: MsgBox "La contraseña indicada es incorrecta. No se desbloquearán las hojas." End Sub


    Finalmente, para asegurarme de que el archivo siempre queda bloqueado cuando lo cierro, añadiría el siguiente código en el objeto ThisWorkbook:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Dim Ws As Worksheet
    
    For Each Ws In ThisWorkbook.Worksheets
        Ws.Protect "TuContraseña"
    Next Ws
    
    End Sub

    Proteges todas las hojas antes de guardar el archivo sí o sí.

    Creo que con todo esto no dejas ningún flanco abierto. ya me dirás que tal te ha ido. Y encantado de poder echar una mano, hombre ;)


    Working Into Binary (WIB) - http://workingintobinary.blogspot.com.es/


    • Editado Albert Álvarez sábado, 22 de septiembre de 2012 12:23
    • Marcado como respuesta Jose Labrador domingo, 23 de septiembre de 2012 2:31
    sábado, 22 de septiembre de 2012 12:16

Todas las respuestas

  • Con que instrucción proteges la hoja? Le asignas una contraseña a "esa" protección? Si proteges sin utilizar una contraseña, al desprotegerla desde la pestaña de la hoja no te la pide y puedes desprotegerla sin problemas.

    Prueba con la instrucción:

    Worksheets("NombreHoja").Protect "TuContraseña"


    Working Into Binary (WIB) - http://workingintobinary.blogspot.com.es/

    viernes, 21 de septiembre de 2012 12:20
  • Saludos, gracias por tu respuesta, pero creo no me fue captada la idea, actualmente así como tu me indicas esta bloqueando y desbloqueando la hoja a traves de los macros.

    Pero si tu ejecutas el macro, bloquea y desbloquea en todo momento, la cosa es que si el usuario es habil y presiona el botón desproteger, excel lo hara sin preguntarle la clave, y eso es lo que no quiero, que el usuario pueda desproteger la hoja.

    viernes, 21 de septiembre de 2012 14:25
  • Si quieres que la macro pida contraseña puedes hacerlo de la siguiente manera:

    Sub Tu_Macro()
    PWD = InputBox("Indique la contraseña para ejecutar la macro.")
    ActiveSheet.Unprotect PWD
    '...
    'Tu código aquí.
    '...
    ActiveSheet.Protect PWD
    End Sub
    No se si es esto lo que pides. De esta manera no se desbloquea la hoja si no conoces la contraseña.

    Working Into Binary (WIB) - http://workingintobinary.blogspot.com.es/

    viernes, 21 de septiembre de 2012 15:29
  • Quizás eso me pueda servir, pero no del todo, te explico, tengo dos tipos de usuarios que usan el archivo, unos que solo se dedican a cargar registros y otros que pueden cargar registro y pueden desbloquear la hoja conociendo la contraseña.

    Como hago para que solo los que se dedican a cargar registros no puedan de ninguna manera desbloquear el archivo? Sino que sea solo mediante en los segundos que el macro se ejecuta para permitir el registro y luego se bloquee.

    En conclusión, lo que necesito es que puedan usar el archivo, mas no que puedan desbloquearlo.

    Agradecido por tu apoyo.

    viernes, 21 de septiembre de 2012 15:34
  • Editado:

    Creo que acabo de pillar tu problema, ahora, después de haber escrito la Biblia en verso, jaja. Tú dices de un botón que desbloquee la hoja, el usuario ingresa el registro y automáticamente luego se bloquee? Si es así, tu solución es utilizar formularios (los puedes crear desde el mismo editor de VBA y es muy fácil). Si no, entonces mira si lo que he escrito más adelante te sirve. Un saludo.


    Como hago para que solo los que se dedican a cargar registros no puedan de ninguna manera desbloquear el archivo? Sino que sea solo mediante en los segundos que el macro se ejecuta para permitir el registro y luego se bloquee.

    Es que lo que no entiendo es lo que comentas. Para hacer lo pides basta con en la macro desbloquear y bloquear la hoja al principio y al final respectivamente. Con ello tendrías que tener solucionado tu problema.

    Sería del tipo:

    Sub Ingresar_Reg()

    On Error Goto Bloquear

    Dim Ws As Worksheet

    Application.EnableCancelKey = xlDisabled

    For Each Ws In ThisWorkbook.Worksheets Ws.Unprotect "TuContraseña" Next Ws ' ... ' Tu código para ingresar los registros AQUí. ' ...

    Bloquear: For Each Ws In ThisWorkbook.Worksheets Ws.Protect "TuContraseña" Next Ws

    Application.EnableCancelKey = xlInterrupt

    End Sub


    De este modo estará habilitado el Desproteger... de la pestaña de la hoja, pero le pedirá una contraseña que no conoce (debes proteger el código VBA para que no sea visible la contraseña, claro).

    Y si aún así, si la macro es parada porque ha habido un error, la macro irá hasta la etiqueta Bloquear y bloqueará todas las hojas antes de detenerse.

    Y si además, con la instrucción Application.EnableCancelKey = xlDisabled deshabilitas la capacidad de interrumpir la macro con ESC (luego, una vez protegidas todas las hojas, lo vuelves a habilitar).

    Yo tendría el botón para los que solo deben ingresar registros con este último código. Los otros usuarios, que pueden desbloquear las hojas, les haría un botón con el siguiente código:

    Sub Desproteger_Hoja() PWD = InputBox("Indique la contraseña para ejecutar la macro.") On Error GoTo PWDincorrect

    Dim Ws As Worksheet

    For Each Ws In ThisWorkbook.Worksheets Ws.Unprotect PWD Next Ws Exit Sub PWDincorrect: MsgBox "La contraseña indicada es incorrecta. No se desbloquearán las hojas." End Sub


    Finalmente, para asegurarme de que el archivo siempre queda bloqueado cuando lo cierro, añadiría el siguiente código en el objeto ThisWorkbook:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Dim Ws As Worksheet
    
    For Each Ws In ThisWorkbook.Worksheets
        Ws.Protect "TuContraseña"
    Next Ws
    
    End Sub

    Proteges todas las hojas antes de guardar el archivo sí o sí.

    Creo que con todo esto no dejas ningún flanco abierto. ya me dirás que tal te ha ido. Y encantado de poder echar una mano, hombre ;)


    Working Into Binary (WIB) - http://workingintobinary.blogspot.com.es/


    • Editado Albert Álvarez sábado, 22 de septiembre de 2012 12:23
    • Marcado como respuesta Jose Labrador domingo, 23 de septiembre de 2012 2:31
    sábado, 22 de septiembre de 2012 12:16
  • Saludos Albert, gracias por tu tiempo y tu respuesta, creo que ahora si me entendiste la idea! jeje!  Voy a probar y te cuento luego como resulto el codigo.

    Agradecido.

    domingo, 23 de septiembre de 2012 2:32