Discussion:
Desplazarse entre celdas verticalmente filtradas
(demasiado antiguo para responder)
email
2007-05-30 19:00:04 UTC
Permalink
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
Arcano
2007-05-30 19:20:59 UTC
Permalink
Post by email
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
ActiveCell.Offset(1, 0).Select
email
2007-05-30 19:34:04 UTC
Permalink
Arcano gracia por responderme, pero esta instruccion no me sirve por que los
datos esta filtrados y con esta intruccion se desplaza una celda hacia abajo
pero no se desplaza entre datos filtrados
Post by Arcano
Post by email
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
ActiveCell.Offset(1, 0).Select
David
2007-05-30 19:47:03 UTC
Permalink
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.

- - - - - -
Post by email
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
email
2007-05-30 20:14:01 UTC
Permalink
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.
Post by David
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
Do
ActiveCell.Offset(1, 0).Select
Loop Until ActiveCell.Height > 0
Saludos.
- - - - - -
Post by email
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
Ivan
2007-05-30 22:07:06 UTC
Permalink
hola,

echale un ojo a la propiedad SpecialCells y a su parametro
xlCellTypeVisible, aunque si expones algun dato mas (o el codigo que
estas usando) sobre lo que quieres hacer con las celdas visibles creo
que seria mas facil para cualquiera echarte una mano, (de hecho, por
aqui anda algun que otro maestro, que manejan el tema que da gusto)

entere tanto mira a ver si alguna de estas conversaciones te pueden
ayudar

http://tinyurl.com/3xnmf3

un saludo
Ivan
David
2007-05-31 15:10:01 UTC
Permalink
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.

- - - - - -
Post by email
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.
Post by David
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
Do
ActiveCell.Offset(1, 0).Select
Loop Until ActiveCell.Height > 0
Saludos.
- - - - - -
Post by email
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
Ivan
2007-05-31 16:36:50 UTC
Permalink
Post by email
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.
Post by David
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
Do
ActiveCell.Offset(1, 0).Select
Loop Until ActiveCell.Height > 0
Saludos.
- - - - - -
Post by email
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 = "=c2<>"""""
.[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

Loading...