Modificar datos de una tabla a través de un listbox
Tengo una base de datos en la cual a través de un filtro traigo los datos en un listbox. Necesito que, una vez seleccionado el registro que se pretende modificar, se presione un botón de comando denominado modificar y que lanza esos datos a otro formulario donde se puedan actualizar los datos. Una vez actualizados que los traslade a la hoja de datos.
¿Cómo puedo hacerlo? Lo he intentado de varias maneras pero no lo consigo.
1 respuesta
¿Esto es más o menos lo que quieres?, este es un simple ejemplo de como se puede hacer, ya que desconozco como esta estructurada tu información, te puede servir de base para adaptarlo a lo que quieres, lo único que no se es si funcione cuando tienes aplicado un filtro.
y estas son las macros
para el formulario con el listbox Private Sub CommandButton1_Click() modificar.Show End Sub Private Sub ListBox1_Change() Set DATOS = Range("pacientes") With ListBox1 Label6 = .Value Label7 = .List(Me.ListBox1.ListCount - 1, 1) Label8 = .List(Me.ListBox1.ListCount - 1, 2) Label9 = .List(Me.ListBox1.ListCount - 1, 3) Label10 = .List(Me.ListBox1.ListCount - 1, 4) Label11 = WorksheetFunction.Match(.Value, DATOS.Columns(1), 0) End With End Sub Private Sub ListBox1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Set DATOS = Range("A1").CurrentRegion matriz = DATOS DATOS.Name = "pacientes" With ListBox1 .Clear .List = matriz .ColumnCount = DATOS.Rows.Count End With End Sub
para el formulario modificar Private Sub CommandButton1_Click() Set DATOS = Range("pacientes") dato = TextBox1.Text With DATOS Set RENGLON = .Rows(Label7) End With With RENGLON .Select .Cells(1, 1) = dato .Cells(1, 2) = TextBox2.Text .Cells(1, 3) = TextBox3.Text .Cells(1, 4) = TextBox4.Text .Cells(1, 5) = TextBox5.Text End With Set DATOS = Nothing: Set RENGLON = Nothing End Sub Private Sub UserForm_Activate() With pacientes TextBox1.Text = .Label6 TextBox2.Text = .Label7 TextBox3.Text = .Label8 TextBox4.Text = .Label9 TextBox5.Text = .Label10 Label7 = .Label11 End With End Sub
Hola!
En primer lugar muchas gracias por responderme. Lo he probado pero no me sale... no sé si es porque estoy haciendo algo mal o por otra razón. Si quieres te puedo mandar la base de datos (sin datos) para que veas como está estructura y así te haces una idea....
Espero tu respuesta.
Gracias!
Sube tu información a un servicio de nube como google drive y pega el link aquí, lo ideal seria que fuera con la información filtrada además no tienen que ser datos reales puedes inventarte un ejemplo como la hoja de excel que yo subí
https://drive.google.com/open?id=1uOLqDJ1_rWoqwj1JwTg7IjJy-_r5n-9s
Buenos días de nuevo:
He subido el archivo a Google.drive. Te dejo el enlace arriba. Si tienes algún problema dímelo
Gracias!!
De hecho después de varias peripecias que tuve con tu código he aquí los resultados tu misma tenias la respuesta solo le faltaban unas líneas, en el formulario modificar borras todo lo que tengas y pones este código, pudo ser menos código solo que esta bastante revuelto tu formulario, te explico como funciona al momento que hace el filtro la macro en vez de señalar la celda como venia haciendo ahora señalara toda la columna y el formulario mostrar leerá esa selección cargando los datos en los campos para que puedan ser modificados, una vez hecho esto lo grabas en la hoja la macro lo hará sobre la fila que esta seleccionada.
Private Sub Btnregistrar_Click() Set DATOS = Selection With DATOS .Cells(1, 1) = TextBox14.Text .Cells(1, 2) = TextBox1.Text .Cells(1, 3) = TextBox2.Text .Cells(1, 4) = TextBox3.Text .Cells(1, 5) = ComboBox1.Value .Cells(1, 6) = ComboBox2.Value .Cells(1, 7) = TextBox4.Text .Cells(1, 8) = TextBox5.Text .Cells(1, 9) = TextBox6.Text .Cells(1, 10) = TextBox7.Text .Cells(1, 11) = ComboBox3.Value .Cells(1, 12) = ComboBox4.Value .Cells(1, 15) = ComboBox5.Value .Cells(1, 13) = TextBox8.Text .Cells(1, 14) = TextBox9.Text .Cells(1, 19) = TextBox13.Text .Cells(1, 16) = ComboBox4.Value .Cells(1, 17) = TextBox10.Text .Cells(1, 18) = TextBox11.Text .Cells(1, 19) = TextBox12.Text End With set datos=nothing End Sub Private Sub UserForm_Initialize() Set DATOS = Selection With DATOS TextBox14.Text = .Cells(1, 1) TextBox1.Text = .Cells(1, 2) TextBox2.Text = .Cells(1, 3) TextBox3.Text = .Cells(1, 4) ComboBox1.Value = .Cells(1, 5) ComboBox2.Value = .Cells(1, 6) TextBox4.Text = .Cells(1, 7) TextBox5.Text = .Cells(1, 8) TextBox6.Text = .Cells(1, 9) TextBox7.Text = .Cells(1, 10) ComboBox3.Value = .Cells(1, 11) ComboBox4.Value = .Cells(1, 12) ComboBox5.Value = .Cells(1, 15) TextBox8.Text = .Cells(1, 13) TextBox9.Text = .Cells(1, 14) TextBox13.Text = .Cells(1, 19) ComboBox4.Value = .Cells(1, 16) TextBox10.Text = .Cells(1, 17) TextBox11.Text = .Cells(1, 18) TextBox12.Text = .Cells(1, 19) End With set datos=nothing End Sub
y en el formulario buscar cambias lo que tengas en este modulo Private Sub Listbox1_Click por esto:
Private Sub Listbox1_Click() Range("a2").Activate Cuenta = Me.ListBox1.ListCount Set rango = Range("A1").CurrentRegion C = rango.Columns.Count For i = 0 To Cuenta - 1 If Me.ListBox1.Selected(i) Then Valor = Me.ListBox1.List(i) rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Resize(1, C).Select End If Next i End Sub
y en el commandbutton5 le hice algunos cambios para hacer un poco mas agil el proceso, ahora cargara solo las filas con datos descartando las vacias.
u = H2.Range("A1").CurrentRegion.Rows.Count If u = 1 Then MsgBox "No existen registros con ese filtro", vbExclamation, "FILTRO" Exit Sub End If ListBox1.RowSource = H2.Name & "!A2:Z" & u End Sub
Buenas tardes de nuevo!!
He hecho lo que me has dicho y cuando hago la búsqueda, al dar al botón comando modificar me abre el formulario_modificar pero está vacío, no me traslada los datos de la fila seleccionada del listbox. Seguramente algo estoy haciendo mal..... Esta es mi primera base de datos utilizando el vba y soy una novata.... En cuanto a la modificación que has hecho en el comando buscar... FENOMENAL!!! Ahora va directo y no tarda tanto en seleccionar la fila de la hoja de datos.
Te mando el archivo nuevamente para que lo revises y me digas que estoy haciendo mal
Gracias y perdona por ser tan "torpe"
https://drive.google.com/open?id=1OUd4SksdxlnXAOQinZDLgKceIO5qoMKj
Ya vi tu programa y de entrada no tiene los cambios que te mande es decir el formulario modificar no tiene las instrucciones para cargar y modificar, y en el formulario busqueda no hay ninguna de las modificaciones que te hice, dejame te explico esta linea rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate la instruccion esta para que se posicione en la celda de la columna que tenga el valor que busca, esta linea auqneu esta bien no te sirve, la cambien por esta rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).resize(1,c).select, que ahora te va a seleccionar todos loc campos para dejarlos listos para ser cargados por el formulario 2, la c viene de lineas mas atras con la instruccion c=rango.columns.count que representa la cantidad de columnas de la fila seleccionada que tienen datos, luego cuando das abres el formulario modificar lo primero que hace es buscar la seleccion con la instruccion set datos=selection e inmediatamente hace la carga de esa fila seleccionada a los textbox, haces las modificaciones y al guardar vuelve a leer la fila seleccionada y ahi en es fila guarda las modificaciones, no sale como dije porque hay instrucciones que le digan a los formularios que hacer o quiza mandaste un archivo que no es, este es el resultado de las modificaciones que te envie ademas en los errores esta el aprendizaje.
Buenas noches:
Efectivamente, no había hecho todas las modificaciones. He vuelto a revisar todo y he hecho las modificaciones que me has indicado. Lo que te decía torpeeeee. No me sale???
Otra cosa que he visto (hasta ahora no me había dado cuenta) es que el formulario búsqueda en el Combobox que hace de filtro está pensado (obviamente) para que coja los encabezados de la tabla de DATOS. Sin embargo, cuando abres la base de datos a través del formulario de contraseña (esta es la idea) habrás visto que a continuación se abre un formulario (menú) con varios "submenús" : registrar, buscar, modificar, salir. Pues bien, si doy a BUSCAR me aparece el formulario de búsqueda pero al desplegar el combobox del filtro me aparece las etiquetas del formulario de acceso (usuario y contraseña)???; sin embargo tendría que aparecer las de la tabla de DATOS. Otro problema..... Se podría arreglar de alguna manera???? (imagino que sí).
Abusando de tu paciencia y confianza... sería mucho pedir que me enviaras el archivo xlms con las modificaciones hechas que funcionen???? La verdad es que me harías un gran favorrr (te puedo facilitar mi correo electrónico).
Te adjunto el link con el archivo para que veas tu mismo lo que te comento... Mil gracias!!
https://drive.google.com/file/d/1BYZD_C1JlSgX58lCCzhowwFZZXWfjVZ7/view?usp=sharing
Buenas noches:
Respecto a esto que te he comentado anteriormente "Otra cosa que he visto (hasta ahora no me había dado cuenta) es que el formulario búsqueda en el Combobox que hace de filtro está pensado (obviamente) para que coja los encabezados de la tabla de DATOS. Sin embargo, cuando abres la base de datos a través del formulario de contraseña (esta es la idea) habrás visto que a continuación se abre un formulario (menú) con varios "submenús" : registrar, buscar, modificar, salir. Pues bien, si doy a BUSCAR me aparece el formulario de búsqueda pero al desplegar el combobox del filtro me aparece las etiquetas del formulario de acceso (usuario y contraseña)???; sin embargo tendría que aparecer las de la tabla de DATOS. Otro problema..... Se podría arreglar de alguna manera???? (imagino que sí)." OLVIDALO.... Lo acabo de probar ahora mismo y esta bien salen los encabezados de la tabla datos... No se por qué antes lo he mirado y no me salía bien..... Sin embargo ahora sí.... imagino que tanto darle vueltas y vueltas... no sabe uno lo que hace...
En cuanto a lo primero, me sigue sin salir …. Por favor, si me lo puedes revisar y mandarme el archivo con las correcciones te lo agradecería mucho...
Ya me contaras!!
Buenas noches.
descargalo desde este link https://1drv.ms/x/s!Aqt18sdMf2xXiRYnpGs686c8Ny0v
- Compartir respuesta