¿Cómo puedo agilizar un código de filtrado de datos?

Todoexpertos", tengo un gran problema con una rutina para filtrar registros. El problema es que dicha rutina me dura mucho en terminar y arrojar resultados, me preguntaba si alguien me pudiera orientar para que me corra más rápido.

Describiendo un poco más...

Hojas involucradas:

ENT!= Hoja de entradas de material

FILENTR!= Hoja donde se filtran los registros, dentro de esta hoja se encuentran 4 celdas en las que escribo los datos y luego ejecuto la macro con un botón. Dichas celdas son "B1, B2, B3, B4".

B1=  Nombre de proveedor del material

B2= Código del material

B3= Fecha 1,( desde)

B4= Fecha 2, (Hasta)

Este es el código que utilizo para filtrar:

Sub filtro_entradas()
On Error Resume Next
Sheets("FILENTRADAS").Select

codigo = [b2]

Range("a11:J1000000") = ""

Application.ScreenUpdating = False

With Sheets("ENT")

' si se omite la fecha inicial se toma la fecha menor de la Hoja ENTRADAS
If [b3] = "" Then
fecha1 = CDate(WorksheetFunction.Min(.Range("G11:G1000000")))
Else
fecha1 = CDate([b3])
End If
' si se omite la fecha final se toma la fecha mayor de la Hoja ENTRADAS
If [b4] = "" Then
fecha2 = CDate(WorksheetFunction.max(.Range("G11:G1000000")))
Else
fecha2 = CDate([b4])
End If
'si se omite un codigo entonces filtrar todos los registros comprendidos entre las fechas seleccionadas
If [b2] = "" Then
For a = 11 To .Range("a1000000").End(xlUp).Row
If CDate(.cells(a, 7)) >= fecha1 And CDate(.cells(a, 7)) <= fecha2 Then
rw = Range("a10:a1000000").Find("").Row
For b = 1 To 10
cells(rw, b) = .cells(a, b)
Next b
End If
Next a
Else
'filtrar registros con las fechas y codigos indicados
For a = 11 To .Range("a1000000").End(xlUp).Row
If .cells(a, 1) = codigo And CDate(.cells(a, 7)) >= fecha1 And CDate(.cells(a, 7)) <= fecha2 Then
rw = Range("a10:a1000000").Find("").Row
For b = 1 To 10
cells(rw, b) = .cells(a, b)
Next b
End If
Next a
End If
End With
Application.ScreenUpdating = True
End Sub
Sub filtro_entradas1()
On Error Resume Next
Sheets("FILENTRADAS").Select

codigo = [b1]

Range("a11:J1000000") = ""

Application.ScreenUpdating = False

With Sheets("ENT")

' si se omite la fecha inicial se toma la fecha menor de la Hoja ENTRADAS
If [b3] = "" Then
fecha1 = CDate(WorksheetFunction.Min(.Range("G11:G1000000")))
Else
fecha1 = CDate([b3])
End If
' si se omite la fecha final se toma la fecha mayor de la Hoja ENTRADAS
If [b4] = "" Then
fecha2 = CDate(WorksheetFunction.max(.Range("G11:G1000000")))
Else
fecha2 = CDate([b4])
End If
'si se omite un codigo entonces filtrar todos los registros comprendidos entre las fechas seleccionadas
If [b1] = "" Then
For a = 11 To .Range("a1000000").End(xlUp).Row
If CDate(.cells(a, 7)) >= fecha1 And CDate(.cells(a, 7)) <= fecha2 Then
rw = Range("a10:a1000000").Find("").Row
For b = 1 To 10
cells(rw, b) = .cells(a, b)
Next b
End If
Next a
Else
'filtrar registros con las fechas y codigos indicados
For a = 11 To .Range("a1000000").End(xlUp).Row
If .cells(a, 8) = codigo And CDate(.cells(a, 7)) >= fecha1 And CDate(.cells(a, 7)) <= fecha2 Then
rw = Range("a10:a1000000").Find("").Row
For b = 1 To 10
cells(rw, b) = .cells(a, b)
Next b
End If
Next a
End If
End With
Application.ScreenUpdating = True
End Sub

Espero alguien me pueda ayudar, puesto que es lo único que necesito para terminar, se los agradecería mucho. De antemano muchas gracias amigos. Saludos a todos.

P. D El archivo que tengo pesa aproximadamente 700 kb, contiene más o menos unas 15 hojas, intenté probar el código copiando sólo las dos hojas en uso del filtro a un nuevo libro con todo y su código y en el nuevo libro con sólo las dos hojas me corre rápido, pero en el que contiene todas las hojas se demora mucho.

1 respuesta

Respuesta
1

Pusiste 2 macros, te anexo el código de la primera macro.

Lo que hace la macro es un filtro avanzado de los datos que tienes en la hoja "EN" y los copia en la hoja "FILEENTRADAS", para que funcione deberás poner en la hoja "FILEENTRADAS" en la celda "T1" el título tal como lo tienes en la hoja "ENT" celda "A10"; y en la hoja "FILEENTRADAS" en las celdas "U1" y "V1" tienes que poner el título que tienes de la hoja "ENT" celda "G10".

Sub filtro_entradas()
'Act.Por.Dante Amor
    Set h1 = Sheets("FILENTRADAS")
    Set h2 = Sheets("ENT")
    '
    h1.Range("a11:J1000000") = ""
    h1.Range("T2:V2") = ""
    u = h2.Range("G" & Rows.Count).End(xlUp).Row
    ' si se omite la fecha inicial se toma la fecha menor de la Hoja ENTRADAS
    If [b3] = "" Then
        fecha1 = CDate(WorksheetFunction.Min(h2.Range("G11:G" & u)))
    Else
        fecha1 = CDate([b3])
    End If
    ' si se omite la fecha final se toma la fecha mayor de la Hoja ENTRADAS
    If [b4] = "" Then
        fecha2 = CDate(WorksheetFunction.Max(h2.Range("G11:G" & u)))
    Else
        fecha2 = CDate([b4])
    End If
    h1.[T2] = h1.[B2]
    h1.[U2] = ">=" & Int(CDbl(fecha1))
    h1.[V2] = "<=" & Int(CDbl(fecha2))
    '
    h2.Range("A10:J" & u).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=h1.Range("T1:V2"), _
        CopyToRange:=h1.Range("A10:J10"), Unique:=False
End Sub

Prueba y me comentas, si tienes dudas de cómo deben estar los datos envíame tu archivo y adapto la macro.

Hola Dam, antes que nada muchas gracias por contestar.

Acerca del código que me envías, logré acoplarlo a mi libro, pero creo que no hace lo que necesito. Me explico:

Lo que hace la primera macro que puse en la descripción es que busca por código, fecha1, (desde), fecha2,(hasta),es decir; si se llenan los tres criterios de búsqueda  encuentra todos los registros de ese código dentro del rango de fechas estipulado, y lo coloca en la hoja FILENTRADAS ejemplo: código: 54875247, fecha1: 01/01/2013, fecha2: 31/11/2013.

Si se omite la fecha inicial se toma la fecha menor de la Hoja ENTRADAS

Si se omite la fecha final se toma la fecha mayor de la Hoja ENTRADAS

Si se omite un código entonces filtrar todos los registros comprendidos entre las fechas seleccionadas

Lo que el código que amablemente me mandaste  hace es traer todos los códigos dentro de ese rango de fechas.

Explicando la segunda macro que puse, era básicamente lo mismo, pero en lugar de buscar un código entre un rango de fechas, su objetivo era buscar los registros que se hicieron de un proveedor entre ese rango de fechas, esta macro es la que me tarda más en ejecutarse, pero sería ideal que las dos macro tuviesen la misma lógica. Fue por esa razón que puse ambas macros.

Muchas gracias por tu atención Dam, y de verdad agradezco tu ayuda, espero haber sido claro en mi explicación. Saludos.

La macro que te envié también filtra por código, envíame tu archivo para realizar los ajustes.

Hola Dam, te en enviado he documento. 

Listo! Quedó el filtro de entradas y de proveedores en una sola macro.

Sub filtro_entradas()
'Act.Por.Dante Amor
    Set h1 = Sheets("FILENTRADAS")
    Set h2 = Sheets("ENT")
    '
    h1.Range("a11:J1000000, T2:W2") = ""
    u = h2.Range("G" & Rows.Count).End(xlUp).Row
    '
    h1.[T2] = h1.[B2].Text
    h1.[U2] = ">=" & Int(CDbl(IIf(h1.[b3] = "", Application.Min(h2.Range("G11:G" & u)), CDate(h1.[b3]))))
    h1.[V2] = "<=" & Int(CDbl(IIf(h1.[b4] = "", Application.max(h2.Range("G11:G" & u)), CDate(h1.[b4]))))
    h1.[W2] = h1.[B1]
    '
    h2.Range("A10:J" & u).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=h1.Range("T1:W2"), CopyToRange:=h1.Range("A10:J10"), Unique:=False
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas