Desplazarse entre celdas verticalmente filtradas

30/05/2007 - 21:00 por email | Informe spam
Quiero realizar una macro que filtra los datos no vacios de un columna, luego
enpieza a recorrer celda por celda verticalmente para copiarlos en diferentes
partes, pero no encuentro la instruccion que me haga desplazarme celda por
celda en una columna(verticalmente) con datos filtrados

Preguntas similare

Leer las respuestas

#6 David
31/05/2007 - 17:10 | Informe spam
Otra posibilidad (inspirada en el aporte de Ivan), podría ser que expandieras
la selección a la región actual, seleccionaras las celdas visibles, y luego
dentro de las áreas que hayan sido seleccionadas, busques la próxima a la
posición original.

Aquí está el código:


Sub SiguienteFila()
On Error GoTo Fuera
Dim f, c As Long
'Desactivo la actualización de pantalla para hacer más rápido el código
Application.ScreenUpdating = False
'Detecto la fila y columna de la celda activa
f = ActiveCell.Row
c = ActiveCell.Column
'Selecciono la región actual y sus celdas visibles
Set Tbl = ActiveCell.CurrentRegion
Tbl.Select
Selection.SpecialCells(xlCellTypeVisible).Select
'Recorro todas las áreas hasta encontrar la siguiente a la celda original
For Each a In Selection.Areas
If a.Row > f Then Exit For
Next
'Selecciono la celda encontrada y reactivo la actualización de pantalla
Cells(a.Row, c).Select
Application.ScreenUpdating = True
Exit Sub
Fuera:
'Se produce error cuando se llega a la última fila
Cells(f, c).Select
Application.ScreenUpdating = True
End Sub

El problema que veo, es que bajo este método hay que recorrer todas las
áreas (es decir filas) que tu filtro haya dejado en pantalla (2 al menos).
Si estas filas son pocas, excelente, el procedimiento trabaja bastante
rápido, pero si son muchas, caemos en el problema original: será muy lento,
principalmente con los últimos datos.

Bueno, aquí te lo dejo para que lo evalúes. En todo caso, puedes utilizar
Selection.Areas.Count para determinar si el número de áreas justifica este
método, y con un poco de trabajo, podrías agregarle algunas condiciones para
decidir por uno o por el otro.

Espero que te sirva. Siempre comentas.



"email" escribió:

David gracias por tu respuesta, pero existe otra alternativa?, la idea es que
en algunos casos hay entre una celda y otra, unas 10 o 15 mil celdas ocultas
y este proceso se demora mucho por este lado.

"David" escribió:

> Cuando aplicas filtros, las celdas se ocultan aplicándoles un ancho cero.
> Por eso los métodos convencionales no te funcionan en VBA. Prueba con las
> siguientes líneas:
>
> Do
> ActiveCell.Offset(1, 0).Select
> Loop Until ActiveCell.Height > 0
>
> Saludos.
>
>
>
> "email" escribió:
>
> > Quiero realizar una macro que filtra los datos no vacios de un columna, luego
> > enpieza a recorrer celda por celda verticalmente para copiarlos en diferentes
> > partes, pero no encuentro la instruccion que me haga desplazarme celda por
> > celda en una columna(verticalmente) con datos filtrados
Respuesta Responder a este mensaje
#7 Ivan
31/05/2007 - 18:36 | Informe spam
On 30 mayo, 22:14, email wrote:
David gracias por tu respuesta, pero existe otra alternativa?, la idea es que
en algunos casos hay entre una celda y otra, unas 10 o 15 mil celdas ocultas
y este proceso se demora mucho por este lado.

"David" escribió:



> Cuando aplicas filtros, las celdas se ocultan aplicándoles un ancho cero.
> Por eso los métodos convencionales no te funcionan en VBA. Prueba con las
> siguientes líneas:

> Do
> ActiveCell.Offset(1, 0).Select
> Loop Until ActiveCell.Height > 0

> Saludos.


> "email" escribió:

> > Quiero realizar una macro que filtra los datos no vacios de un columna, luego
> > enpieza a recorrer celda por celda verticalmente para copiarlos en diferentes
> > partes, pero no encuentro la instruccion que me haga desplazarme celda por
> > celda en una columna(verticalmente) con datos filtrados- Ocultar texto de la cita -

- Mostrar texto de la cita -



hola de nuevo,

ya puestos y a la espera de tus aclaraciones7especificaciones otra
propuesta que te pega todas los registros visibles en otra hoja

para el ej:

1º) la lista a filtrar esta en la hoja activa

2º) el rango en el ej va de la columna A a la G, ambas incluidas

3ª los titulos estan en la fila1 y los datos en empiezan en la 2 ( en
le ej. llega hasta la fila 12000 y pico, pero prueba con la cantidad
de filas que quieras)

4º) la columna en la que se comprueban si las celdas estan vacias es
la c, copiando las que no estan vacias

5º) tienes que tener una hoja llamada "Hoja3", vacia al menos hasta la
columna G

6º) en la hoja activa (donde esta la lista) la columna H debe estar
vacia y la I tambien (o al menos el rango I1:I2

pega el siguiente codigo en un modulo normal y prueba a ver que tal

Sub FiltraPegaVisibles()
With ActiveSheet
On Error Resume Next
.ShowAllData
On Error GoTo 0
If .AutoFilterMode Then .AutoFilterMode = False
.[i1:i2].ClearContents
.[i2].Formula = "Â<>"""""
.[a1].CurrentRegion.AdvancedFilter xlFilterCopy, .[i1:i2], _
ThisWorkbook.Worksheets("Hoja3").[a1:g1], False
.[i2].ClearContents
End With
End Sub


con mas de 12000 registros tarda +o- un segundo

mira a ver si te ayuda, y si te animas a comentar esos detalles
pues ...

un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida