Ocultar filas con celdas vacías

Buenos días gfellay, por problemas con el servidor no puedo abrir la pregunta ya iniciada, así que te cuento: Quería ocultar las filas de un rango (desde la 46 hasta la 71) que tuvieran celdas vacías en la 2ª columna, cuando la celda "k35" diera "X" como resultado. Me diste un código para el módulo y me dijiste que utilizase en la hoja el objeto calculate. Yo tengo en el módulo:
Sub ocultaFilas2(queHoja As String)
Dim it As Long
Sheets(queHoja).Select
For it = 46 To 71
If Cells(it, 2) = "" And Cells(36, 11) = "x" Then Cells(it, 1).EntireRow.Hidden = True
Next it
End Sub
Y en la hoja:
Private Sub Worksheet_Calculate()
ocultaFilas2 "Cta.Justificativa"
End Sub
Pero no me funciona, no hace nada. Como ya te dije no tengo ni idea de macros, así que si pudieras darme el código exacto. Gracias por tu paciencia y un saludo.

1 Respuesta

Respuesta
1
Hace una cosa, en la hoja "Cta.Justificativa", deberías tener el código que pusiste; parate con el mouse en la instrucción Private Sub Worksheet_Calculate() y presioná F9, de esta forma te tiene que quedar la fila en Negrita y marcada con otro color (probablemente marrón), esto indicará que allí se detenga la macro; luego vas a la hoja y haces algo para que se recalcule el archivo y te debería parar en esta instrucción luego vas presionando la techa F8 y se debería ir ejecutando el código "paso a paso", de esta forma servirá para ver donde está el problema y el por qué no hace nada
Hola gfellay, lo primero: las celdas vacías del rango en el que hay que ocultar filas son el resultado de una fórmula (= celda de otra hoja). Esto te lo había comentado el primer día y no sé si puede influir.
Hice lo que me dijiste y cuando empiezo a darle a F8 se va desde el código de la hoja "Cta Justificativa" hasta el código del Módulo y ahí va avanzando de línea hasta que llega a la instrucción: if Cells((it, 2)="" And Cells(35,11)="X" then cells(it, 1).EntireRow...
Aquí marca en amarillo sólo hasta Then y salta a la instrucción siguiente: Next it y después vuelve a la instrucción anterior y otra vez a la siguiente, así hasta que completa, supongo, todas las filas y luego vuelve de nuevo al código de la Cta. Justificativa hasta terminar en la última instrucción End sub sin ningún tipo de mensaje de error.
Saludos cordiales.
Por lo que comentás está ejecutando bien solo que NO encuentra ninguna celda vacía Cells(it, 2)=""
Esta pregunta "mira" la columna B, ¿está bien que así sea? Otra opción es que el resultado de traer la info de otra hoja en lugar de dar vacío de un espacio " ", cero 0 o cualquier otra cosa.
Volvé a repetir el proceso, y en alguna fila que vos sepas que deba ocultarse (ejemplo la fila 48, cuando está ejecutando el IF presioná CTRL+G, de esta forma te va a mostrar una ventana de "Inmediato", ¿allí escribí? Cells(it, 2) y verás el resultado que tiene la celda (que nosotros creemos que está vacía)
Hola gfellay, he hecho lo que comentabas y te confieso que no he visto ningún valor. Como no estaba seguro de haberlo hecho bien, he pensado cambiar la instrucción y le he dicho que busque celdas vacías en la columna A (if cells(it, 1)...), porque ahí sí que hay celdas completamente vacías y sigue sin funcionar, por lo que empiezo a pensar que quizá será problema de la otra condición: and cells(35,11)="X". En esa celda la "X" es el resultado de una condicional y por eso usamos el objeto calculate. No sé, estoy hecho un lío.
Saludos cordiales
Probá en la ventana Inmediato de poner
? Cells(35,11)="X"
A ver que te da (debería mostrarte Verdadero)
Haber gfellay, vamos avanzando. Como no me daba verdadero, miré con más atención y me di cuenta que en la instrucción había puesto por (minúscula) y la fórmula daba X(mayúscula). Quizá era eso, porque cuando lo cambie empezó a funcionar, ¡Y de que manera!
Ahora el problema es que el proceso no se detiene: oculta las filas con celdas vacías y sigue buscando sin parar. Parece que entra en un bucle interminable. Cuando conseguí con el administrador de tareas salir de la hoja, vi un mensaje de error en el VBA: Se ha producido el error '-2147417848 (80010108)' en tiempo de ejecución: Error en el método 'Hidden' de objeto 'Range'
Saludos cordiales.
Entiendo, el "problema" es que el recalculo "vuelve" a llamar al procedimiento y entra en un loop. Si podes, la forma "sencilla" es usar una variable auxiliar y luego como primer instrucción debería verificar esta variable, igual te pongo esta otra instrucción que deberías poner en el Evento Worksheet_Calculate como primer instrucción
Application.EnableEvents = False
y antes del End Sub coloca
Application.EnableEvents = True
La primera es para decirle al excel que no le preste atención a los eventos, (sino entra en este loop que te decía antes), la siguiente es para decirle que deje todo como estaba (es muy importante esta última instrucción)
Muy bien, muy bien gfellay, me quito el sombrero. Funciona perfectamente.
Me surge una NECESIDAD añadida, en relación a esta "ocultación de filas" que has preparado con éxito y que no tengo más remedio que plantearte. ¿Se podría hacer que cuando la "k35" quedase vacía de nuevo (por la rectificación de los datos introducidos) se volviesen a mostrar las filas que se habían ocultado previamente? Sería deshacer lo realizado para conseguir visualizar el resultado de los nuevos datos introducidos.
Perdona si soy tan pesado pero la hoja esta pensada para que la gente introduzca una serie de datos y si hay rectificaciones el resultado de los nuevos datos quedaría oculto.
Gracias por todo y un saludo.
Ok, para depurar un poco todos los códigos, pásame como quedó al final los dos procedimientos y te los modifico
El código en el Módulo es:
Sub ocultaFilas2(queHoja As String)
Dim it As Long
Sheets(queHoja).Select
For it = 46 To 71
If Cells(it, 2) = "" And Cells(35, 11) = "X" Then Cells(it, 1).EntireRow.Hidden = True
Next it
End Sub
Y el de la hoja 5 (Cta.Justificativa):
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
ocultaFilas2 "Cta.Justificativa"
Application.EnableEvents = True
End Sub
Me marcho dentro de unas horas a un pueblo de Salamanca en el que no tengo Internet, así que en cuanto regrese el lunes te estoy contestando.
Te reitero mi agradecimiento por la ayuda y por tu interés.
Ok, te hago los cambios a ver que te parecen; asumo que en la celda K35, los valores posibles son "X" o vacío
Sub ocultaFilas2(queHoja As String)
Dim it As Long
Sheets(queHoja).Select
For it = 46 To 71
If Cells(it, 2) = "" Then Cells(it, 1).EntireRow.Hidden = True
Next it
End Sub
Y el de la hoja 5 (Cta.Justificativa):
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
if Cells(35,11) = "X" Then
  ocultaFilas2 "Cta.Justificativa"
else
  Rows("46:71").EntireRow.Hidden = False
end if
Application.EnableEvents = True
End Sub
Pues ya no puedo darte más faena gfellay. Regreso de mi viaje y me encuentro con tu macro que funciona de maravilla. Excelente solución, así que muchas gracias amigo y un abrazo desde Madrid.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas