Mostrar datos filtrados en un listbox

01/09/2008 - 06:47 por Babel | Informe spam
Tengo datos de un movimiento de materiales asi:

a b c d e f g
h

1 Remanofactura 4 Entrada Proveedor 28/08/2007 Lleno Info
2 Remanofactura 6 Entrada Proveedor 28/08/2007 Lleno Info
3 Cambio de 4 Entrada Info 30/08/2007 Lleno Mercad
4 Cambio de 2 Salida Merc 30/08/2007 Vacio Infor
5 Cambio de 5 Entra Infor 07/09/2007 Lleno Cert
6 Cambio de 12 Salida Certam 07/09/2007 Vacio Info
7 Cambio de 6 Entra Info 10/09/2007 Lleno
Recep
8 Cambio de 1 Salida Recep 10/09/2007 Vacio Infor
9 Para Recarga 2 Salida Inform 05/09/2007 Vacio Proveedores
10 Recargado 2 Entrada Proveedor 10/09/2007 Lleno Infor
11 Para Recarga 1 Salida Inform 10/09/2007 Vacio Proveedor
12 Para Recarga 12 Salida Inform 07/09/2007 Vacio Proveedor

realizo el filtro por la columna G, asi:
ActiveSheet.Range("a1:h12").AutoFilter Field:=7, Criteria1:="Lleno"

hasta ahi todo muy bien, excel me hace el filtro personalizado, pero
ahora viene la pregunta. Como paso los resultados del filtro a un
listbox con titulo por VBA?

... Bueno la verdad es que he realizado varios ensayos y me funciona
uno el cual es el siguente:

seleccionar los campos visibles luego de generar el filtro automatico,
asi:

Selection.SpecialCells(xlCellTypeVisible).Select

luego copio esa seleccion, me ubico en otra hoja y los pego

Selection.Copy
Sheets("Reportes").Select 'Activa hoja de Reportes
Range("A1").Select
ActiveSheet.Paste

Luego voy a ese nueva hoja que pegue los resultados, paso de celda en
celda agregando los datos a una matriz, la cual despues agrego
a el listbox.

ReDim matriz(0 To Range(rango).Count - 1, 0 To 9) 'Dimenciona la
Matriz de los movimientos
Range("A2").Select
Do While ActiveCell.Value <> Empty 'Recorre la hoja para copiar datos
ala Matriz
For Col = 0 To 9
matriz(Fila, Col) = ActiveCell.Offset(0, Col) 'Agrega los valores
a la Matriz de movimientos
Next
Fila = Fila + 1
ActiveCell.Offset(1, 0).Select
Loop

listbox1.list=matriz ' Agrego datos de la natriz al listbox

Bueno .. la cuestion es que este codigo me funciona y me pone los
datos filtrados en un listbox. la cuestion es que cuando mis
movimientos son mas de 150 este codigo se demora mas de 42 segundos.
quisiera que me dijeran algo mas automatico o alguna otra forma de
mostrar mis datos filtrados

Muchas Gracias .. ! .. espero ser claro .. !

Preguntas similare

Leer las respuestas

#1 Juan M
01/09/2008 - 09:53 | Informe spam
Hola,

Si el problema es la demora, procura no seleccionar rangos, ni activaciones
de páginas y podrías evitar la copia de rangos de una hoja a otra, a menos
que sea imprescindible.

El siguiente código lo debes ajustar para tus datos, y las variables que
prefieras. En principio está para 3 columnas y el rango es hasta la fila 22.

Un saludo,
Juan

en el proceso donde cargues tus datos al list box

Dim celda As Range
Dim fila As Long
Dim i As Long, j As Long
Dim matriz()

fila = Range("A2:A22").SpecialCells(xlCellTypeVisible).Count - 1
ReDim matriz(fila, 2)
j = 0
For Each celda In Range("A2:A22").SpecialCells(xlCellTypeVisible)
For i = 0 To 2
matriz(j, i) = celda.Offset(, i)
Next i
j = j + 1
Next celda
ListBox1.List = matriz

Fin código




"Babel" escribió
Tengo datos de un movimiento de materiales asi:

a b c d e f g
h

1 Remanofactura 4 Entrada Proveedor 28/08/2007 Lleno Info
2 Remanofactura 6 Entrada Proveedor 28/08/2007 Lleno Info
3 Cambio de 4 Entrada Info 30/08/2007 Lleno Mercad
4 Cambio de 2 Salida Merc 30/08/2007 Vacio Infor
5 Cambio de 5 Entra Infor 07/09/2007 Lleno Cert
6 Cambio de 12 Salida Certam 07/09/2007 Vacio Info
7 Cambio de 6 Entra Info 10/09/2007 Lleno
Recep
8 Cambio de 1 Salida Recep 10/09/2007 Vacio Infor
9 Para Recarga 2 Salida Inform 05/09/2007 Vacio Proveedores
10 Recargado 2 Entrada Proveedor 10/09/2007 Lleno Infor
11 Para Recarga 1 Salida Inform 10/09/2007 Vacio Proveedor
12 Para Recarga 12 Salida Inform 07/09/2007 Vacio Proveedor

realizo el filtro por la columna G, asi:
ActiveSheet.Range("a1:h12").AutoFilter Field:=7, Criteria1:="Lleno"

hasta ahi todo muy bien, excel me hace el filtro personalizado, pero
ahora viene la pregunta. Como paso los resultados del filtro a un
listbox con titulo por VBA?

... Bueno la verdad es que he realizado varios ensayos y me funciona
uno el cual es el siguente:

seleccionar los campos visibles luego de generar el filtro automatico,
asi:

Selection.SpecialCells(xlCellTypeVisible).Select

luego copio esa seleccion, me ubico en otra hoja y los pego

Selection.Copy
Sheets("Reportes").Select 'Activa hoja de Reportes
Range("A1").Select
ActiveSheet.Paste

Luego voy a ese nueva hoja que pegue los resultados, paso de celda en
celda agregando los datos a una matriz, la cual despues agrego
a el listbox.

ReDim matriz(0 To Range(rango).Count - 1, 0 To 9) 'Dimenciona la
Matriz de los movimientos
Range("A2").Select
Do While ActiveCell.Value <> Empty 'Recorre la hoja para copiar datos
ala Matriz
For Col = 0 To 9
matriz(Fila, Col) = ActiveCell.Offset(0, Col) 'Agrega los valores
a la Matriz de movimientos
Next
Fila = Fila + 1
ActiveCell.Offset(1, 0).Select
Loop

listbox1.list=matriz ' Agrego datos de la natriz al listbox

Bueno .. la cuestion es que este codigo me funciona y me pone los
datos filtrados en un listbox. la cuestion es que cuando mis
movimientos son mas de 150 este codigo se demora mas de 42 segundos.
quisiera que me dijeran algo mas automatico o alguna otra forma de
mostrar mis datos filtrados

Muchas Gracias .. ! .. espero ser claro .. !
Respuesta Responder a este mensaje
#2 Ivan
02/09/2008 - 02:10 | Informe spam
hola chicos.

realizo el filtro por la columna G, asi:
ActiveSheet.Range("a1:h12").AutoFilter Field:=7, Criteria1:="Lleno"



. la cuestion es que cuando mis
movimientos son mas de 150 este codigo se demora mas de 42 segundos.
quisiera que me dijeran algo mas automatico o alguna otra forma de
mostrar mis datos filtrados




Otra posibilidad (mejor dicho, 2 casi iguales) seria con filtros
avanzados, sobre todo si son muchos registros (suele ser casi
instantaneo aun con bastantes miles de registros)

solo habria que tener en cuenta (para mis ejemplos) por un lado: que
la fila de titulos sea la 1 y que los datos empiecen en la 2ª de la
columna A, y por otro que a partir de la columna DY la hoja este vacia
(y que la lista no tenga mas de 48 columnas [si no he contado mal],
aunque todo esto es aleatorio y modificable

aparte cambiar el nombre de la hoja, claro :-)

en mis pruebas he usado un listbox y dos commandbutton en un userform
y sin cambiarles el nombre

la diferencia entre una forma y otra es la manera de cargar el listbox
(mediante la propiedad RowSource o mediante el metodo List), el resto
es basicamente igual, aunque con diferentes rangos precisamente para
ver una de las diferencias, que es que con rowsource, aunque te
permite usar los titulos de los campos de la hoja en el listbox, no
puedes borrar el rango con la lista mientras este en ejecucion (sin
borrar los del listbox) mientras que con List si lo puedes hacer, pero
no puedes poner titulo a las columnas del listbox

tambien se presuponen los LLENO/VACIO en la columna G

bueno estos son los codigos, practicamente iguales pero que pongo
enteros por no liarla. El queryclose es para en el caso del rowSource
borrar el rango copiado al cerrar el form

Private Sub CommandButton1_Click()
Dim rngOrigen As Range, rngDestino As Range, rngCriterio As Range
With Worksheets("Hoja1")
.Range("dy:ez").Clear
.Range("dy2").Formula = "=G2=""" & "LLENO"""
Set rngCriterio = .Range("dy1:dy2")
Set rngOrigen = .Range("a1").CurrentRegion
Set rngDestino = .Range(.Range("ea1"), _
.Range("ea1").Offset(0, rngOrigen.Columns.Count - 1))
rngOrigen.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=rngCriterio, _
Copytorange:=rngDestino, _
unique:=False
ListBox1.ColumnCount = Worksheets("Hoja1").[a1] _
.CurrentRegion.Columns.Count
ListBox1.ColumnHeads = True
ListBox1.RowSource = ""
ListBox1.Clear
If rngDestino.CurrentRegion.Rows.Count > 1 Then _
ListBox1.RowSource = .Range(.Range("ea2"), .Range("ea2") _
.Offset(rngDestino.CurrentRegion.Rows.Count - 2, _
rngDestino.Columns.Count - 1)).Address(0, 0)
End With
Set rngOrigen = Nothing
Set rngDestino = Nothing
Set rngCriterio = Nothing
End Sub



Private Sub CommandButton2_Click()
Dim rngOrigen As Range, rngDestino As Range, rngCriterio As Range
With Worksheets("Hoja1")
.Range("fy:gz").Clear
.Range("fy2").Formula = "=G2=""" & "LLENO"""
Set rngCriterio = .Range("fy1:fy2")
Set rngOrigen = .Range("a1").CurrentRegion
Set rngDestino = .Range(.Range("ga1"), .Range("ga1") _
.Offset(0, rngOrigen.Columns.Count - 1))
rngOrigen.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=rngCriterio, _
Copytorange:=rngDestino, _
unique:=False
ListBox1.RowSource = ""
ListBox1.Clear
ListBox1.ColumnHeads = False
If rngDestino.CurrentRegion.Rows.Count > 1 Then _
ListBox1.List = .Range(.Range("ga2"), .Range("ga2") _
.Offset(rngDestino.CurrentRegion.Rows.Count - 2, _
rngDestino.Columns.Count - 1)).Value
rngCriterio.Clear
rngDestino.CurrentRegion.Clear
End With
Set rngOrigen = Nothing
Set rngDestino = Nothing
Set rngCriterio = Nothing

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, _
CloseMode As Integer)
If Not Cancel Then _
Worksheets("Hoja1").Range("dy:iv").Clear
End Sub

lo dicho, solo una ampliacion de lo comentado por Juan (y sobre todo
por ir retomando un poco excel :-D)

un saludo
Ivan

PD: (hola Juan, ¿como andas?)

PPD: hecho en xp
Respuesta Responder a este mensaje
#3 Ivan
02/09/2008 - 02:35 | Informe spam
sorry,

por prevencion convendria incluir, justo tras el =>

With Worksheets("Hoja1")

de los dos botones

esto=>

If .FilterMode Then .ShowAllData

para evitarnos problemas

falta de habito...:-)

un saludo
Ivan
Respuesta Responder a este mensaje
#4 Juan M
02/09/2008 - 14:20 | Informe spam
"Ivan" escribió

PD: (hola Juan, ¿como andas?)






Saliéndonos del tema, bien, espero que tú también lo estés. Es grato volver
a verte por este foro.

Un saludo,
Juan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida