El asunto es cómo hacer coincidir el contenido completo de un listbox, sin necesidad de seleccionar nada previamente( lo que creo lo debería simplificar de alguna forma) con el de un campo de una tabla, es decir a medida que introduzco o elimino datos del listbox ocurra lo mismo en el campo de la tabla, tampoco es necesario que sea simultáneo y podría actualizarse mediante algún evento como perdida del enfoque de listbox, o cualquier otro.
He probado asignando el campo de la tabla como origen de control del listbox pero según dicen por ahí solo sirve si hay una selección
Supongamos que en Access tenemos una tabla llamada "Personas" con 2 campos "Id" y "Nombre" y en VB tenemos un ListBox llamado "LstPersonas", y el campo Id está "relacionado" con LstPersonas por medio de la propiedad "ItemData" de ésta. Por ejemplo: Tabla: Personas ListBox: LstPersonas Id Nombre ItemData Nombre 1 Ana 1 Ana 2 Miguel 2 Miguel 3 Alba 3 Alba Podemos hacer "interactuar" LstPersonas con la tabla "Personas" por medio de un botón [llamémosle CmdActualizarBD] y otros 2 botones para agregar y quitar elementos de la lista [llamémosles CmdAgregar y CmdQuitar]. El código quedaría así: Dim Cnx As New ADODB.Connection Private Sub CmdAgregar_Click() Dim Rst As New ADODB.Recordset 'recuperamos el Id máximo de la tabla Personas Rst. Open "SELECT MAX(Id) FROM Personas", Cnx, adOpenStatic, adLockPessimistic With LstPersonas 'pedimos al usuario el nuevo elemento en la lista 'obviamente esto lo debes adecuar a tu BD .AddItem InputBox("Nueva persona", "Agregando") 'agregamos la clave única al nuevo elemento en la lista 'simplemente sumando al Id máximo uno más .ItemData(.NewIndex) = Rst(0).Value + 1 End With End Sub Private Sub CmdQuitar_Click() With LstPersonas 'quitar el elemento seleccionado .RemoveItem .ListIndex End With End Sub Private Sub CmdActualizarBD_Click() Dim Rst As New ADODB.Recordset Dim i As Integer With LstPersonas For i = 0 To .ListCount - 1 'recorrer la lista para verificar que el código del elemento _ no exista, es decir, los elementos que ya estaban en la lista _ NO los inserta de nuevo en la BD, sólo los nuevos Rst.Open "SELECT Id FROM Personas WHERE Id = " & _ .ItemData(i), Cnx, adOpenStatic, adLockPessimistic If Rst.RecordCount = 0 Then Cnx.Execute "INSERT INTO Personas VALUES (" & _ .ItemData(i) & ", '" & .List(i) & "')" End If Rst.Close Next End With End Sub Private Sub Form_Load() Dim Rst As New ADODB.Recordset Dim i As Integer 'realizar la conexion a la BD Cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\BD.mdb" 'recuperar todos los registros de la tabla "Personas" Rst.Open "SELECT * FROM Personas", Cnx, adOpenStatic, adLockPessimistic With LstPersonas If Rst.RecordCount Then For i = 1 To Rst.RecordCount 'recorrer la tabla y agregar cada campo a la lista .AddItem Rst(1).Value 'añadir el código único al elemento de la lista .ItemData(.NewIndex) = Rst(0).Value Rst.MoveNext Next i End If End With End Sub Espero haberte podido ayudar, si tienes alguna duda consúltame de nuevo y la resolveremos. Saludos desde México. Juan Pablo E.P.
En primer lugar muchas gracias por la ayuda Juan Pablo, y la probaré más detenidamente aunque lamento no haberme explicado mejor ya que lo que intento hacer es introducir el contenido completo del lstPersonas en un único campo de la tabla Personas, por ejemplo en el campo nombre, y unidos los distintos nombres uno detrás de otro separados por una coma, en dicho campo. De manera que el campo personas de la tabla siempre estaría actualizado con el contenido del lstPersonas mediante cualquier evento posible, no sé si es posible hacerlo de manera simultánea a como se van introduciendo los valores en el listbox, en cuyo caso sería ideal, el resto de los campos de la tabla no hay que considerarlos puesto que tomarían los valores de otros controles del formulario distintos al del listbox. Un saludo
Hola de nuevo Juan Pablo, he intentado adaptar el código que me enviaste para que hiciera lo que te explicaba en la anterior respuesta pero no consigo hacerlo. Por otra parte estoy intentando hacerlo mediante la creación de una variable que contenga el contenido completo del listbox y pasarle dicho contenido al campo de la tabla de manera encadenada (es decir, las filas del listbox irían una detrás de otra, separadas por una coma en un único campo de la tabla) pero no sé como se asigna el valor a la variable ni tampoco como pasarlo, en fin, que mis conocimientos sobre VBA son limitadísimos, un saluco y gracias de nuevo
Lo que deseas hacer, si no me equivoco, es "concatenar" todos los elementos de ListBox, para hacer eso debes crear un ciclo que lo recorra e ir agregando el texto a la cadena. Private Sub ConcatenarStr() Dim i as Integer Dim MiCadena As String For i = 0 to LstPersonas.ListCount - 1 MiCadena = MiCadena & ", " & LstPersonas.List(i) Next i End Sub El resultado final sería que "MiCadena" tendría todos los elementos del ListBox, separados por coma (,).