Desbloquear las hojas de un libro Excel con macros

Tengo un libro excel con varias hojas y cada hoja algunas hojas están protegidas y algunas no, las hojas que están protegidas tienen contraseñas distintas "Lunes", "Martes", "Miercoles", "Jueves" solo estas y es un poco tedioso abrir cada uno y probar cada contraseña aver cual es la correcta.

No se si me podrían ayudar a desbloquear cada hoja obvio sino esta bloquea que siga a la siguiente hoja pero si esta bloqueada que pruebe esas 4 opciones de contraseñas y si en caso no agarra una de ella que me diga un mensaje con que hojas requieren una contraseña distinta. Alguna ayuda Expertos.

Respuesta
1

[Hola

Una forma es la siguiente:

Sub LaClave()
Dim clave(1 To 4) As String
Dim x As Integer
On Error Resume Next
clave(1) = "Lunes"
clave(2) = "Martes"
clave(3) = "Miercoles"
clave(4) = "Jueves"
For x = LBound(clave) To UBound(clave)
    Sheets("Hoja1").Unprotect clave(x)
    If Sheets("Hoja1").ProtectContents = False Then
        MsgBox "La clave es " & clave(x)
        Exit Sub
    End If
Next x
MsgBox "Ninguna clave es válida"
End Sub

Obviamente debes cambiar el nombre de la hoja. OJO, si quieres pasar la clave a todas las hojas a la vez, debes usar un más, pero del tipo For Each que recorra hoja a hoja y que lugar de Exit Sub, user Exit For y en lugar el Msgbox que te da la clvae, quizás Debug.Print que te envíe el nombre de la hoja y su clave.

Abraham Valencia

PD: El uso de On Error Resume Next no es recomendado, pero en este caso se ameriza su uso

¡Gracias! 
¡Gracias! Lo Adapte a mi uso pero tarda un poco en terminar el proceso, algún consejo para hacerlo mas rápido o es lo mínimo. 

[Hola

Si bien la velocidad de una macro varia en base a varios factores, en lo que se refiere al propio código, haz dos modificaciones que quizás ayuden en algo a la velocidad:

1- Dale valor a las variables antes del "On Error ...", tal cual las tienes ahora, les das valor en cada bucle, algo innecesario

2- En VBA el tipo de variable se asigna a cada una, no por línea. Tal cual tienes esto:

Dim Clave (1 to 4), Msg as String

Es lo mismo que tener:

Dim Clave (1 to 4) as Variant, Msg as String

Debes colocarlo así:

Dim Clave (1 to 4) as String, Msg as String

Saludos]

Abraham Valencia

¡Gracias! Por esos datos ... Usted cree que me podría decir en que consiste el uso de UBond y LBond no pensé que podría usarse de esa manera y leer los consejos de alguirn que lo usa y lo entiende bien me sería de ayuda para casos similares. Espero me guie por el buen camino del programador.

Primero, de nada; segundo, LBound contiene el subíndice más pequeño disponible para la dimensión indicada de una matriz y UBound devuelve el subíndice más alto. Entonces, al ser "clave" una matriz (una variable en matriz) y darle cuatro valores (con índices del 1 al 4), LBound devuelve 1 y UBound devuelve 4, yendo el For correspondiente del 1 al 4. Eso.

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas