Banner clix

jueves, 5 de septiembre de 2013

Macro y ejemplo: Aplicar filtros con botones y macros

Realizar filtros con botones y macro nos facilitará la elaboración de algunas consultas a tablas muy grandes cuando el usuario final no es usuario avanzado de excel. Cuando aplicamos autofiltros y se intenta aplicar algun filtro, vemos que puede no ser muy amigable al usuario, sobre todo si se trata de un usuario final no avanzado. Pero podemos hacerle la vida mucho mas sencilla

Public Sub AplicarFiltro()
Range("a2").AutoFilter
Range("a2").AutoFilter field:=2, Criteria1:=">5000"
End Sub

Con este código hacemos un filtro sencillo, la segunda linea elimina cualquier filtro que esté activo en el rango A2. En la tercera linea se indica como se creará el filtro, en este caso le decimos que se aplicara en la segunda fila contando desde A2 (en donde se aplicará el criterio sería B2), el criterio es valores mayores a 5000. El criterio siempre debe ir entre comillas a diferencia del campo field si lo escribimos directamente, si va como una variable como veremos mas adelante.


Sin embargo, hecho así solo complicamos mas la búsqueda de valores con un autofiltro, para poder facilitar esta aplicación a usuarios finales, debemos diseñar primero el formulario donde vamos a recibir los datos del autofiltro (puedes descargar el libro SIN MACROS en Google Drive o en SkyDrive)




Creamos una hoja similar, los botones se insertan en la pestaña programador > insertar y seleccionamos el botón en la parte de controles de formulario:



Si nos aparece la opción para escoger el macro, lo dejamos en blanco por el momento.

En esta hoja tenemos unos datos de ventas y horas laboradas de 5 trabajadores, queremos realizar filtros de forma eficiente y sin mayor complicación. Para evitar inconvenientes en los criterios y el operador, vamos a colocar una lista desplegable para que sea mas sencillo de manipulas estos campos. Primero seleccionamos la celda B2 vamos a la pestaña de datos y hacemos clic en validación de datos:


En la ventana que se abre, en el campo Permitir cambiamos de "cualquier valor" a "Lista", En el campo Origen escribimos Nombre; Ventas; Horas Laboradas así creamos tres items, uno para cada campo de la tabla que seria nombre, ventas y horas laboradas.


Ahora hacemos lo mismo con la celda B3, primero las seleccionamos, en la pestaña datos, clic en validación de datos y cambiamos de "cualquier valor" a "Lista", aquí vamos a colocar la primera parte del criterio, por ende llenamos la lista con Mayor a; Menor a; Igual a; Contiene siempre separando los items con punto y coma ( ; )


Ahora vamos con la parte del Macro, en la pestaña programador > Visual Basic, clic derecho en hoja1 > Ver código y utilizamos el siguiente código (puedes ver como activas los macros en este post)


Public Sub AplicarFiltro()
'pasamos los datos en las celdas del formulario a variables
campo = Range("b2").Value
'para el criterio, creamos una cadena
'el primer valor es el proveniente de la lista
'el segundo seria el numero por el que se filtrara
signo = Range("b3").Value
criterio = Range("c3").Value

'ahora necesitamos convertir los valores para aplicarlos al macro
'primero los campos, el valor escrito en la celda debe convetirse en
'en un numero para el campo, bien sea 1, 2 o 3
Select Case campo
Case "Nombre"
campo = 1
Case "Ventas"
campo = 2
Case "Horas Laboradas"
campo = 3
End Select

'ahora para el criterio vamos a armar todo el criterio de una vez
'especificado en las celdas correspondientes. el caracter & suma cadenas
'de texto en visual basic por decirlo de alguna manera
'el criterio contiene agrega asteriscos al criterio a ambos extremos para
'buscar en cualquier parte de la celda, si lo ponemos al final es que comienza
'con el criterio y al principio es que termina con ese criterio
Select Case signo
Case "Mayor a"
criterio = ">" & criterio
Case "Menor a"
criterio = "<" & criterio
Case "Igual a"
criterio = "=" & criterio
Case "Contiene"
criterio = "*" & criterio & "*"
End Select

'borramos el filtro activo
Range("a7").AutoFilter
'activamos el filtro con los valores actuales
Range("a7").AutoFilter field:=campo, Criteria1:=criterio
End Sub

Public Sub BorrarFiltro()
Range("a7").AutoFilter
End Sub
'esto es solo para borrar con un boton el filtro

Luego volvemos a la hoja de Excel y hacemos clic derecho sobre el boton Aplicar, si sale para modificar el nombre del boton, hacer clic derecho nuevamente sobre el borde y seleccionar la opción "Asignar macro" y escogemos el macro AplicarFiltro


Se repite esto mismo para el botón de borrar asignándole el macro BorrarFiltro y esta listo, puedes hacer las pruebas, el campo contiene es utilizado para buscar textos en una celda completa, por ejemplo puedes buscar "uan" y te dará como resultado Juan Perez, puede ser muy util para buscar en nombres de empresas o personas que no sabemos como han sido almacenadas.

A esto se le pueden añadir operadores lógicos utilizando xlOr y xlAnd para buscar con mas de un criterio, ademas podemos buscar con "comienza con" utilizando un asterisco al final del criterio al igual que "termina en" colocando el asterisco al principio del criterio. Hay muchas opciones y se puede explotar al máximo los filtros.

Puedes descargar el libro SIN MACROS en Google Drive o en SkyDrive

9 comentarios:

  1. Respuestas
    1. Solo debes copiar el macro en la pestaña de programador. El libro va sin macros para evitar ser captado como posible amenaza por los antivirus http://excelenempresas.blogspot.com/2013/07/tip-macros-que-son-y-como-activar-y.html

      Eliminar
  2. Buenas tardes ante todo muchas gracias por compartir: En el caso de no utilizar el desglosable de validación de datos de B2, pero si adicionar a esta celda otra continua por citar C2, pero que el campo de "horas trabajadas", sea "Fecha". ¿Cuál sería la instrucción?, algo similar a la formula "=O" , que bien buscas esto de C3 en el campo "Nombre" o el campo "Fecha".

    Gracias,

    ResponderEliminar
    Respuestas
    1. Hola que tal, no entiendo bien tu pregunta, que deseas hacer? el ejemplo es muy generico para que lo puedas adaptar a tus casos pero igualmente te puedo ayudar, solo que no entendi bien tu planteamiento. Saludos

      Eliminar
  3. una pregunta amigo si quisiera meter otro criterio en el ejemplo, pero que fuera con dos campos diferentes, como por ejemplo en el primero que me apareciera parte de una palabra "como lo tienes en el ejemplo" y en otro campo parte de otra palabra pero que te traiga nadamas por esos dos criterios aunque el primer campo no tiene lo mismo que el otro criterio del otro campo que buscas como modificarias tu trabajo amigo, me gustaria que me pudieras ayudar gracias

    ResponderEliminar
  4. una pregunta amigo si quisiera meter otro criterio en el ejemplo, pero que fuera con dos campos diferentes, como por ejemplo en el primero que me apareciera parte de una palabra "como lo tienes en el ejemplo" y en otro campo parte de otra palabra pero que te traiga nadamas por esos dos criterios aunque el primer campo no tiene lo mismo que el otro criterio del otro campo que buscas como modificarias tu trabajo amigo, me gustaria que me pudieras ayudar gracias

    ResponderEliminar
  5. Hola Tengo una duda en una macro de un filtro avanzado,como le hago para tomar como criterio una lista que se va cambiando el numero de elementos de esta lista,Por ejemplo a veces necesito que el rango sea a1.b5 y a veces el rango es a1,b10 y otras a1.b3 o sea que es variable y en la macro aparece fija

    ResponderEliminar
  6. Hola Tengo una duda en una macro de un filtro avanzado,como le hago para tomar como criterio una lista que se va cambiando el numero de elementos de esta lista,Por ejemplo a veces necesito que el rango sea a1.b5 y a veces el rango es a1,b10 y otras a1.b3 o sea que es variable y en la macro aparece fija

    ResponderEliminar
  7. Muchas gracias, muy bien explicado un abrazo desde Colombia.

    ResponderEliminar