A vueltas con los filtros avanzados

18/07/2006 - 00:44 por klomkbock | Informe spam
Hola a todos. Espero que los que esteis por otras latitudes no os esteis
derritiendo como los que andamos por estas, las hispanicas.

Aqui vuelvo de nuevo a abusar de vuestra generosidad.

Llevaba tiempo dandole vueltas a los filtros avanzados para rellenar un
combobox con los registros unicos de un campo variable(puede variar la
longitud del campo y el campo mismo). Al fin lo he conseguido.

El problema es que el motivo de usar los filtros era ganarle en velocidad
al proceso, que hasta ahora realizaba mediante un objeto collection,
cuando se trata de trabajar con varios miles de registros.

Por lo que se(de muy buena fuente en estas lides), el uso de filtros hace
mas rapida la ejecucion que el de colecciones, sin embargo, algo debo de
estar haciendo mal, pues de momento, y tras probar unas cuantas
posibilidades, el uso del objeto collection es bastante mas rapido que los
filtros.

Para 5000 registros, con filtro avanzado tarda entre 6 y 10 segundos,
mientras que con collection tarda un maximo de 2 segundos(si estos tiempos
fueran asi para hasta 20000 registros me podrian valer, pero me seguiria
quedando la espina de los filtros avanzados y de en que estoy fallando)

Al final expongo los codigos en ambos casos. Con los filtros expongo 3,
que tardan practicamente igual, pero antes explico su entorno brevemente??:

En los codigos intervienen:

=>a) tres hojas(en unos intervienen dos y tres en otros):

.-Hoja1= "Listado": contiene la lista con los datos. Para las pruebas
actuales 5000 registros. El unico campo que no puede tener registros
repetidos es el 1º(columna A) y, a partir del 5º(columna E), puede
contener registros vacios.
.-Hoja2= "Matrices": contiene listas para rellenar matrices o variables.
La que interviene en los codigos es la columna A que contiene un listado
con todas las letras de la A a la Z, que se corresponden con las columnas
de Listado (26 en total)
.-Hoja3= "Oculta": se usa para pegar los datos filtrados y pasarlos al
combo de destino.

=>b) dos combobox (que interesen al caso) de un formulario:

.-ComboBox1= "cmbElegir": contiene los titulos de los 26 campos de
"Listado" (rango "a1:z1"). Se cargan al inicializarse el formulario.
.-ComboBox2= "cmbCriterio": se rellena con los registros no repetidos del
campo elegido en "cmbElegir"(cmbElegir_Change).

==>> Este es el codigo con collection:

Private Sub cmbElegir_Change()
Dim rngListado As Range, xList As Long
Dim ListaUnicos As New Collection
Application.ScreenUpdating = False
With cmbElegir
If .Value = .BoundValue Then Exit Sub
cmbCriterio.Clear: lstSeleccionar.Clear
If .ListIndex < 0 Then Exit Sub Else nL = .ListIndex + 1
End With
ltC = Worksheets("Matrices").Cells(nL, 1)
With Worksheets("Listado")
If .AutoFilterMode Then .AutoFilterMode = False
fF = .[a65536].End(xlUp).Row
.Range("a1:z" & fF).Sort _
key1:=.Range(ltC & "1"), _
header:=xlYes
For Each rngListado In .Range(ltC & "2:" & ltC & fF)
On Error Resume Next
If Trim(rngListado) <> "" Then _
ListaUnicos.Add rngListado, CStr(rngListado)
On Error GoTo 0
Next
End With
For xList = 1 To ListaUnicos.Count
cmbCriterio.AddItem ListaUnicos(xList)
Next
Set ListaUnicos = Nothing
Application.ScreenUpdating = True
End Sub

==>> y estos con advanced filter

->1ªprueba

Private Sub cmbElegir_Change()
''Se filtra bien, pero mas bien lento _
'''(de 7 a 10 sg con 5000 filas)
Application.ScreenUpdating = False
With cmbElegir
If .Value = .BoundValue Then Exit Sub
cmbCriterio.Clear: lstSeleccionar.Clear
If .ListIndex < 0 Then Exit Sub Else nL = .ListIndex + 1
End With
ltC = Worksheets("Matrices").Cells(nL, 1)
With Worksheets("Oculta")
.UsedRange.EntireRow.Delete
With Worksheets("Listado")
If .AutoFilterMode Then .AutoFilterMode = False
fF = .[a65536].End(xlUp).Row
.Range("a1:z" & fF).Sort _
key1:=.Range(ltC & "1"), _
header:=xlYes
.Range(ltC & "1:" & ltC & fF).AdvancedFilter _
criteriarange:=.Range(ltC & "1:" & ltC & fF), _
Action:=xlFilterCopy, _
copytorange:=Worksheets("Oculta").Range("a1"), _
unique:=True
End With
fFo = .Range("a65536").End(xlUp).Row
If fFo < 2 Then Exit Sub
cmbCriterio.List = .Range("a2:a" & fFo).Value
End With
Application.ScreenUpdating = True
End Sub

->2ªprueba (quizas ligeramente mas rapido que el anterior pero no estoy seguro

Private Sub cmbElegir_Change()
Application.ScreenUpdating = False
With cmbElegir
If .Value = .BoundValue Then Exit Sub
cmbCriterio.Clear: lstSeleccionar.Clear
If .ListIndex < 0 Then Exit Sub Else nL = .ListIndex + 1
End With
With Worksheets("Oculta")
.UsedRange.EntireRow.Delete
With Worksheets("Listado")
If .AutoFilterMode Then .AutoFilterMode = False
fF = .[a65536].End(xlUp).Row
.Range("a1:z" & fF).Sort _
key1:=.Cells(1, nL), _
header:=xlYes
.Range(.Cells(1, nL), .Cells(fF, nL)).AdvancedFilter _
criteriarange:=.Range(.Cells(1, nL), .Cells(fF, nL)), _
Action:=xlFilterCopy, _
copytorange:=Worksheets("Oculta").Range("a1"), _
unique:=True
End With
fFo = .Range("a65536").End(xlUp).Row
If fFo < 2 Then Exit Sub
cmbCriterio.List = .Range("a2:a" & fFo).Value
End With
Application.ScreenUpdating = True
End Sub

->3ªprueba (como la 1ª pero usando algunas variables mas, tarda igual)

Private Sub cmbElegir_Change()
''Prueba con variables range y variant para ver si agiliza
'''pero sigue mas o menos igual
Dim rngListado As Range, rngFiltrado
Application.ScreenUpdating = False
With cmbElegir
' If .Value = .BoundValue Then Exit Sub
cmbCriterio.Clear: lstSeleccionar.Clear
If .ListIndex < 0 Then Exit Sub Else nL = .ListIndex + 1
End With
ltC = Worksheets("Matrices").Cells(nL, 1)
With Worksheets("Oculta")
.UsedRange.EntireRow.Delete
With Worksheets("Listado")
If .AutoFilterMode Then .AutoFilterMode = False
fF = .[a65536].End(xlUp).Row
.Range("a1:z" & fF).Sort _
key1:=.Range(ltC & "1"), _
header:=xlYes
Set rngListado = .Range(ltC & "1:" & ltC & fF)
rngListado.AdvancedFilter _
criteriarange:=rngListado, _
Action:=xlFilterCopy, _
copytorange:=Worksheets("Oculta").Range("a1"), _
unique:=True
End With
fFo = .Range("a65536").End(xlUp).Row
If fFo < 2 Then Exit Sub
rngFiltrado = .Range("a2:a" & fFo).Value
cmbCriterio.List = rngFiltrado
End With
Application.ScreenUpdating = True
End Sub

Bueno, como siempre me ha salido otro tomo.

Si podeis echarme una mano os lo agradezco.

En cualquier caso, un saludo y hasta pronto.
Ivan

Preguntas similare

Leer las respuestas

#6 klomkbock
19/07/2006 - 09:58 | Informe spam
Hola Hector Miguel, gracias añadidas por tu esfuerzo

Estare encantado de recibir tu libro -comprimido no hay problema.-

Te aseguro que no tengo ninguna duda de tus 'lecciones', por eso es por lo
que mas me extraña. En algun punto debo estar metiendo la pata, pero no
logro encontrarlo. Quizas analizando tu libro consiga verlo.

Como siempre muchas gracias.

Un saludo y hasta pronto.
Ivan
Respuesta Responder a este mensaje
#7 klomkbock
19/07/2006 - 18:26 | Informe spam
Hola de nuevo, Hector Miguel

Sigo dandole vueltas al tema, buscando una posible causa y, a falta de
algo mejor, te comento algun detalle extra, aunque me temo que nada tengan
que ver.

En la hoja no hay formulas, pero si tengo asignado algun formato
manualmente:

Si mal no recuerdo la columna A tiene este formato:"0000" y consiste en
un numero 'seriado'.

Luego hay dos colunas con formato de fecha tipo: "YYYY"(solo el año), y
otras dos con este otro: "dd-mmm-yyy" o similar.

Tambien esta ajustado en 'formato de celdas'->'alineacion'-> vertical=>>
=>>centrar para toda la hoja; y un par de columnas tienen ajustar texto.

Tambien me acabo de dar cuenta de que el libro personal de macros me ha
desaparecido. Quizas lo haya eliminado sin querer., pero supongo que no
tendra que ver.

De momento es lo unico que se me ha ocurrido. Ahora no tengo tiempo, pero
esta noche intentare quitar los formatos (aunque ahora que lo pienso, el
libro que hice para los 30000 no tenia nada de formatos establecidos)

Quedo a la espera de tu libro a ver si veo algo.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#8 lomboc
20/07/2006 - 02:32 | Informe spam
Hola Hector Miguel, disculpa este nuevo mensaje, pero ya conoces mi
obsesiva costumbre de hilvanar mensaje tras mensaje(incluso podria
aparecer otro que el servidor de tutiempo.net parece haber rechazado).

He copiado los 10000 registros de mi listado a un libro nuevo, pero
solo los valores. Tambien he hecho un formulario nuevo.

Y por fin el filtro avazado parece funcionar correctamente (con
collection ni lo he probado, no se cuantos milisegundos ha tardado con
el filtro, pero creo que mas bien poquitos).

Imagino que el problema esta en los formatos predefinidos en la hoja,
que en su mayoria hice hace un monton de tiempo y que he debido ir
traspasando de libro en libro cuando volvia a empezar en uno nuevo. Ni
siquiera me acordaba de ellos.

Ahora el formato lo venia aplicando solo al nuevo registro al
ingresarlo via formulario, con lo que no me haria falta definirlos en
la hoja.

El problema es que me temo que de todas formas se ''''recalculen''''
los formatos cada vez que se filtren. ¿o quizas no sea el caso?, si
fuera asi, ¿se podria desactivar la 'actualizacion' de los formatos
mientras se filtra y volver a 'activarla' al menos cuando se vaya a la
hoja?, todo ello sin que supusiera una remora excesiva de tiempo.
(decidi dar el formato registro a registro por que al darlo a toda la
hoja tardaba mucho).

El formato incluye autofit y wordwrap entre bastantes cosas mas.

No estoy seguro de que la cosa vaya por aqui, pero desde mi ignorancia
me parece bastante posible.

De todas formas me gustaria poder echar un vistazo a ese libro para,
aparte de ver los filtros, intentar aprender algo sobre
''''cronometraje''' de procedimientos.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#9 Héctor Miguel
20/07/2006 - 03:40 | Informe spam
hola, Ivan !

De todas formas me gustaria poder echar un vistazo a ese libro [...]



quieres decir que no te ha llegado el archivo ?

te lo envie 10 min. despues de que aparecio tu mensaje [y no me ha sido 'devuelto'] -?-

saludos,
hector.
Respuesta Responder a este mensaje
#10 Ivan
20/07/2006 - 03:56 | Informe spam
Hola Hector Miguel,

Efectivamente no me ha llegado nada. Desde que instale el adsl tengo
algunos problemas con el correo, pero normalmente me suele entrar.

Hoy me han entrado varios mensajes, aparte de un monton de basura. Por
si acaso te pongo los correos:




Si puede reenviarlo te lo agradezco y en cualquier caso muchas gracias.

Un saludo y hasta pronto
Ivan

PD: ¿que opinas de los formatos?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida