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

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
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.
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.
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.
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 ??
Muchas gracias me ha ayudado muchísimo, saludos y adelante.
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.
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 !!
Gracias por la info solo me faltaba esto para seguir con mi proyecto…. Eres un duro amigo.
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
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
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
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…
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.
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
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!!
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
Que tal.
Para que todos aprendamos, prefiero que sigamos la conversación por aquí. Si gustas puedes compartirme tu archivo desde la nube, ya sea tengas Skydrive, Dropbox, Drive, etc.
Perfecto, si es mas por enseñarte el archivo, de que forma puedo compartir el archivo contigo mediante dropbox
Gracias por tu atencion
Revisando tu archivo, veo que sí tomaste algunos códigos de mi ejemplo, pero otros no, los cuales hacen que no funcione correctamente tu archivo.
Te sugiero:
1. No cargar el ListBox de datos desde el inicio, ya que la propiedad Clear no funcionará cuando uses el filtro.
2. Para este ejemplo los encabezados en el ListBox, sino con Labels o con TextBoxes.
Le hice alguna modificaciones a tu archivo. Lo demás resta que lo detalles.
https://www.dropbox.com/s/nw64kqbqvkzkhg9/PRUEBA3%20ListoBox.xlsm
Con respecto al ToggleButton, no creo que sea el mejor control, ya que este control es como tipo ON/OFF.
Aún así, te recomiendo leas mi artículo acerca del tema para que tengas más armas sobre cómo usarlo. http://blogs.itpro.es/exceleinfo/2013/07/30/uso-de-control-togglebutton-con-excel-vba/
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
Hay que usar el comodín LIKE.
https://www.dropbox.com/s/q8j0w4cao6e4j1z/Modificar%20datos%20mediante%20ListBox%20FILTRO%20texto%20con%20Comodin%20Like.xlsm
no existe el archivo en drop no puedo encontrarlo ayudame porfis
necesito hacer lo mismo que el pero no puedo
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
Hay que usar el comodín LIKE.
Descarga este archivo con la modificación.
https://www.dropbox.com/s/q8j0w4cao6e4j1z/Modificar%20datos%20mediante%20ListBox%20FILTRO%20texto%20con%20Comodin%20Like.xlsm
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.
necesito tu ayuda urgente contesta porfavor
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
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.
Ya revisaste este artículo? http://www.exceleinfo.com/formularios-para-bsqueda-alta-baja-y-actualizacin-de-registros-en-excel/