Para realizar ese procedimiento la clave para desproteger la hoja debe estar anclada a una celda de una hoja del libro, esa hoja podría asignarle la propiedad xlVeryHidden para que no sea visible ni pueda mostrarse. Siga estos pasos:
1- Inserte una nueva hoja en el libro colóquele el nombre "CLAVE" a la hoja, en la celda "A1" digite la clave, por ejemplo "Micontraseña"
2- Vaya al editor de Vb en el modulo "Thisworkbook" pegue el siguiente código:
Private Sub Workbook_Open()
Sheets("CLAVE").Visible = xlVeryHidden
End Sub
De esta manera siempre estará oculta esta hoja. (Para mostrarla colóquele la propiedad xlSheetVisible)
3- En el editor de Vb, Inserte un formulario, el nombre es "UserForm1" con tres textbox como se muestra en la imagen: (este formulario le permitirá cambiar la clave de protección de las hojas cada vez que lo desee, sin abrir el Editor de Vb)
y asígneles nombre a los textbox y a los botones:
TXT_CLAVEANTIGUA 'contraseña anterior (la que está en "A1" en la hoja "CLAVE"
TXT_CLAVENUEVA1 'Nueva contraseña
TXT_CLAVENUEVA2 'Repita la contraseña
BTN_CAMBIAR 'Botón CAMBIAR
BTN_CANCELAR ' Botón CANCELAR
4- Inserte un botón ActiveX en la hoja donde ejecuta sus códigos, en la pestaña programador, menú Insertar, controles ActiveX, elija botón de comando, clic derecho en el botón, propiedades y colóquele el nombre al botón: "BTN_CAMBIARCLAVE"
5-En el editor de Vb dele clic derecho encima del formulario seleccione "ver código" y pegue el siguiente código:
Dim ANTIGUA As String
Dim NUEVA1 As String
Dim NUEVA2 As String
Private Sub BTN_CAMBIAR_Click()
ANTIGUA = TXT_CLAVEANTIGUA.Value
NUEVA1 = TXT_CLAVENUEVA1
NUEVA2 = TXT_CLAVENUEVA2
If ANTIGUA = Sheets("CLAVE").Range("A1").Value And (NUEVA1 = NUEVA2) Then
Sheets("CLAVE").Range("A1").Value = NUEVA2
Else
MsgBox ("Los datos no coinciden, por favor revise y vuelva a intentarlo"), vbCritical
End If
UserForm1.Hide
Unload UserForm1
End Sub
Private Sub BTN_CANCELAR_Click()
UserForm1.Hide
End Sub
6- En el editor de Vb en el modulo donde tiene su código pegue el siguiente código:
Public CLAVE As String
Private Sub PROTEGER()
CLAVE = Sheets("CLAVE").Range("A1").Value
Sheets("hoja1").Protect CLAVE
End Sub
Private Sub DESPROTEGER()
CLAVE = Sheets("CLAVE").Range("A1").Value
Sheets("hoja1").Unprotect CLAVE
End Sub
Private Sub BTN_CAMBIARCLAVE_Click()
UserForm1.Show
End Sub
Sub MOSTRAR()
ThisWorkbook.Sheets("CLAVE").Visible = xlSheetVisible
End Sub
De esta manera cada vez que necesite desproteger la hoja solo debe llamar el procedimiento; es decir en vez de colocar:
Sheets("Hoja1").Select
ActiveSheet. Unprotect "Micontraseña"
cambie esas líneas por:
Call DESPROTEGER
Y cuando nesecite proteger la hoja:
Call PROTEGER