Actualización: modificar tabla de Excel mediante ListBox con datos filtrados

El 7-jul-12 había publicado un ejemplo que te permite pasar datos de una tabla de Excel a un objeto ListBox para después hacer modificaciones a los registros, así como poder eliminar los mismos.

En esta actualización añado un TextBox donde se podrá ingresar un texto para que los datos mostrados sean filtrados por ese texto.

Sugerencia: el ejemplo puede ser modificado para que tenga más prestaciones, lo cual podría convertirse es una aplicación en forma. Yo sólo dejo el ejemplo básico con el afán de que alguien lo pueda modificar a sus necesidades.

Formulario

image

Código del botón filtrar

Private Sub CommandButton5_Click()
On Error GoTo Errores
If Me.txtFiltro1.Value = "" Then Exit Sub
    Me.ListBox1.Clear
    j = 1
    For i = 1 To 18
        If Cells(i, j).Offset(0, 2).Value = CInt(Me.txtFiltro1.Value) Then
        Me.ListBox1.AddItem Cells(i, j)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
Else
End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation, "EXCELeINFO"
End Sub

:: Descargar el ejemplo

You may also like...

37 Responses

  1. Raúl says:

    Hola Sergio estuve viendo este ejemplo, que me parece buenisimo.!. Veo que al seleccionar un registro y querer modificarlo o eliminarlo no trae el seleccionado sino el primero de los registros (el que esta en A2). Soy novato en el tema e intente algunas cosas para solucionarlo pero no pude.
    Por favor cuando lo soluciones me avisas.
    Muchas GRacias por difundir tus conocimientos.!!

    • Que tal Raúl:

      Revisé lo que comentas, pero no encuentro el error que comentas.

      El procedimiento para manejar el formulario es el siguiente:

      Abres el formulario con el botón
      Haces un filtro por edad, por ejemplo 20.
      Cuando te genera la lista de opciones encontradas presionas elijes cualquiera y validas que en la hoja ese registro esté seleccionado.

      Hice varias pruebas y si me funcionó.

      Quedo de tus comentarios.

      • Raúl says:

        Hola Sergio, en primer lugar Gracias.
        Lo baje y lo ejecuto desde un Excel 2003, no se si eso influye, Ademas para que corra el Textbox1 debo agregar: On Error Resume Next.
        Lo baje nuevamente y una vez que selecciono el registro cualquiera que seleccione siempre trae el que esta en la fila 2.

        Gracias.

      • Raúl says:

        Sergio disculpa, pero ademas el botón “Abrir Lista” no me funciona. Creo te refieres a él en tu respuesta.

    • Seguramente tienes las macros deshabilitadas. Ve a Menú Herramientas, macros, seguridad, activa las macros, cierra Excel y lo vuelves a abrir.

      • Raúl says:

        Gracias Sergio. Las macros están con seguridad media, es decir que al abrir el archivo consulta si habilito las macros y efectivamente las habilito por eso desde VBA presionando Alt+F11 selecciono el formulario y lo ejecuto llego ok hasta que despliega los datos. Cuando selecciono uno de ellos y lo quiero eliminar o corregir y siempre me trae el primer registro.

    • Hola Raúl. Encuentro tu problema muy raro, por que ya probé el ejemplo en Office 2003 y funciona perfectamente.

      Le hiciste algunas modificaciones, o tienes en tu PC algún software especial o restricciones del sistema ??

  2. Charly says:

    Muchas gracias me ha ayudado muchísimo, saludos y adelante.

    • Raúl says:

      Como comente lo abro con Excel 2003 y sale un cuadro que dice:Este archivo se creo en una versi[on m[as reciente de MS Excel. El archivo se haconvertido a un formato que se pueda trabajar pero se han encontrado los siguientes problemas: el archivo se ha abierto en modo de solo lectura para proteger el archivo original.
      Los controles active X no inicializados no se pueden abrir en esta version de Excel.
      Si con esto pueden indicarme cual es el problema les agradezco de antemano.

      • Raúl, aquí es muy importante validar que tengas Excel 2003 con todas las actulizaciones y el Service Pack instalado. Te comento que probé tanto la versión del archivo para 2010 como para 2003 y me funciona bien.

        Por favor revisa lo que te comento, que tengas tu Office actualizado. De ser posible reinstala tu Office y al momento de la instalación elije todos los componentes para su instalación.

  3. Jose says:

    Hola que tal, me puedes explicar un poco mas elcodigo ya que soy nuevo en esto,
    esta parte no le entiendo como selecciono que columna agarrar por ejemplo si quiero agarrar la primera ?

    If Me.txtFiltro1.Value = “” Then Exit Sub
    Me.ListBox1.Clear
    j = 1
    For i = 1 To 18
    If Cells(i, j).Offset(0, 2).Value = CInt(Me.txtFiltro1.Value) Then
    Me.ListBox1.AddItem Cells(i, j)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 1) = Cells(i, j).Offset(0, 1)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 2) = Cells(i, j).Offset(0, 2)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 3) = Cells(i, j).Offset(0, 3)
    Else
    End If

    EN MI CASO tengo estas columnas

    Id_Empleado Empleado Dpto Permiso Fecha CIudad

    • Para la primera columa y además con las columnas que mencionas el código debe ser este:

      If Cells(i, j).Value = CInt(Me.txtFiltro1.Value) Then
      Me.ListBox1.AddItem Cells(i, j)
      Me.ListBox1.List(Me.ListBox1.ListCount – 1, 1) = Cells(i, j).Offset(0, 1)
      Me.ListBox1.List(Me.ListBox1.ListCount – 1, 2) = Cells(i, j).Offset(0, 2)
      Me.ListBox1.List(Me.ListBox1.ListCount – 1, 3) = Cells(i, j).Offset(0, 3)
      Me.ListBox1.List(Me.ListBox1.ListCount – 1, 4) = Cells(i, j).Offset(0, 4)
      Me.ListBox1.List(Me.ListBox1.ListCount – 1, 5) = Cells(i, j).Offset(0, 5)

      Saludos !!

  4. j0lvr says:

    Gracias por la info solo me faltaba esto para seguir con mi proyecto…. Eres un duro amigo.

  5. Jonathan says:

    Hola muy agradecido por tu ayuda con las explicaciones y los ejemplos que se tiene en tu blog…. de nuevo mil gracias si q eres genial

  6. juliana says:

    hola sergio…
    tu ejemplo esta super…
    pero he tratado de hacerle unas modificaciones al codigo y la verdad no eh podido, en mi caso solo tengo dos columnas, y deseo que me filtre por la columna 1… me explicas un poco mas tu codigo porfavor?
    Gracias

    • Sergio Alejandro Campos says:

      Son varios cambios:

      En el formulario buscar reemplaza la línea
      If Cells(i, j).Offset(0, 2).Value = CInt(Me.txtFiltro1.Value) Then
      por esta
      If Cells(i, j).Value = CInt(Me.txtFiltro1.Value) Then

      Las siguientes lineas hay que comentarlas o borrarlas
      Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
      Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)

      En el formulario Modificar hay que ponerle un 2 a la siguiente línea
      For i = 1 To 2

  7. Gerardo says:

    Hola sergio….amigo tu página esta excelente….gracias por la info

    Ok me ha encantado este ejemplo, quiero aplicarlo al proyecto que estoy llevando que es de contabilidad

    mis campos son:

    ID-DIA-MES-AÑO-CTA-DESCRIPCION-REFERENCIA-DEBITO-CREDITO-DEPARTAMENTO-PAIS-FAMILIA-PRODUCTO

    debo hacer el filtro por CTA (CUENTA) y por MES

    Mi hoja que contiene la base de datos que capturo se llama “BD” y va desde “A3” hasta “M20”

    los datos a filtrar lo hago desde un combobox que contiene la lista de las cuentas y otro que contiene la lista de los meses.

    Comenze a modificar tu codigo asi:

    Sheets(“BD”).Select
    Me.ListBox1.Clear
    j = 6
    For i = 3 To 20
    If Cells(i, j).Offset(0, 2).Value = Me.cmb_cta.Value Then
    Me.ListBox1.AddItem Cells(i, j)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 1) = Cells(i, j).Offset(0, 1)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 2) = Cells(i, j).Offset(0, 2)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 3) = Cells(i, j).Offset(0, 3)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 4) = Cells(i, j).Offset(0, 4)
    End If
    Next i

    plz..ayudame con esto hermano…

    saludos…

    • Sergio Alejandro Campos says:

      Qué tanto es tu nivel de Excel y vba, ya que prefiero orientarte con tu necesidad.

      Me gustaria que comenzaras adecuando el ejemplo a tu archivo y cuando lo tengas me lo compartes y vemos detalles.

  8. julian mauricio jimenez garcia says:

    hola Sergio, necesito de tu ayuda, modifique el archivo para buscar datos que necesito en un archivo de excel.
    pero para filtrarlo o buscar el dato debe ser exacto al de excel eemplo si necesito buscar ihpone 16 gb negro tengo que poner toda la cadena, que modifico para que al poner iphone me devuelva todo don dice iphone por ejemplo

    • sergioacamposh says:

      Es una muy buena consulta la que haces.

      Según mi ejemplo, dirígete al código del botón Filtrar y reemplaza el texto

      If Cells(i, j).Offset(0, 2).Value = CInt(Me.txtFiltro1.Value) Then
      Por este

      If LCase(Cells(i, j).Offset(0, 2).Value) Like “*” & LCase(Me.txtFiltro1.Value) & “*” Then

      Saludos!!

  9. Saryio SD says:

    Buenas Sergio, lo primero felicitarte por este blog el cual a mi personalmente y seguro que a muchos mas nos ayuda a entender y utilizar de forma eficiente Excel.
    La verdad es que tu ejemplo me sirvió como base de una base de datos que estoy creando el problema es que e ido modificandolo (con tu permiso jeje) y e llegado a algunos puntos muertos…, te dejo mi correo electrónico para poder enviarte un ejemplo y clarificarte mejor mis problemas, no tendría inconveniente en colgar posteriormente mi ejemplo para ayudar a otros, pero yo no puedo por aquí

    Muchas gracias de antemano

    MI correo es saryio@gmail.com

  10. Ignacio says:

    Hola Sergio, habría la posibilidad de hacer un filtro pero en vez de un número (en este caso la edad) mediante un texto (el nombre de una persona por ejemplo? y si es posible, ¿que habría que modificar respecto al tuyo?

    Gracias

  11. Maria Del Socorro Toledo says:

    Hola Sergio! Esta publicación me ha casi resuelto la vida! Mil gracias por compartir tus conocimientos 🙂 Me gustaría poder hacer un filtro pero en lugar de número que fuera por texto y número como un código de cliente como CST123 tengo como cuatro días pensando y buscando y no he logrado darle al clavo… qué tendría que cambiar con respecto a tu archivo?
    Te agradezco muchisimo tu ayuda
    Mary

  12. hame says:

    Hola Sergio, he adaptado tu excelente ejemplo a mis necesidades pero cuando deseo firltrar un numero de mas de cinco digitos no lo consigo salta al error: No se encuentra ejemplo: deseo filtrar el numero 9999 lo encuentra pero el 99999 o el 999999 salta al error y al contrario de lo que pide sergioacamposh el filtrado debe ser exacto. Puedes colaborarme para lograr esto gracias.

  13. Karen Ramos says:

    necesito tu ayuda urgente contesta porfavor

  14. Fredy says:

    tengo un listbox con 11 columnas las seleccionar un registro filtrado para poder codificarlo se detiene en el siguiente código:(Sheets(“Hoja3”).Range(“IDFILTRNEUMINST”).Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate)

    adjunto una foto del evento inicial ice del listbox.

    Private Sub ListBox1_Click()

    ‘Activar la celda del registro elegido

    Range(“a2”).Activate

    Cuenta = Me.ListBox1.ListCount

    For i = 0 To Cuenta – 1

    If Me.ListBox1.Selected(i) Then

    ‘MsgBox Me.ListBox1.List(i)

    Valor = Me.ListBox1.List(i)

    Sheets(“Hoja3”).Range(“IDFILTRNEUMINST”).Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate

    End If

    Next i

    ‘Fila = Me.ListBox1.ListIndex + 2

    ‘For i = 1 To 4

    ‘ Cells(Fila, 1).Activate

    ‘Next i

    End Sub

  15. Mercurio Mo says:

    Hola.
    He revisado tus posts en busca del error que atormenta mi trabajo y que describo en el siguiente video:

    Sucede que al utilizar el ListBox para buscar un registro y seleccionarlo, no me activa la celda correspondiente y por lo tanto al presionar el botón de modificar, me carga otros datos en el formulario.

    Aquí está mi código:

    Private Sub CommandButton6_Click()
    FModificar.Show

    End Sub

    ‘Cambia el TextBox con cada cambio en el Combo

    Private Sub cmbEncabezado_Change()
    Me.lblFiltro = “Filtro por ” & Me.cmbEncabezado.Value
    End Sub

    ‘Cerrar formulario
    Private Sub CommandButton2_Click()
    Unload Me
    End Sub


    ‘Mostrar resultado en ListBox
    Private Sub CommandButton5_Click()
    On Error GoTo Errores
    If Me.txtFiltro1.Value = “” Then Exit Sub
    Me.ListBox1.Clear

    Columna = Me.cmbEncabezado.ListIndex

    j = 1
    Filas = Range(“a1”).CurrentRegion.Rows.Count
    For i = 2 To Filas
    If LCase(Cells(i, j).Offset(0, CInt(Columna)).Value) Like “*” & LCase(Me.txtFiltro1.Value) & “*” Then
    Me.ListBox1.AddItem Cells(i, j)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 1) = Cells(i, j).Offset(0, 1)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 2) = Cells(i, j).Offset(0, 2)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 3) = Cells(i, j).Offset(0, 3)
    Else
    End If
    Next i
    Exit Sub
    Errores:
    MsgBox “No se encuentra.”, vbExclamation, “EXCELeINFO”
    End Sub

    ‘Activar la celda del registro elegido
    Private Sub ListBox1_Click()
    Range(“a2”).Activate
    Cuenta = Me.ListBox1.ListCount
    Set Rango = Range(“A1”).CurrentRegion
    For i = 0 To Cuenta – 1
    If Me.ListBox1.Selected(i) Then
    MsgBox Me.ListBox1.List(i)
    Valor = Me.ListBox1.List(i)
    Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
    End If
    Next i
    End Sub

    ‘Dar formato al ListBox y traer los encabezados de la tabla
    Private Sub UserForm_Initialize()

    Sheets(“Puestos”).Select
    Range(“A2”).Select
    For i = 1 To 4
    Me.Controls(“Label” & i) = Cells(1, i).Value
    Next i

    With Me
    .ListBox1.ColumnCount = 4
    .ListBox1.ColumnWidths = “60 pt;60 pt;60 pt;60 pt”
    .cmbEncabezado.List = Application.Transpose(ActiveCell.CurrentRegion.Resize(1).Value)
    .cmbEncabezado.ListStyle = fmListStyleOption
    End With
    End Sub

    Si alguien pudiera ayudarme lo agradecería mucho.

  1. October 10, 2012

    […] Actualización: modificar tabla de Excel mediante ListBox con datos filtrados […]

Leave a Reply

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

%d bloggers like this: