Macro para desproteger una celda según texto en otra c

Estimad@
He tratado de llevar a cabo una macro principalmente extrayendo información de este portal pero no he podido aplicarla a mi problemática, ojala me pudieras ayudar, te lo agradecería infinitamente.
Resulta que tengo ciertas celdas de mi hoja protegidas, pero quiero poder crear un formato condicional en el cual, si el texto de la celda C8 es "no", que la celda D8 se pueda desproteger y modificar. Si el valor de C8 es "si", que la D8 se mantenga protegida. Todo esto para 8 filas, y el detalle más importante, es que tengo filas agrupadas, las cuales quiero poder abrir y manejar los datos, ya que normalmente cuando la hoja esta protegida no te permite abrir las celdas agrupadas.
Estuve intentando con este código que mezcle de dos foros anteriores que visite, pero no me permite realizarlo. Seguro que tiene muchos errores porque la verdad que no me manejo casi nada en los fundamentos de visual basic:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("c8").String = no Then
Range("d8").Select
'primero se debe desproteger la hoja , agrega el pass
ActiveSheet.Unprotect "extend"
Selection.Locked = True
'vuelve a proteger la hoja
ActiveSheet.Protect "extend"
.EnableOutlining = True
End If
End Sub

2 Respuestas

Respuesta
1
Pies que te diré. La verdad, si no tienes casi nada de noción para VBA, pues, estas queriendo correr antes de caminar.
1- En las hojas protegidas no existe la opción de agrupar/desagrupar datos, ni "jugar" con ellos. Para poder hacerlo, de forma obligada hay que darles dicha propiedad a través de macros, y ademas, ya que dicha propiedad se pierde siempre al cerrar el archivo, pues, cada vez que abra hay que hacerlo. ¿Cómo? Con una macro auto_open en un modulo "normal":
Sub auto_open()
With Worksheets("Hoja1")
.EnableOutlining = True
.Protect Password:="1234", UserInterfaceOnly:=True
End With
End Sub
- OJO que aquí esto suponiendo que la hoja de los elementos agrupados se llama "Hoja1" y la clave de protección de la hoja es 1234.
2- Para lo de la celdas, pues, un ejemplo seria el siguiente:
- Supondré que la celda del Si/No sera la A1, y la celda de la proteccion/Desproteccion sera la B1. Entonces, obviamente, previo a proteger la hoja, vamos a la celda A1 y en su formato le quitamos el check a "Bloqueada", y en el modulo de la hoja, colocamos esto:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
If Target = "Si" Then
ActiveSheet.Unprotect "1234"
Range("B1").Locked = True
ActiveSheet.Protect "1234"
Exit Sub
ElseIf Target = "No" Then
ActiveSheet.Unprotect "1234"
Range("B1").Locked = False
ActiveSheet.Protect "1234"
End If
End If
End Sub
Abraham
Estimado,
en primer lugar muchísimas gracias por darte el tiempo de ayudarme con mi problema, en verdad lo valoro mucho. Con respecto a la solución, la primera parte, del modulo auto_open funcionó, ya que me permite agrupar y desagrupar aun cuando la hoja tiene una parte que esta protegida. Con respecto a la segunda parte, sencillamente no me funcionó. La copie tal cual, obvio que cambiando ciertos datos por los propios de mi hoja, como las celdas y claves. No se cual será la razón del porque no me funciona, el hecho puntual es que la celda que pretendo se desbloquee con la condición "no", simplemente se mantiene siempre bloqueada.
Espero me puedas dar una ultima ayudita, gracias
¿Qué bueno que te sirvió lo primero
sobre lo segundo, pues, es casi imposible saber que pasa ya que el único que tiene el dilema en su pantalla eres tu, cierto? Solo una cosa importante... la macro del evento Change, ¿dónde la colocaste? Debe ser en el modulo de la hoja (como puse), por si acaso
Sino, mira, yo te sugiero que hagas la prueba en un nuevo archivo con lo que yo te mande y siguiendo dichas instrucciones, como para que entienda como funciona
Abraham
Estimado,
le hice un pequeño cambio al código y por fin pude resolverlo :)
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("c8").Value = "si" Then
ActiveSheet.Unprotect "extend"
Range("d8").Locked = True
ActiveSheet.Protect "extend"
Exit Sub
ElseIf Range("c8").Value = "no" Then
ActiveSheet.Unprotect "extend"
Range("d8").Locked = False
ActiveSheet.Protect "extend"
End If
End Sub
El único cambio fue cambiar la sentencia target por otra range.value, con lo cual me funcionó (la verdad, no se muy bien el porque), pero tu código fue la base para solucionar mi problema, por lo cual te agradezco muchísimo!
Respuesta
1
Disculpa mi demora pero por motivos de salud no pude responder antes :
Tu código esta bien encaminado :
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("c8").String = no Then
if range("C8").value="no"then
Range("d8").Select
ActiveSheet.Unprotect "extend"
Selection.Locked = True
'vuelve a proteger la hoja
ActiveSheet.Protect "extend"
.EnableOutlining = True
End If
End Sub
Lo otro sería modificarla para los demas rangos:
Sub ver()
Dim resp As Long, z As Long
resp = InputBox("Ingrese cantidad de repeticiones")
z = 8
For x = 1 To resp
If Cells(z, 3).Value = "no" Then
Cells(z, 3).Select
ActiveSheet.Unprotect "extend"
Selection.Locked = True
'vuelve a proteger la hoja
ActiveSheet.Protect "extend"
.EnableOutlining = True
End If
z = z + 1
Next x
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas