Ir al contenido principal

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

Comentarios

  1. 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

    ResponderEliminar
  2. 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

    ResponderEliminar
  3. 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

    ResponderEliminar
  4. 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

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

    ResponderEliminar
  6. 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

    ResponderEliminar
  7. 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!!!

    ResponderEliminar
  8. 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

    ResponderEliminar
  9. 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

    ResponderEliminar
  10. 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.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

funciones: convertir numeros a letras con excel

En realidad hace tiempo que vienen consultándome sobre esto... quizás cinco o seis años . Debe ser una de las funciones mas buscadas de Excel, por lejos: la posibilidad de escribir: 1.534,63 y que en una celda aparezca magicamente "un mil quinientos treinta y cuatro c/15/100". Aquí les dejo una solución, basada en funciones , sin utilizar macros, la cual preparé exclusivamente para este Blog. A pesar de los millones de usuarios que requieren esta herramienta, no viene incorporada en Excel, debemos armarla nosotros mismos .  Luego de la imagen irá la explicación de como llegué a lograr esto, dado que es un proceso medianamente complejo , que utiliza tres o cuatro funciones básicas y requiere de varios pasos. así quedará nuestra planilla y siempre devolverá en letras el valor que ingresemos en A1 [+/-] Ver el resto / Ocultar Desde ya aclaro: esta no es " la forma " de hacerlo, simplemente es una mas, evitando el uso de macros. Sobre esta base, comencemos: 1) El núme

macros: como enviar mails desde Excel (vba)

Un gran amigo "on-line", Johan Moreno, de Colombia , me hizo llegar la inquietud de cómo enviar mails desde Excel . Si bien contaba con algunas líneas de código sobre el particular, decidí retomar mi ejemplo y adaptarlo mejor a las circunstancias. Hace unos minutos termino de remitirle un correo con la solución a Johan... desde Excel y con un archivo adjunto, mismo que transcribo a continuación para ayudar a todos con esta tarea. Veamos primero las dos formas principales de enviar mails: mediante Outlook o nuestro Web Mail ( yahoo, gmail, hotmail, etc, etc ) No soy usuario de Outlook en lo absoluto: no confío en los agujeros de seguridad que continuamente aparecen y, por otro lado, t eniendo a mi alcance una herramienta tan poderosa (y gratuita) como Gmail, la cual ahora también permite sincronizar los mensaje con la Pc para verlos offline (deben activarlo en "google labs") ... no creo que me haga usuario ni hoy ni mañana. Igualmente mas adelante daré una solució

buscarv con varios resultados

Es de las preguntas mas recurrentes que he tenido: ¿se puede lograr que la función BUSCARV() devuelva varios resultados? Si recordamos el uso de esta función, sabremos que la misma buscar en valor en el rango especificado, retornando un solo resultado. Si en la tabla tenermos varios registros iguales BUSCARV() solo nos devolverá el primero de ellos, omitiendo el resto. Entonces ¿se puede? Bueno, aplicando otra técnica sencilla que se me ocurrió al intentar solucionar el planteamiento de un lector... si, puedo hacerlo.... pero sin usar BUSCARV(). la idea es que coloquemos en E1 el código del producto a buscar y a partir de E2 nos devuelva todas las coincidencias de la tabla. [+/-] Ver el resto / Ocultar Vamos a necesitar una columna "auxiliar" para llevar a buen término este proyecto. Con macros el tema sería mas sencillo, pero aquí la cuestión es resolverlo con las funciones de Excel, sin VBA. Paso a paso: Como primer medida chequeamos que valores de la columna A coincide co