Regresar a la Pagina de Inicio

5 oct. 2010

como utilizar autofiltros con macros

Estimo que no hace falta ninguna introducción a los Autofiltros de Excel, dado que en mayor o menor medida todos los hemos utilizados y conocemos sus principales funciones y configuración.
Pero. Y sí, si no hubiese "peros" este blog (estimo) no existiría.
Un lector tiene problemas a la hora de automatizar los Autofiltros mediante macros. Y yo se por que el tiene esos problemas: por que los Autofiltros son conflictivos y, de entrada, no se llevan bien con VBA. A menos que le hagamos algunos retoques al código.
las clásicas "flechitas para abajo" del Autofiltro.

[+/-] Ver el resto / Ocultar

10 comentarios:

Anónimo dijo...

gracias hermano. muy util tu publicacion.
tengo una pregunta:
en lugar de poder buscar en 1 campo se podria buscar en 2 campos??
como seria

Damian Omar Silva dijo...

fijate que el comando para filtrar con las macros contiene dos palabras: "field" y "criteria" (campo y criterio de filtrado). a su vez esas palabras están seguidas de un número: 1, 2, 3, n.
tenés que ir agregando campos y criterios, de acuerdo a tus necesidades, como por ejemplo:

Selection.AutoFilter Field:=1, Criteria1:="2", Field:=2, Criteria1:="word"

en la sentencia de arriba tengo a field1 y field2... si hubiese necesitado agregar otro filtrado, simplemente pongo field3 o el field que sea (no tienen por que estar correlativos)
y en en este ejemplo filtré el código 2 del campo y a "word" del campo 2
¿Se entiende? Otra línea: ahora filtro los datos de la primer, segunda y quinta columna:

Selection.AutoFilter Field:=1, Criteria1:="2", Field:=2, Criteria1:="word", Field:=5, Criteria1:="blog"

colocas el nro de campo (field) y luego el criterio de filtrado (valor a buscar) del mismo.
cualquier cosa me avisas y te armo otro ejemplo.
un abrazo

Anónimo dijo...

Muy interesante tu publicación.
Una pregunta:

Cuando aplico un filtrado con el autofiltro en la parte inferior de excel aparecen la cantidad de filas que fueran afectadas por el filtrado.

Existe alguna forma para obtener ese valor por medio de una macro.

Saludos

Damian Omar Silva dijo...

mirá: hay una forma muy sencilla con funciones, sin llegar a las macros:
supongamos que tenes la tabla a la cual le aplicarás el autofiltro en el rango A1:D20.
O sea: cuatro campos y 19 registros, ya que en la primer fila están los encabezados. ¿bien?
Te vas a la celda F1 y colocas esta función:
=SUBTOTALES(3;A2:A20)
y listo, cada vez que filtres esa función te devolverá la cantidad de elementos encontrados.
Fijate que el segundo argumento comienza en A2, es decir que NO incluyo el encabezado.
El primer argumento (3) hace referencia la función CONTARA()... si buscas en la ayuda de excel sobre SUBTOTALES() verás los 7 argumentos disponibles. creo que ese es el que mejor se ajusta a este caso.
si lo necesitas si o si con macros avisame que armamos algo.
un abrazo

Damian Omar Silva dijo...

disculpame, SUBTOTALES() acepta 11 valores posibles en su primer argumento, no 7.

Damian Omar Silva dijo...

bueno, terminemos bien... jajaa, ya que estoy te paso la macro, que hace exactamente lo mismo: utiliza a SUBTOTALES, con las WorksheetFunctions de Excel:

Sub CountFilter()
res = Application.WorksheetFunction.Subtotal(3, Range("a2:a20"))
MsgBox res
End Sub

en el ejemplo de arriba muestro el resultado (res) en un MsgBox, pero vos podes colocarlo en un form, una celda, etc, etc, etc.
avisame si te sirvió.
un abrazo

luisa fernanda gomez Criales dijo...

Hola mi nombre es luisa fernanda, tengo un caso parecido a lo del autofiltro pero lo necesito filtrar por tres campos seleccionados por lista desplegable, que al seleccionar los tres items me los filtre y genere los registros que coincidan con esas tres condiciones. me permito adjuntar el codigo aver que tengo mal. cualquier cosa mi correo es: luisa.criales@gmail.com

Sub BuscarDatos()
'Consultar Fecha ingreso, Valor ingresado, Tipo de gasto
Dim FechaIngreso As Date
Dim ValorIngresado as long
Dim TipoGasto as String
Criterio1 = "=*" & Range("FechaIngreso") & "*"
Criterio2 = "=*" & Range("ValorIngresado") & "*"
Criterio3 = "=*" & Range("TipoGasto") & "*"
uf1 = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
uf2 = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
uf3 = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
'Range("A2:Z" & uf1).ClearContents
Range("A2:Z" & uf1).AutoFilter Field:=2, Criteria1:=criterio1, Operator:=xlAnd
Range("A2:Z" & uf2).AutoFilter Field:=11, Criteria1:=criterio2, Operator:=xlAnd
Range("A2:Z" & uf3).AutoFilter Field:=12, Criteria1:=criterio3, Operator:=xlAnd
Range("K1").Select
Range("L1").Select
Range("M1").Select
End Sub

Gracias!!!

Damian Omar Silva dijo...

luisa: me parece que tu macro no funciona correctamente por culpa del campo "fecha". Fijate en el ejemplo que doy dentro del post: convierto esa fecha a formato "yanqui": mm/dd/yyyy (mes, dia, año). Otra cosa: en mi ejemplo no uso ateriscos para las fechas.
Y no uses tres variables para determinar la ultima fila de la tabla: con una sola alcanza. Ej:
Uf = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1

y luego usas Uf para todos los rangos. ¿Se entiende?
Entonces: primero le das el formato sajón a la fecha (mes, dia y año, como en el ejemplo), quitas los ateriscos del filtro en donde usas esa fecha y, por último, utiliza una sola variable para determinar el fin de la tabla.
¿por que le sumas 1? eso agrega un registro en blanco... ojo.
Gracias por tu mensaje y cualquier cosa me avisas

luisa fernanda gomez Criales dijo...

HOla, soy luisa otra vez, tengo el codigo modificado de acuerdo como creo que te lo entendi:

Sub BuscarDatos1()

Dim Fecha As Long

criterio = "=" & Range("Fecha") & ""
uf1 = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
Range("A2:Z" & uf1).AutoFilter Field:=2, Criteria1:=criterio, Operator:=xlAnd
Range("K1").Select

End Sub

no se si lo estoy haciendo bien a la celda donde esta la fecha el cambie el formato de fehca por MM/DD/AA, pero me sigue arrojando 0 registros, que puedo estar haciendo mal?

Gracias

Damian Omar Silva dijo...

No, no tenes que modificar el formato de la celda... ya que es solo eso: un formato... internamente Excel lo sigue leyendo igual. Una cosa es el contenido de la celda y otra es el formato que se le aplica.
Yo lo logro con macros, así:
Fecha = Month([d1]) & "/" & Day([d1]) & "/" & Year([d1])

adapta ese código a la celda en donde tienes la fecha, debería funcionar sin problemas
suerte y cualquier cosa me avisas.

Publicar un comentario

Regresar a la Pagina de Inicio

ENTRADAS MAS RECIENTES (ULTIMAS 10)


las + vistas

10 ULTIMOS COMENTARIOS DE MIS LECTORES

Free counters!
blog de periodismo




GRAFICA RIO BRAVO
Serigrafia-Offset
Rosario - Santa Fe - Argentina
TE: 0341 4664028