Código de Exel que deja de funcionar cuando se protege la hoja que lo lleva

Estoy utilizando el siguiente código, cuyo autor es Gustavo Omar Fellay, en año 08, que funciona muy bien en una hoja cuyas celdas contienen formulas en su totalidad. Muchas de dichas formulas contienen referencias a otra hoja del mismo libro. Para que funcione he tenido que incluir en los rangos una celda que tiene un valor =0 introducido a mano. El problema surge cuando protejo la hoja. Entonces deja de funcionar. ¿Podríais modificarlo para que sea efectivo después de efectuar la mencionada protección? Muchísimas gracias

El código es el siguiente:

Private Sub WorkSheet_Calculate()
Dim r As Range
Application.EnableEvents = False
For Each r In Union(Range("C3:C22"), Range("D3:D22"))
 If r.Value = 0 Then
  r.EntireRow.Hidden = True
 Else
  r.EntireRow.Hidden = False
 End If
Next r
Application.EnableEvents = True
End Sub

2

2 Respuestas

82.375 pts. Ingeniero Industrial, docente universitario de...

Algunas observaciones...

1) No se si modificaste el código, pero por lo que veo actualmente

Union(Range("C3:C22"), Range("D3:D22")

Podrias reemplazarlo simplemente por

Range("C3:D22")

2) El hecho que tengas que escribir =0 para que funcione es porque en el código dice

 If r.Value = 0

si quieres que funcione con la celda en blanco puedes reemplazarlo por

 If r.Value = ""

Si quieres que funcion con la celda tanto en blanco como en 0 puedes reemplazarlo por

 If r.Value = "" or r.Value=""

3) El hecho que no funcione al estar protegida la hoja es porque justamente cuando esta protegida no puedes ocultar filas. Para solucionarlo, quita la protecciíon de la hoja

Una linea antes des For Each....  escribe

ActiveSheet.Unprotect

y si tiene contaseña (por ejemplo Abcd1234):

ActiveSheet.Unprotect password:="Abcd1234"

y luego, despues del         Next r...    escribe

ActiveSheet.Protect

y si quieres ponerle contaseña (por ejemplo Abcd1234):

ActiveSheet.Protect Password:="Abcd1234"

Aunque como no sé exactamente que es lo que quieres proteger en la hoja (hay muchas opciones) te sugiero:

desproteger la hoja, prender la grabadora de macros, proteger la hoja, apagar la grabadora, verificar el código generado en los módulos y copiar esa línea generada que será similar al ActiveSheet.Protect....   con todos los argumentos que haya generado... pero al final de la linea si es que fuera necesario agregar una contraseña (la grabadora no registra ese parámetro) le agregas           ,Password:="Abcd1234"             

Muchas gracias, Jaime. En cuanto tenga un poco de tiempo me pongo con la labor y te contaré. Saludos

Buenos días, Jaime. ! No se lo que he hecho mal! Hice tus modificaciones y partir de ese momento el código que oculta las filas ha dejado de funcionar. Lo he eliminado y vuelto a copiar del código original, que funcionaba perfectamente, y nada, tampoco funciona. Pero es que he hecho un libro nuevo, copiando las fórmulas del otro, sin copiar el dichoso código y copiándolo después y tampoco. Estoy desesperado te ruego me eches una mano. Gracias y saludos

Mándame el archivo... si puedes también uno modificado, para ver si interpretaste algo mal

Si la prot ecciontu hoja tiene contraseña, me la escribes en el mail.

[email protected]

5.330 pts. Me gusta la mecánica Pesada CAT/JD

Añade al inicio del código (evento) en ejecución esta línea

ActiveSheet.Unprotect password:="852" 'desproteje hoja para su uso

''' Tu código

'Al final del código esta

ActiveSheet.Protect password:="852" 'Vuelve a protejer la hoja para bloquear su uso

Gracias por tu respuesta, he seguido tus instrucciones, seguramente mal, y el código ha dejado de funcionar totalmente y no se porqué. Lo he eliminado de hoja y e coiado el original y tampoco funciona. Me parce que en cuanto se proteje la hoja una sola vez y aunque se desproteja se invalida el código. Gracias y espero tu ayuda.

Las líneas que te deje, nada tienen que provoque eso, solo desprotege la hoja y vuelve a protegerla

Tienes que CAMBIAR  ahí el 852, por tu clave ActiveSheet.Unprotect password:="852"

Estimado Joaom Manuel, apliqué las modificaciones que me indicaste y lo que ocurre es que cada vez que introduzco un dato en página. Relacionada se protege toda lo hoja y tengo que estar desprotegiendo constantemente. Gracias

¿Introduces datos manualmente o desde formulario?

ActiveSheet. Es para cuando se ejecuta la macro dentro de la hoja, es decir, estas con el formulario abiertop en la hoja donde quieres y vas a introducir datos

Si la macro (Formulario) NO se ejecuta ESTANDO en la hoja Activa (. Select) y si en otra ("Hoja7"), FUERA de la hoja en que la macro va a introducir datos, tienes que cambiar ActiveSheet por

Sheets("Hoja7").Protect Password:="852" 'DESPROTEGE LA HOJA7

Sopone que abres el formulario en la hoja1("portada") y la macro produce incidencia en la hoja7("Tu Hoja"), recuerda que tienes el formulario abierto en la hoja1("Portada"), y vas a introducir en la hoja7, la línea tiene que ser Sheets("Hoja7"). Unprotect Password:="TU CLAVE" al inicio del código de la macro

Al final de toda la macro (código)

Sheets("Hoja7").Protect Password:="TU CLAVE" VUELVE A PROTEGER LA HOJA7

Cuidado si tienes alguna llamada de otra maco dentro de la macro del botón que sea parte del evento para ingresr datos con ese botón. Te dejo un ejemplo

Private Sub cbtNueClien_Click()
    On Error Resume Next
    Dim fila As Integer
    Set ws = ActiveSheet '(o Set ws = Sheets("Clientes")
   Sheets("Clientes").Protect Password:="TU CLAVE" 'si estas fuera de hoja que recibe los datos
''''0 ActiveSheet.Unprotect Password:="TU CLAVE" 'si estas en hoja que recibe los datos
'codigo
' Codigo
'codigo
       Call ingresar_datos(fila) 'EL CALL QUE TE MENCIONÉ
'codigo
'codigo
'Aqui ves que no hay para VOLVER a proteger, no necesita
End Sub
----------------------------------------------------------------
Sub ingresar_datos(fila As Integer, Optional OrdenarPor As String = "B") 'Ordena por la columna B
''Aqui ves que no hay para VOLVER a DESproteger, no necesita
'''codigo
'''codigo
'''codigo
'''codigo
'''codigo
   Sheets("Clientes").Protect Password:="TU CLAVE" 'si estas fuera de hoja que recibe los datos
''''0 ActiveSheet.Unprotect Password:="TU CLAVE" 'si estas en hoja que recibe los datos
    txtCod.SetFocus
End Sub

No se si mi respuesta llegó a entrar, no la veo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas