Problema al proteger hoja excel

Tengo una aplicación donde he puesto bloqueo solo a las celdas con fórmulas para no meter la pata y borrarlas por error, el problema es que tengo puesta una macro que resalta las celdas en las que estas entre la columna A y E que no están bloqueadas por que no tienen fórmula, en el momento en que pongo la contraseña en protección de Hoja salta el error 1004

Private Sub Resalta()
Dim R As Long
Dim C As Long
Dim X As String
R = ActiveCell.Row
C = ActiveCell.Column

If R < 2 Or R > 500 Or C > 5 Then
Range("a2:E500").Interior.ColorIndex = 0  
Exit Sub

Else

Range("a2:E500").Interior.ColorIndex = 0   aquí es donde da el error

Range("a" & R & ":E" & R).Interior.ColorIndex = 27

End If
End Sub

No puedo adjuntar el excel que seria lo mejor manera que vieras el error

2 Respuestas

Respuesta
3

Puedes desproteger la hoja y proteger la hoja en la misma macro.

Cambia "abc" por tu password.

Private Sub Resalta()
  Dim R As Long
  Dim C As Long
  Dim X As String
  R = ActiveCell.Row
  C = ActiveCell.Column
  ActiveSheet.Unprotect "abc"
  If R < 2 Or R > 500 Or C > 5 Then
    Range("a2:E500").Interior.ColorIndex = 0
  Else
    Range("a2:E500").Interior.ColorIndex = 0   'aquí es donde da el error
    Range("a" & R & ":E" & R).Interior.ColorIndex = 27
  End If
  ActiveSheet.Protect "abc"
End Sub

Hola, gracias por tu respuesta pero solo funciona mientras estoy en las celdas de las columnas de la A a la E cuando salto de esas se desprotege y no se vuelve a proteger hasta que no vuelves a esas columnas con lo cual las celdas con fórmulas de fuera de esas columnas pueden ser "maltratadas", (je je)

Debes utilizar mi código.

Revisa bien el código.  En mi código eliminé la instrucción: Exit sub

¡Gracias!  pues es como tu dices sin el exit sub funciona bien

mil gracias

Cada solución en excel puede tener ventajas así como también puede desventajas.

----

Lo que podemos asegurar es simplificar y hacer más eficientes las soluciones.

---

Por ejemplo, en tu código tienes una condición, si se cumple, entonces ejecutas esto:

  Range("a2:E500").Interior.ColorIndex = 0

Si no se cumple, también ejecutas esto:

  Range("a2:E500").Interior.ColorIndex = 0

Entonces, en cualquier situación la instrucción se ejecuta. Lo mejor es ponerla afuera de la condición:

Private Sub Resalta_1()
  Dim R As Long
  Dim C As Long
  R = ActiveCell.Row
  C = ActiveCell.Column
  ActiveSheet.Unprotect "abc"
  Range("A2:E500").Interior.ColorIndex = 0
  If R >= 2 And R <= 500 And C <= 5 Then
    Range("A" & R & ":E" & R).Interior.ColorIndex = 27
  End If
  ActiveSheet.Protect "abc"
End Sub

---

Ahora si analizas el código un poco más, podrás identificar que esto:

If R >= 2 And R <= 500 And C <= 5 Then

Es igual a esto:

A2:E500

---

Entonces podemos escribirlo de la siguiente manera:

Private Sub Resalta_2()
  ActiveSheet.Unprotect "abc"
  Range("A2:E500").Interior.ColorIndex = 0
  If Not Intersect(ActiveCell, Range("A2:E500")) Is Nothing Then
    Range("A" & ActiveCell.Row & ":E" & ActiveCell.Row).Interior.ColorIndex = 27
  End If
  ActiveSheet.Protect "abc"
End Sub

---

Si revisas nuevamente, podemos identificar que tu rango de trabajo es: "A2:E500", y en el código aparece 2 veces.

Podemos escribirlo así, para escribir solamente una vez el rango:

Private Sub Resalta_3()
  Dim rng As Range
  Set rng = Range("A2:E500")
  ActiveSheet.Unprotect "abc"
  rng.Interior.ColorIndex = 0
  If Not Intersect(ActiveCell, rng) Is Nothing Then
    Range("A" & ActiveCell.Row & ":E" & ActiveCell.Row).Interior.ColorIndex = 27
  End If
  ActiveSheet.Protect "abc"
End Sub

---

Respuesta
2

Al momento de proteger la hoja debes permitir las opciones de Formato como se observa en la imagen siguiente:

Comenta si esto resolvió tu consulta.

Gracias por tu respuesta, funciona bien y sin problema en la hoja, el único inconveniente es que las tendré que proteger de una en una puesto que esta macro que uso no te pide que permites al usuario

Sub protect_all_sheets()
top:
pass = InputBox("password?")
repass = InputBox("Verify Password")
If Not (pass = repass) Then
MsgBox "Password no coincide"
GoTo top
End If
For i = 1 To Worksheets.Count
If Worksheets(i).ProtectContents = True Then GoTo oops
Next
For Each s In ActiveWorkbook.Worksheets
s.Protect Password:=pass
Next
Exit Sub
oops: MsgBox "Creo que tienes algunas hojas que ya están protegidas. Desproteja todas las hojas y luego ejecute esta Macro."
End Sub

Solo son 15 hojas en un ratito lo termino

Gracias

Con nuestras diferencias horarias ya lo tendrás terminado ;)

Para salir del paso siempre está la opción provisoria de agregar las instrucciones para desproteger y volver a proteger la hoja antes de las instrucciones que dan error en la macro.
Digo provisoria, porque si tuvieses 15 macros tendrías que colocar las mismas instrucciones en todas ellas. Y ni hablar si un día el usuario final decide cambiar las claves de hojas... hay que cambiarlas también en todas las macros.

Por eso es importante protegerlas bien, con todos los permisos. Y eso incluye también los autofiltros si fuese necesario. Las instrucciones de macro se pueden obtener realizando esta primera protección manual, con la grabadora de macros encendida.

La línea de protección en tu última macro quedaría así entonces. Puedes quitar las que no vayas a utilizar como orden y/o autofiltro:

s.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True

También te dejo otra macro que realiza los 2 pasos: desprotege todas las hojas con clave anterior y las vuelve a proteger con la nueva clave:

Sub nuevaProteccion()
'x Elsamatilde
top:
clave_ant = InputBox("Clave anterior")
pass = InputBox("password?")
repass = InputBox("Verify Password")
If Not (pass = repass) Then
    MsgBox "Password no coincide"
    GoTo top
End If
'desprotege y vuelve a proteger con nueva clave
For Each s In ActiveWorkbook.Worksheets
    If s.Protect = True Then s.Unprotect clave_ant
    s.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
Next s
End Sub

 Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas