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

#6 Anonimo
08/02/2009 - 15:39 | Informe spam
Hola, Hector, Estoy intentando comprender la funcion de union, pero no la
veo clara, me la podrias explicar un poco'

Sub Oculta_SI()
Dim Fila As Integer, Ocultar As Range
For Fila = 2 To Range("b65536").End(xlUp).Row (esto lo entiendo bien)
If Range("b" & Fila) = "SI" Then Set Ocultar = _
Union(IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar), Range("a" &
Fila)) ? ' aqui es donde no lo pillo del todo bien, porque si le doy
para comprobar que valor tiene ocultar, me pone que es "SI", y no veo que se
haga referencia en ningun momento al numero de fila que tiene cada uno de
los rangos, por otro lado, la funcion union no tiene un limite de 30 rangos?

Next
If Not Ocultar Is Nothing Then Ocultar.EntireRow.Hidden = True: Set
Ocultar = Nothing
End Sub





"Héctor Miguel" escribió en el mensaje de
noticias news:
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
#7 Héctor Miguel
08/02/2009 - 22:19 | Informe spam
hola, !

- la variable (Fila) avanza buscando si el contenido de cada celda [B<Fila>] contiene "SI"

- si el contenido es el que se busca (SI) la "agrega" a la variable de tipo rango (Ocultar) con la instruccion Set ...

- el "agregado" se hace usando el metodo Union(Arg1, Arg2, Arg3, ...) con solo 2 argumentos

- primero comprueba si ya habia algo asignado anteriormente a la variable para continuarla o inicializarla
-> IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar) <= esta parte es el primer argumento del metodo Union(...

- luego continua agregando cada rango segun si ha cumplido la condicion cada celda [B<Fila>]
-> Set Ocultar = Union(<Arg1 linea anterior>, Range("b" & Fila))

saludos,
hector.

__ OP __
... Estoy intentando comprender la funcion de union, pero no la veo clara ...
Sub Oculta_SI()
Dim Fila As Integer, Ocultar As Range
For Fila = 2 To Range("b65536").End(xlUp).Row (esto lo entiendo bien)
If Range("b" & Fila) = "SI" Then Set Ocultar = _
Union(IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar), Range("a" & Fila))
' aqui es donde no lo pillo... porque si le doy para comprobar que valor tiene ocultar, me pone que es "SI"
y no veo que se haga referencia en ningun momento al numero de fila que tiene cada uno de los rangos
por otro lado, la funcion union no tiene un limite de 30 rangos?

Next
If Not Ocultar Is Nothing Then Ocultar.EntireRow.Hidden = True: Set Ocultar = Nothing
End Sub
Respuesta Responder a este mensaje
#8 Anonimo
08/02/2009 - 22:40 | Informe spam
Mas o menos lo entiendo, pero me gustaria saber porque si pongo debug.print
ocultar.address me sale solo el rango hasta la fila 85 de 200, por ejemplo,
digamos que en a1 y siguientes escribo si no si no si no, asi hasta la fila
200.

Para saber que es lo que me devuelve union despues de hacer el procedimiento
entero, he puesto debug.print ocultar.address y me devuelve esto:

$A$1,$A$3,$A$5,$A$7,$A$9,$A$11,$A$13,$A$15,$A$17,$A$19,$A$21,$A$23,$A$25,$A$27,$A$29,$A$31,$A$33,$A$35,$A$37,$A$39,$A$41,$A$43,$A$45,$A$47,$A$49,$A$51,$A$53,$A$55,$A$57,$A$59,$A$61,$A$63,$A$65,$A$67,$A$69,$A$71,$A$73,$A$75,$A$77,$A$79,$A$81,$A$83,$A$85
y no hasta la fila 200, sin embargo el procedimiento le hace hasta la fila
200.

Es lo que no entiendo.


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

- la variable (Fila) avanza buscando si el contenido de cada celda
[B<Fila>] contiene "SI"

- si el contenido es el que se busca (SI) la "agrega" a la variable de
tipo rango (Ocultar) con la instruccion Set ...

- el "agregado" se hace usando el metodo Union(Arg1, Arg2, Arg3, ...) con
solo 2 argumentos

- primero comprueba si ya habia algo asignado anteriormente a la variable
para continuarla o inicializarla
-> IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar) <= esta parte
es el primer argumento del metodo Union(...

- luego continua agregando cada rango segun si ha cumplido la condicion
cada celda [B<Fila>]
-> Set Ocultar = Union(<Arg1 linea anterior>, Range("b" & Fila))

saludos,
hector.

__ OP __
... Estoy intentando comprender la funcion de union, pero no la veo clara
...
Sub Oculta_SI()
Dim Fila As Integer, Ocultar As Range
For Fila = 2 To Range("b65536").End(xlUp).Row (esto lo entiendo bien)
If Range("b" & Fila) = "SI" Then Set Ocultar = _
Union(IIf(Ocultar Is Nothing, Range("a" & Fila), Ocultar), Range("a"
& Fila))
' aqui es donde no lo pillo... porque si le doy para comprobar que valor
tiene ocultar, me pone que es "SI"
y no veo que se haga referencia en ningun momento al numero de fila que
tiene cada uno de los rangos
por otro lado, la funcion union no tiene un limite de 30 rangos?

Next
If Not Ocultar Is Nothing Then Ocultar.EntireRow.Hidden = True: Set
Ocultar = Nothing
End Sub




Respuesta Responder a este mensaje
#9 Héctor Miguel
08/02/2009 - 22:59 | Informe spam
hola, !

(hasta donde se) el metodo print de un objeto debug tiene la limitante de +/- 255 caracteres en las devoluciones de texto
- la devolucion que obtienes ya es de 252 caracteres y solo quedan disponibles 3 (NO cabe otra direccion "absoluta")
- prueba el debug.print con la propiedad .Address(0,0) y obtendras hasta la celda A123 (SIN "$") con total de caracteres: 254
- lo que devuelva debug.print no tiene nada que ver con el contenido real de la variable <de tipo rango>

(p.e.) revisa las dos lineas que genera en la ventana de inmediato el siguiente codigo:

Sub Probando_Debug_Strings()
Dim Fila As Integer, Rango As Range
For Fila = 1 To 200 Step 2
Set Rango = Union(IIf(Rango Is Nothing, Range("a" & Fila), Rango), Range("a" & Fila))
Next
Debug.Print Rango.Address
Debug.Print Rango.Address(0, 0)
Set Rango = Nothing
End Sub

saludos,
hector.

__ OP __
... me gustaria saber porque si pongo debug.print ocultar.address me sale solo el rango hasta la fila 85 de 200
por ejemplo, digamos que en a1 y siguientes escribo si no si no si no, asi hasta la fila 200.
Para saber que es lo que me devuelve union despues de hacer el procedimiento entero
he puesto debug.print ocultar.address y me devuelve esto:


$A$1,$A$3,$A$5,$A$7,$A$9,$A$11,$A$13,$A$15,$A$17,$A$19,$A$21,$A$23,$A$25,$A$27,$A$29,$A$31,$A$33,$A$35,$A$37,$A$39,$A$41,$A$43,$A$45,$A$47,$A$49,$A$51,$A$53,$A$55,$A$57,$A$59,$A$61,$A$63,$A$65,$A$67,$A$69,$A$71,$A$73,$A$75,$A$77,$A$79,$A$81,$A$83,$A$85
y no hasta la fila 200, sin embargo el procedimiento le hace hasta la fila.
Es lo que no entiendo.
Respuesta Responder a este mensaje
#10 Anonimo
08/02/2009 - 23:11 | Informe spam
Gracias, seguramente sera como dices, y muchas gracias por tu explicacion.

Y una ultima pregunta, como puedo ampliar la seleccion a dos columnas a la
izquierda de cada una de las filas que pone SI

yo he intentando con ocultar.resize(0,3).select

pero no ha funcionado




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

(hasta donde se) el metodo print de un objeto debug tiene la limitante de
+/- 255 caracteres en las devoluciones de texto
- la devolucion que obtienes ya es de 252 caracteres y solo quedan
disponibles 3 (NO cabe otra direccion "absoluta")
- prueba el debug.print con la propiedad .Address(0,0) y obtendras hasta
la celda A123 (SIN "$") con total de caracteres: 254
- lo que devuelva debug.print no tiene nada que ver con el contenido real
de la variable <de tipo rango>

(p.e.) revisa las dos lineas que genera en la ventana de inmediato el
siguiente codigo:

Sub Probando_Debug_Strings()
Dim Fila As Integer, Rango As Range
For Fila = 1 To 200 Step 2
Set Rango = Union(IIf(Rango Is Nothing, Range("a" & Fila), Rango),
Range("a" & Fila))
Next
Debug.Print Rango.Address
Debug.Print Rango.Address(0, 0)
Set Rango = Nothing
End Sub

saludos,
hector.

__ OP __
... me gustaria saber porque si pongo debug.print ocultar.address me sale
solo el rango hasta la fila 85 de 200
por ejemplo, digamos que en a1 y siguientes escribo si no si no si no,
asi hasta la fila 200.
Para saber que es lo que me devuelve union despues de hacer el
procedimiento entero
he puesto debug.print ocultar.address y me devuelve esto:


$A$1,$A$3,$A$5,$A$7,$A$9,$A$11,$A$13,$A$15,$A$17,$A$19,$A$21,$A$23,$A$25,$A$27,$A$29,$A$31,$A$33,$A$35,$A$37,$A$39,$A$41,$A$43,$A$45,$A$47,$A$49,$A$51,$A$53,$A$55,$A$57,$A$59,$A$61,$A$63,$A$65,$A$67,$A$69,$A$71,$A$73,$A$75,$A$77,$A$79,$A$81,$A$83,$A$85
y no hasta la fila 200, sin embargo el procedimiento le hace hasta la
fila.
Es lo que no entiendo.




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida