Formulario de Filtro rápido, con macros en Excel

Nota del 09-abr-11: Se modifica el formulario del filtro, para que se permita elegir la columna que se desea filtrar (por solicitud de un usuario de los foros de www.todoexcel.com).
Los autofiltro en Excel son muy útiles y necesarios, así como los filtros avanzados, cuando queremos más de una condición para nuestro filtrado.
Pero muchas en muchas ocasiones lo que deseamos es un filtro rápido y sin complicaciones.
Para este propósito, desarrollé el siguiente formulario que, con sólo escribir los datos que necesitamos, “al cambio” realiza el filtrado.
Formulario en acción:
Código de la macro:
'--------------------------------------------------------------------------------------- ' Module : Módulo1 ' Author : Sergio A Campos H ' Date : 03/04/2011 ' Purpose : Filtro rápido '--------------------------------------------------------------------------------------- Sub EXCELeINFOFiltro() On Error Resume Next If frmFiltroRapido.txtCriterio.Value <> "" Then If frmFiltroRapido.chkInicio.Value = True Then Criterio = frmFiltroRapido.txtCriterio.Value & "*" Else Criterio = "*" & frmFiltroRapido.txtCriterio.Value & "*" End If ColFiltrar = ActiveCell.Column - ActiveCell.CurrentRegion.Column + 1 ActiveCell.CurrentRegion.AutoFilter Field:=ColFiltrar, Criteria1:=Criterio, Operator:=xlAnd Else Criterio = "" Selection.AutoFilter End If End Sub ' Sub AbrirFiltro() If TypeName(Selection) <> "Range" Then MsgBox "No hay celdas elegidas.", vbExclamation, "EXCELeINFO" Else If ActiveCell.CurrentRegion.Rows.Count < 2 Then MsgBox "No hay suficientes datos para realizar un filtrado.", vbExclamation, "EXCELeINFO" Else frmFiltroRapido.Show End If End If End Sub
Buen blog,
Muchas gracias. Se aporta lo que se puede.
HOLA..
MUY ITERESANTE TUS APORTES..TE ESCRIBO SI ME PUEDES COLABORAR CON ALGUNOS PROBLEMAS CON UNA MACRO Q ESTOY REALIZANDO SI ME PUEDES COLABORAR..GRACIAS DE ANTEMANO POR TU RESPUESTA
Con gusto.
Hola Sergio
Existe algun codigo que me permita buscar valores en una hoja de excel y mostrarlos en el textbox de un formulario.
Te refieres como al de Mostrar todo en el comando Buscar ?? Nunca lo he intentado, pero debería existir. Para qué motivo sería ??
Gracias por tu respuesta, te comento mi proyecto, actualmente tengo un un formulario donde se digitan una serie de datos que son almacenados a una hoja de excel, el registro se realiza atraves del formulario y este actualiza los datos en una hoja predeterminada para almacenar la información que digita el usuario. Por lo que se requiere crear un boton de busqueda que le permita al usuario consultar la información que se guarda en la hoja llamada base de datos y mostarsela en el formulario.
La verdad lo he visto aplicado, pero no puede tener acceso al codigo. Por lo que agradezco si conoces algun metodo que me ayude a solucionar mi problemas.
Adjunto el codigo utilizado en el boton de registro de formulario:
Private Sub Registro_Click()
If consecutivo.Value “” Then
If TextBox1.Value “” Then
If TextBox2.Value “” Then
If TextBox3.Value “” Then
If ComboBox4.Value “” Then
jballnav = Worksheets(“BaseDatos”).Range(“B1”).Value
Worksheets(“BaseDatos”).Cells(jballnav, 1).Value = consecutivo.Value
Worksheets(“BaseDatos”).Cells(jballnav, 2).Value = TextBox1.Value
Worksheets(“BaseDatos”).Cells(jballnav, 4).Value = TextBox3.Value
Worksheets(“BaseDatos”).Cells(jballnav, 5).Value = TextBox2.Value
Worksheets(“BaseDatos”).Cells(jballnav, 7).Value = ComboBox4.Value
consecutivo.Value = “”
TextBox1.Value = “”
TextBox3.Value = “”
TextBox2.Value = “”
ComboBox4.Value = “”
End If
End If
End If
End If
End If
End Sub
Te comparto un archivo que vi en un foro, donde tiene la funcionalidad de tu formulario, pero el mismo formulario también tiene una opción buscar. Espero que te sea de utilidad.
http://cid-4509feb32392c17c.office.live.com/self.aspx/Excel%20e%20Info/Formulario-Abraham%20Valencia.zip
Saludos !!
Muy buen aporte, gracias!! Sin embargo no me fue posible descargar el archivo el ejemplo, existe algún requerimiento en especial para hacerlo?
Si lo descargas desde Explorer, deberá abrírtelo en modo de Office live, y ahí hay un botón para descargar.
Sergio te agradezco!!! enormemente el aporte, es la solución que he estado buscando.
Me gustaria saber si es posible definir rangos de impresión en un combox? osea se cuenta con una lista que desplega 10 opciones diferentes en el combox y cuando se seleccione la alternativa numero 1(que contiene un rango de impresión de (A1:H23), LA opcion 2 cambiará su rango de (B1:J50) y asi sucecivamente se tienen 10 rangos de impresión diferentes, conoces algun metodo que me permita definir la impresion para cada rango de celdas y asociarlas a la lista del combox.
Agradezco tus comentarios.
José, he realizado un ejemplo donde el ComboBox recoje de una lista de celdas, diferentes rangos preestablecidos, y al presionar el botón, se cambia el rango de impresión dependiendo el que elijas de la lista.
El punto está en este código:
ActiveSheet.PageSetup.PrintArea = ComboBox1.Value
Te paso el link para que lo descargues y veas si te funciona.
http://cid-4509feb32392c17c.office.live.com/self.aspx/Excel%20e%20Info/EXCELeINFO%20-%20rangos%20de%20impresión%20en%20ComboBox.zip
Sergio el ejemplo esta mu bueno!!!, pero seria posible que en lugar de que el combox desplegue los rangos de impresión, cambiar esto por algun listado de codigo como por ejemplo: bod1, bod2, bod3, etc. y al momento de hacer la selección en la lista se identifique y se imprima el rango de impresión definido para cada opción de la lista de forma que se evite el uso del botón aplicar.
Ya que resulta mas práctico visualizar un listado de codigo o nombre, que recordar a que esta definido un rango de impresión de la lista de combox. Es posible realizarlo de esta forma, agradezco tus comentarios.
Saludos,
Creo captar lo que deseas: que se enlisten los rangos de impresión identificados por un nombre, para posteriormente, al elegirlo, se mande imprimir ese rango.
Te adjunto el ejemplo anterior con la modificación.
http://cid-4509feb32392c17c.office.live.com/self.aspx/Excel%20e%20Info/EXCELeINFO%20-%20rangos%20de%20impresión%20en%20ComboBox.zip
Sergio muchas gracias! por compartir el aporte del combox.
Es un gusto.
Sergio conoces algun metodo para desporteger el VB, encontre uno en un foro y te lo comparto, el punto esta en que no he logrado que funcione, si conoces algun metodo te agradezco.
Te adjunto el metodo:
“Paso 1:
Haz clic en inicio -> ejecutar
teclea lo siguiente
cmd
Se abrira una ventana del Simbolo de sistema
Paso 2:
teclea:
edit /70
Paso 3:
Selecciona tu archivo y lo abres. Nota importante: haz una copia del archivo original
Paso 4:
Busca el texto “DPB”, asegurate que existe inmediatamente atras de “GC=” y [Host Extender Info]
Paso 5:
Cambia “DBx” por “DPB”
Paso 6:
Guarda el Archivo
Paso 7:
Abre el archivo en Excel
Recibiras un mensaje de error, selecciona Si (Yes) o Aceptar
En este paso aun no podras accesar al proyecto
Paso 8:
Abre el Editor de Visual Basic
( Herramientas – Macro – Editor de Visual Basic )
PAso 9:
Abre las propiedades del proyecto
( Herramientas – Propiedades de VBProject)
Selecciona la pestaña “Proteccion”
Ingresa una contraseña y anotala
Paso 10:
Confirmalo con OK (Aceptar)
Paso 11:
Despues repite estos pasos y desactiva la casilla “Bloquear proyecto para la visualizacion” y borra los caracteres en la
contraseña asi como en confirmar contraseña.
Paso 12:
Guarda el proyecto (Boton Guardar)
Listo ! Ya tienes tu archivo para poder ver el proyecto completo.
Desgraciadamente no conozco ningún método para quitar contraseñas de vba.
Sergio me he apoyado en algunos aportes que se encuentran en el blog, en lo cuales estoy teniendo un problema con el siguiente codigo:
Private Sub CommandButton1_Click()
If TextBox1 = “torres” Then
Pass1.Hide
Unload INICIO
Application.Visible = True
Worksheets(“MENU”).Activate
Sheets(“MATRIZ”).Visible = True
Sheets(“MATRIZ”).Select
Range(“A1”).Select
Else
Pass1.Caption = “Password :Fail”
MsgBox “CLAVE NO AUTORIZADA”
TextBox1 = Empty
TextBox1.SetFocus
Pass1.Caption = “Password : ”
End If
End Sub
Lo que intento es que al momento de abrir el archivo, este cuenta cuenta con un auto_open que oculta el excel, con el Application.Visible = False y posteriormente carga los formularios habilitados, pero necesito que cuando se presione el boton que esta habilitado para trabajar en una hoja de calculo predeterminada descargue o oculte los formulario y se permita trabajar sin problema la hoja de calculo, pero el Application.Visible = True no funciona a que se puede deber esto o como se puede corregir.
Agradezco tus comentarios.
Saludos,
Hola! Sergio es posible que el formulario que confeccionaste para filtros rapidos, pueda filtrar dos criterios al mismo tiempo por ejemplo:
se tiene una lista de articulos y se desea filtrar los articulos obsoletos y el mes de ingreso, para estas dos condiciones el formulario contara con los detalles como un CheckBox para: articulos activos, articulos obsoletos, y articulos habilitados y un textbox o combox para los meses.
Es posible lograr esto?
Qué tipo de error te arroja ?? Ya que el código al parecer debería funcionar.
Te sugiero que en el Unload, en lugar de poner INICIO, que creo que es el nombre de form, mejor por Me (Unload Me).
Me ayudas con el error que te arroja, por favor.
Con respecto al formulario de filtro rápido, había agregado un combo para elegir la columna a filtrar, será cuestión de poner otro chekbox y otro textbox para filtrar otro criterio.
http://exceleinfo.wordpress.com/2011/04/03/formulario-de-filtro-rpido-con-macros-en-excel/
Sergio he intentado lo que recomiendas y no he tenido exito, el codigo que estoy utilizando en el boton del form es el siguiente:
Private Sub MENU1_Click()
INICIO.Hide
Unload Me
Application.Visible = True
MENU.Show
Worksheets(“Reporte”).Visible = True
Application.Visible = True
Worksheets(“Reporte”).Select
End sub
Lo que sucede es que al intentar acceder a la hoja reporte, cierra la aplicación de excel completamente, cuando la intrucción le pide hacerlo visible. Lo que genera que tenga que volver abrir el libro, para poder visualizar la hoja y esto notifica que el libro ya se encuentra abierto.
He utilizado las intrucciones en los form: Hide y Unload Me y nada me puedes ayudar a identificar que error estoy cometiendo.
Gracias
Aplico el código que utilizas y sí me funciona. Te tengo algunas preguntas:
Qué objeto es INICIO, qué objeto es MENU, qué código utilizas para ocultar Excel ??
Sergio estos son los codigos:
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.Visible = False
INICIO.Show
End Sub
Para abrir el form INICIO, y cuando esta activado se ejecuta:
Private Sub UserForm_ACTIVATE()
Application.Visible = False
End Sub
Private Sub UserForm_Initialize()
Worksheets(“MENU”).Visible = True
Worksheets(“RINV”).Visible = True
Worksheets(“Limpieza”).Visible = True
Worksheets(“BaseDatos”).Visible = True
Worksheets(“ET2”).Visible = True
Worksheets(“ET1”).Visible = True
Worksheets(“Reporte”).Visible = True
DTFecha.Text = Format(Date, “dd/mm/yy”)
DTHora.Text = Format(Now, “hh:mm:ss AM/PM”)
End Sub
El form INICIO cuenta con un boton para ocultar el form INICIO y habilitar la hoja de calculo “Reporte” que es una hoja contenida dentro del libro y donde se ejecuta un form llamado MENU el cual realizado una serie de calculos al que esta destinado. Pero no estoy logrando que desde el form INICIO una vez que se da el click al boton muestre el excel.
Espero tus comentarios.
Saludos,
La instrucción para ocultar la aplicación no la utilices dos veces, ya que la tienes cuando se ejecuta el form, como cuando se activa. Además de que ScreenUpdating no es necesario utilizarlo antes de mostrar un Form. Si al ocultar el Form INICIO quieres mostrar el form MENU, mejor ciérralo y entonces muetra el MENU.
Sergio es posible agregar una validación a un grafico de excel, de forma que cuando se seleccione una opción compre los datos, me refiero que tengas dentro de la lista de validación por ejemplo los años: 2009, 2010 y 2011 y los valores seran las ventas mensuales para cada año, pero deseo que tanto en la hoja de calculo(en celdas predeterminadas) como en el grafico se cuente con la validación o combox que me permitan escoger el año que deseo analizar, osea quiero compara las ventas del 2009 vs el 2011.
Como puedo lograr esto?
Utiliza el comando de Excel de gráfico dinámico.
Sergio muchas gracias! por la sugerencia, aplicaré los cambios que indicas.
Es posible aplicar un minimizar y maximizar un form? por default solo esta el exit, conoces algun metodo para lograr esto, te agradezco si puedes compartirlo.
Saludos,
Lo acabo de publicar.
Sergio es posible cambiar una imagen en el cuadro de imagen de un form? cada vez que el valor del textbox cambie, a nivel de la hoja de calculo conozco el metodo para hacerlo pero nunca he intentado en VBA. Conoces alguna forma de hacer posible esto.
Agradezco tus comentarios.
Saludos,
Amigo José, te invito a que formes parte de los foros de http://www.todoexcel.com, en el que participo con regularidad. Como veo que tienes muchas preguntas acerca de Excel-vba, qué mejor que las expongas ahí y así todos los participantes se benefician de las respuestas. Saludos.
Estimado Sergio
Gracias por esa macro
Algo que hice fue invertir en el cuadro de diálogo primero la columna y luego pongo el valor a buscar, el resultado es que se va filtrando mientras vas tipeando la palabra o el valor…le da una apariencia más “2.0”. Es cosmético pero no quise dejarlo de compartir.
Saludos,
Yo siempre digo que los diseños siempre deber ser prácticos y funciones, sin perder la estética, además de código funcionales. Saludos.
Estimado Sergio, buen blog y excelente posts los que subes, este tipo de filtro es de gran utilidad para mi, sin embargo, no logro hacerlo funcionar correctamente, y dado que no puedo descargar el archivo debido a que lo tienes alojado en un sitio de almacenamiento remoto (por politica tengo bloqueado los accesos a este tipo de sitios) me di a la tarea de reproducirlo manualmente, no obstante pienso que en mi formulario el combobox me sobra. Lo que tengo es lo siguiente (le hice algunas adecuaciones adicionales):
Sub AbrirFiltro()
If TypeName(Selection) “Range” Then
MsgBox “No hay celdas elegidas.”, vbExclamation, “EXCELeINFO”
Else
If ActiveCell.CurrentRegion.Rows.Count < 2 Then
MsgBox "No hay suficientes datos para realizar un filtrado.", vbExclamation, "EXCELeINFO"
Else
frmFiltroRapido.Show
End If
End If
End Sub
Este es el codigo del formulario:
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdOk_Click()
On Error Resume Next
If frmFiltroRapido.txtCriterio.Value “” Then
If frmFiltroRapido.chkInicio.Value = True Then
Criterio = frmFiltroRapido.txtCriterio.Value & “*”
Else
Criterio = “*” & frmFiltroRapido.txtCriterio.Value & “*”
End If
ColFiltrar = ActiveCell.Column – ActiveCell.CurrentRegion.Column + 1
ActiveCell.CurrentRegion.AutoFilter Field:=ColFiltrar, Criteria1:=Criterio, Operator:=xlAnd
Unload Me
Else
Criterio = “”
Selection.AutoFilter
Unload Me
End If
End Sub
Private Sub UserForm_Initialize()
Me.txtCriterio.Value = ActiveCell.Value
Me.chkInicio = True
End Sub
Al correr el formulario, me deja en blanco la BD, me oculta todos los valores, alguna sugerencia de que pueda estar mal en mi codigo?
Gracias.
Te he enviado el ejemplo para lo que adecúes.
Hola! Sergio
Necesito acudir a tu valiosa ayuda estoy intentando cargar una imagen a un form y la idea es que cuando se actualicen los datos en los diferentes textbox, lograr que tambien actualice la imagen en picturebox.
Me facilitaron el siguiente codigo: Imagen.Picture = LoadPicture(“C:santander.jpg”), pero aun no logro entender como hacer para adecuar la busqueda de la imagen cada vez que se actualicen los datos en el form, te agradezco si me puedes ayudar en este tema.
Entiendo que el codigo define la ruta de busqueda fuera del libro, y es lo más practico. Pero como seria cargar la imagen desde el mismo libro para cuando la cantidad de imagenes no es muy grande.
Espero tus comentarios, he buscado en diferentes parte solucionar esto pero no he tenido exito, espero encontrarlo en tu ayuda.
Saludos,
Jose
Ya consegui hacerlo funcionar, muchas gracias de cualquier forma.
Saludos y gracias por tan excelentes aportaciones.
Sergio el codigo del form es el siguiente:
Private Sub BUSCAR_Click()
On Error GoTo ErrorJBalladares
If TextBox1 = “” Then
MsgBox “Coloca algun dato para buscar”, vbOKOnly + vbInformation, “AVISO”
TextBox1.SetFocus
Exit Sub
End If
Sheets(“Hoja2”).Select
Set rango = Range(“B:B”).Find(What:=TextBox1, _
LookAt:=xlWhole, LookIn:=xlValues)
If rango Is Nothing Then
MsgBox “El dato no fue encontrado”, vbOKOnly + vbInformation, “AVISO”
TextBox1 = “”: TextBox1.SetFocus
Exit Sub
Else
TextBox2 = Range(“C” & rango.Row)
TextBox3 = Range(“D” & rango.Row)
TextBox4 = Range(“E” & rango.Row)
TextBox5 = Range(“F” & rango.Row)
End If
Exit Sub
ErrorJBalladares:
‘MsgBox Err.Description, vbCritical, “Error”
End Sub
Hola soy nuevo en esto de excel pero tengo un problemilla sera que me puedan ayudar estoy haciendo un reporte de un mes del 1 al 31 ejemplo Columna A Descripcion Columna B dia 1, Columna C dia 2 y asi hasta llegar al dia 31 al final un acumulado lo que requiero de mi reporte, esto lo he visto en algunos reportes que ponen el dia en una celda y automaticamente oculta todas las columnas y deja solo la indicada, me gustaria saber si alguien me puede brindar ayuda con mi problemilla
Gracias
Hola Sergio,
cordial saludo estube mirando,
– la macro que programaste en vbasic en el archivo en Excel “filtrado rapido”, podrias ser tan amable de resolverme la siguiente inquietud e indicarme como puedo hacer, -La captura de datos que filtraran el archivo en excel atraves list box, -Se puede Filtrar n atributos cojidos de un list box por medio de una macro ,me tome el atrevimiento de agregarte al msn espero me agreges y me puedas colaborar por que realmente toy perdido y eso es lo unico que me falta para terminar las macros mi msn es alberto.patino00@live.com espero tu respuesta. Gracias.
Podrías enviarme un archivo con más detalles, por favor.
Muy buena ayuda la que encontré en tu publicación. Lo tendría que adecuar a mi BDD que no tiene todas las celdas llenas y esto hace que funcione de manera diferente. ¿Podrías proporcionarme una dirección de correo o alguna forma de contacto para ponerme en comunicación contigo y me puedas prestar un poco de más ayuda? Gracias.
Buenos días.
Me da gusto que te sea de ayuda. Te comento que se hizo una actualización al ejemplo en cuestión, lo puedes encontrar en el post http://exceleinfo.wordpress.com/2012/03/04/exceleinfo-add-in-2-3-1-replanteando-el-filtro-rpido/
Me puedes contactar en twitter como @sergioacamposh o @exceleinfo
Saludos !!
Hola Sergio!, me gustaría ver los nombres de las columnas a filtrar en vez de el número de columna. ¿Qué debo cambiar?
Qué tal.
La versión más reciente de EXCELeINFO add-in ya viene con el nombre de los encabezados.
http://www.exceleinfo.com/descarga-exceleinfo-add-in-recomendado/
hola a todos
podrian darme una ayudadita
quiero filtrar entre fechas (fecha inicio y fecha de corte) para buscar datos
quiero filtrar en las fechas que hay en la columna G y la columna W (el filtro debe incluir las columnas G,I,K,M,O,Q,S,U,W)
osea que el filtro tendria que abarcar 9 columnas (sin tomar en cuenta las columnas H,J,L,N,P,R,T,V,X)
para saber por ejemplo cuantos datos ingrese en un mes.
un solo filtro para las 9 columnas, si es que se puede
que en un textbox se ingrese la fecha inicial y otro para la fecha de corte
otra cosa, me imagino que el listbox debe ser con rowsource porque tiene 24 columnas. para que a la hora de hacer el filtro me aparezcan los datos de las 24 columnas, si cada una de ellas tiene
y que el resultado del filtro se pueda copiar a otra hoja, asi como esta en el archivo para poder visualizar e imprimir, porfa
yo utilizo este codigo para filtrar pero solo una columna y lo que quiero es filtrar 9 columnas de una sola vez, con fecha inicial y fecha final
Private Sub TextBox1_Change()
‘activamos la hoja base
Sheets(“datos”).Activate
‘nos posicionamos en la celda a1
Sheets(“datos”).Range(“a1”).Select
‘limpiamos el listbox
ListBox1.RowSource = Empty
‘limpiamos la hoja3 donde se genera el filtro avanzado
Sheets(“datosm”).Range(“A:x”).Clear
‘limpiamos los campos de busqueda del filtro avanzado
Sheets(“datos”).Range(“z2:aw2”).ClearContents
‘le damos el ancho a las 3 columnas del listbox
‘ListBox1.ColumnWidths = “175 pt;118 pt;21 pt;25 pt;50 pt;36 pt;50 pt;50 pt”
‘en la celda e2 se transfiere lo que se escribe en el textbox1 en este caso el codigo
‘los asteriscos entre comillas son para que busque por cualquier letra que se ingres
‘y los signos & son para unir el asterisco con el valor del textbox
Sheets(“datos”).Range(“z2”) = “*” & TextBox1 & “*”
‘aqui realizamos el filtro avanzado
Range(“a1:x400”).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
“z1:z2”), copytorange:=Sheets(“datosm”).Range(“a1”), Unique:=False
‘mostramos el resultado del filtro avanzado en el textbox
ListBox1.RowSource = “datosm!a2:x400”
End Sub
espero me den una mano con esto
gracias