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

You may also like...

48 Responses

  1. Jaime says:

    Buen blog,

  2. OMAR says:

    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 says:

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

      • Jose says:

        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

  4. Claudio C. says:

    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.

      • Jose says:

        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. 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 says:

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

  8. Jose says:

    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. Desgraciadamente no conozco ningún método para quitar contraseñas de vba.

    • Jose says:

      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 says:

        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/

  10. Jose says:

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

      • Jose says:

        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.

  11. Jose says:

    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?

  12. Jose says:

    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 says:

    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.

  14. 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,

  15. Claudio C. says:

    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.

      • Jose says:

        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. says:

    Ya consegui hacerlo funcionar, muchas gracias de cualquier forma.

    Saludos y gracias por tan excelentes aportaciones.

  17. Jose says:

    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 says:

    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 says:

    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.

  20. pedrink says:

    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.

  21. Ramses Sariol says:

    Hola Sergio!, me gustaría ver los nombres de las columnas a filtrar en vez de el número de columna. ¿Qué debo cambiar?

  22. ronald says:

    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

  1. December 29, 2011

    […] Formulario de Filtro rápido, con macros en Excel […]

Leave a Reply

Your email address will not be published. Required fields are marked *