Ocultar filas que no cumplan una condición

06/02/2009 - 19:54 por Manuel Montes | Informe spam
Buenos días a todos/as:

Tengo una hoja con unas 100 filas en las que la columna B tiene un NO
o un SI. Lo único que quiero es que me oculte (no filtre, sino oculte)
todo aquello que tiene NO.

La estructura es tal que

REFERENCIA | IMPRIMIR | DESCRIPCION | IMPORTE

TJS | SI | Tarjetas plásticas
| 500
COM | NO | Comisión intermediario | 100
AUX | SI | Material
Auxiliar | 150

Yo me he planteado un bucle tal que:


Do While ActiveCell.Value <> Empty
If ActiveCell.Value = "NO" Then
Selection.EntireRow.Hidden = True
End If
ActiveCell.Offset(1, 0).Select
Loop

El problema es que para 50 líneas, no se por qué razón, me tarda más
de un minuto, y necesito que sea un proceso más rápido.

Alguien me podría ayudar como hacer la selección múltiple de filas de
forma múltiple.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/02/2009 - 04:52 | Informe spam
hola, Manuel !

- la tabla que expones se habria "visto" mejor si en su lugar comentas los rangos donde esta ubicada ;)

- los bucles que realizan "acciones" FILA-x-FILA causan lentitud y son (generalmente) innecesarios -?-

- si suponemos que los SI/NO estan en la columna B (fila 1 como titulos) y los datos inician en la fila 2...
prueba con algo +/- como lo siguiente:

Sub Oculta_SI()
Dim Fila As Integer, Rango As String
For Fila = 2 To Range("b65536").End(xlUp).Row
If Range("b" & Fila) = "SI" Then Rango = Rango & ",a" & Fila
Next
If Rango <> "" Then Range(Mid(Rango, 2)).EntireRow.Hidden = True
End Sub

es probable que debieras primer mostrar cualquier fila que se hubiera ocultado con anterioridad -???-

saludos,
hector.

__ OP __
Tengo una hoja con unas 100 filas en las que la columna B tiene un NO o un SI.
Lo unico que quiero es que me oculte (no filtre, sino oculte) todo aquello que tiene NO.
La estructura es tal que
REFERENCIA | IMPRIMIR | DESCRIPCION | IMPORTE
TJS | SI | Tarjetas plasticas | 500
COM | NO | Comision intermediario | 100
AUX | SI | Material Auxiliar | 150

Yo me he planteado un bucle tal que:
Do While ActiveCell.Value <> Empty
If ActiveCell.Value = "NO" Then
Selection.EntireRow.Hidden = True
End If
ActiveCell.Offset(1, 0).Select
Loop

El problema es que para 50 lineas, no se por que razon, me tarda mas de un minuto
y necesito que sea un proceso mas rapido.
Alguien me podria ayudar como hacer la seleccion multiple de filas de forma multiple.
Respuesta Responder a este mensaje
#2 Anonimo
07/02/2009 - 12:10 | Informe spam
Un saludo Hector, y compañía.

Efectivamente, y tal como esperaba, funciona a la perfección, pero ahora
viene mi pregunta. La cadena que formas con rango, hasta cuantos caracteres
puede tener, porque para diez o 20 filas es suficiente sin duda, pero si el
rango a ocultar fuese de 1500 filas, a mi por lo menos me da error de
ejecución.

Hay algún tipo de limitación en el resultado de rango, para poder operar con
el posteriormente?


"Héctor Miguel" escribió en el mensaje de
noticias news:
hola, Manuel !

- la tabla que expones se habria "visto" mejor si en su lugar comentas los
rangos donde esta ubicada ;)

- los bucles que realizan "acciones" FILA-x-FILA causan lentitud y son
(generalmente) innecesarios -?-

- si suponemos que los SI/NO estan en la columna B (fila 1 como titulos) y
los datos inician en la fila 2...
prueba con algo +/- como lo siguiente:

Sub Oculta_SI()
Dim Fila As Integer, Rango As String
For Fila = 2 To Range("b65536").End(xlUp).Row
If Range("b" & Fila) = "SI" Then Rango = Rango & ",a" & Fila
Next
If Rango <> "" Then Range(Mid(Rango, 2)).EntireRow.Hidden = True
End Sub

es probable que debieras primer mostrar cualquier fila que se hubiera
ocultado con anterioridad -???-

saludos,
hector.

__ OP __
Tengo una hoja con unas 100 filas en las que la columna B tiene un NO o
un SI.
Lo unico que quiero es que me oculte (no filtre, sino oculte) todo
aquello que tiene NO.
La estructura es tal que
REFERENCIA | IMPRIMIR | DESCRIPCION | IMPORTE
TJS | SI | Tarjetas plasticas | 500
COM | NO | Comision intermediario | 100
AUX | SI | Material Auxiliar | 150

Yo me he planteado un bucle tal que:
Do While ActiveCell.Value <> Empty
If ActiveCell.Value = "NO" Then
Selection.EntireRow.Hidden = True
End If
ActiveCell.Offset(1, 0).Select
Loop

El problema es que para 50 lineas, no se por que razon, me tarda mas de
un minuto
y necesito que sea un proceso mas rapido.
Alguien me podria ayudar como hacer la seleccion multiple de filas de
forma multiple.




Respuesta Responder a este mensaje
#3 Anonimo
07/02/2009 - 12:19 | Informe spam
Podría valer asi? O habría algún método más rápido para hacerlo?


Sub Oculta_SI2()

Application.ScreenUpdating = False

Dim Fila As Integer, Rango As String
For Fila = 2 To Range("b65536").End(xlUp).Row
If Range("b" & Fila) = "SI" Then Rango = Rango & ",a" & Fila
Next

ranguito = Split(Rango, ",")

For i = UBound(ranguito) To 1 Step -1

Range(ranguito(i)).EntireRow.Hidden = True

Next

Application.ScreenUpdating = True

End Sub
Respuesta Responder a este mensaje
#4 Héctor Miguel
08/02/2009 - 01:08 | Informe spam
hola, (...) ?????

La cadena que formas con rango, hasta cuantos caracteres puede tener
porque para diez o 20 filas es suficiente sin duda
pero si el rango a ocultar fuese de 1500 filas, a mi por lo menos me da error de ejecucion.

Hay algun tipo de limitacion en el resultado de rango, para poder operar con el posteriormente?



la restriccion es hasta un maximo de 2048 rangos no-contiguos para operar con ellos
(para 1500 filas, no creo que "pudiera" sobrepasarse este imite de rangos no-contiguos)
pero... como la consulta original indica 100 filas... -???-

si las condiciones cambian (seguramente) las propuestas tambien debieran cambiar -?-

saludos,
hector.
Respuesta Responder a este mensaje
#5 Héctor Miguel
08/02/2009 - 01:18 | Informe spam
hola, (...) ?????

Podria valer asi? O habría algun metodo mas rapido para hacerlo?



si nunca vas a "rebasar" el limite para no mas de 2'048 rangos "no-contiguos"...
prueba con algo +/- como lo siguiente:

Sub Oculta_SI()
Dim Fila As Integer, Ocultar As Range
For Fila = 2 To Range("b65536").End(xlUp).Row
If Range("b" & Fila) = "SI" Then Set Ocultar = _
Union(IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar), Range("a" & Fila))
Next
If Not Ocultar Is Nothing Then Ocultar.EntireRow.Hidden = True: Set Ocultar = Nothing
End Sub

saludos,
hector.

__ el codigo expuesto __
Sub Oculta_SI2()
Application.ScreenUpdating = False
Dim Fila As Integer, Rango As String
For Fila = 2 To Range("b65536").End(xlUp).Row
If Range("b" & Fila) = "SI" Then Rango = Rango & ",a" & Fila
Next
ranguito = Split(Rango, ",")
For i = UBound(ranguito) To 1 Step -1
Range(ranguito(i)).EntireRow.Hidden = True
Next
Application.ScreenUpdating = True
End Sub
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida