Home > Bases de datos, Excel, Formularios, vba > Formulario de Filtro rápido, con macros en Excel

Formulario de Filtro rápido, con macros en Excel

Twittear este post Compartir en Facebook

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

image

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:

image

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

:: Descargar ejemplo

  1. Jaime
    April 4, 2011 at 02:05

    Buen blog,

  2. OMAR
    April 7, 2011 at 22:40

    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

  3. Jose
    April 18, 2011 at 21:07

    Hola Sergio

    Existe algun codigo que me permita buscar valores en una hoja de excel y mostrarlos en el textbox de un formulario.

    • April 18, 2011 at 21:42

      Te refieres como al de Mostrar todo en el comando Buscar ?? Nunca lo he intentado, pero debería existir. Para qué motivo sería ??

      • Jose
        April 26, 2011 at 17:33

        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

      • April 26, 2011 at 22:23

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

  4. Claudio C.
    April 26, 2011 at 17:11

    Muy buen aporte, gracias!! Sin embargo no me fue posible descargar el archivo el ejemplo, existe algún requerimiento en especial para hacerlo?

    • April 26, 2011 at 22:03

      Si lo descargas desde Explorer, deberá abrírtelo en modo de Office live, y ahí hay un botón para descargar.

      • Jose
        April 27, 2011 at 20:30

        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.

  5. April 27, 2011 at 23:33

    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

  6. Jose
    April 28, 2011 at 19:21

    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,

  7. April 28, 2011 at 22:26

    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

    • May 11, 2011 at 18:36

      Sergio muchas gracias! por compartir el aporte del combox.

  8. May 11, 2011 at 18:47

    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.

  9. May 11, 2011 at 20:07

    Desgraciadamente no conozco ningún método para quitar contraseñas de vba.

    • Jose
      May 16, 2011 at 19:00

      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,

      • Jose
        May 16, 2011 at 19:09

        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?

      • May 17, 2011 at 21:03

        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.

      • May 17, 2011 at 21:10

        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.
        https://exceleinfo.wordpress.com/2011/04/03/formulario-de-filtro-rpido-con-macros-en-excel/

  10. Jose
    May 19, 2011 at 18:04

    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

    • May 19, 2011 at 20:14

      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 ??

      • Jose
        May 20, 2011 at 18:41

        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,

      • May 23, 2011 at 20:17

        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.

  11. Jose
    May 19, 2011 at 18:37

    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?

    • May 19, 2011 at 20:15

      Utiliza el comando de Excel de gráfico dinámico.

  12. Jose
    May 24, 2011 at 19:11

    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,

  13. Jose
    May 25, 2011 at 18:58

    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,

    • May 26, 2011 at 21:03

      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.

  14. June 18, 2011 at 10:31

    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,

    • June 20, 2011 at 21:53

      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.

  15. Claudio C.
    July 4, 2011 at 16:37

    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.

    • July 4, 2011 at 20:04

      Te he enviado el ejemplo para lo que adecúes.

      • Jose
        July 6, 2011 at 18:48

        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

  16. Claudio C.
    July 4, 2011 at 17:01

    Ya consegui hacerlo funcionar, muchas gracias de cualquier forma.

    Saludos y gracias por tan excelentes aportaciones.

  17. Jose
    July 6, 2011 at 18:51

    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

  18. Edgar Reyes
    February 10, 2012 at 18:01

    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

  19. Alberto
    February 23, 2012 at 08:40

    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.

    • sergioacamposh
      February 25, 2012 at 13:07

      Podrías enviarme un archivo con más detalles, por favor.

  20. March 13, 2012 at 22:08

    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.

  1. December 29, 2011 at 22:04

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s