Como pasar diferentes registros de un listbox para obtener dato de una columna y pasarlo a diferentes Textbox en Access

Tengo un formulario independiente donde genere un listbox con varios registros (La tabla de donde saco los registros cuenta con ID), lo que hago es cuando doy un click en un registro y obtener el dato de la columna 4 pasándolo a mi textbox1 sin problema, pero al realizar nuevamente un click en otro registro diferente para obtener el mismo valor de la columna 4 y pasarlo a mi textbox2 no me resulta, siempre me lo tira al primero. Estuve buscando en la web como generar un código que valide si mi textbox1 ya tiene registros y pase al siguiente textbox vacío y así sucesivamente ya que requiero obtener mínimo 5 registros diferentes, junto a otros datos y guardarlos en otra tabla diferente. No logrando mi objetivo, espero puedan ayudarme con lo que pretendo hacer. Esto lo estoy desarroyando en Access

Private Sub Lista0_Click()
Me.VTroncal = Format(Me.Lista0.Column(4), "$ #,#")
If DoEvents Then
If Me.Lista0.ListCount > -1 Then
Me.VTroncal2 = Format(Me.Lista0.Column(4, 1), "$ #,#")
ElseIf Me.Lista0.ListCount > 0 Then
Me.VTroncal3 = Format(Me.Lista0.Column(4, 1), "$ #,#")
End If
End If
End Sub

2 Respuestas

Respuesta

Se puede hacer referencia a un control por su nombre (un texto que puede crearse en tiempo de ejecución).
Si se numeran los cuadros de texto (VTroncal0, VTroncal1, VTroncal2, VTroncal3)
Se puede hacer referencia a cualquiera de ellos así (siendo NN un numero válido):
Me.Controls("VTroncal" & NN)

Se puede verificar si un cuadro de texto tiene contenido así:
Len(Nz(Me. VTroncalNN))

Estas dos alternativas pueden lograr el mismo resultado, la primera los rellena de forma correlativa, la segunda rellena la primera que encuentre vacía.

Option Compare Database
Option Explicit
Private Sub lista0_AfterUpdate()
Dim campo As Long
campo = (Abs(Len(Nz(Me.VTroncal0)) <> 0) + Abs(Len(Nz(Me.VTroncal1)) <> 0) + Abs(Len(Nz(Me.VTroncal2)) <> 0) + Abs(Len(Nz(Me.VTroncal3)) <> 0))
If campo < 4 Then Me.Controls("VTroncal" & campo) = Me.Lista0.Column(4)
End Sub
Private Sub lista00_AfterUpdate()
Dim campo As Long
For campo = 0 To 3
If Len(Nz(Me.Controls("VTroncal" & campo))) = 0 Then Exit For
Next campo
If campo < 4 Then Me.Controls("VTroncal" & campo) = Me.Lista0.Column(4)
End Sub
Respuesta
1

Para implementar lo que necesitas en Access VBA, debes verificar el estado de los TextBox y asignar el valor del ListBox al primero que esté vacío. Tu enfoque actual no evalúa correctamente el estado de los TextBox, lo que causa que el valor siempre termine en el primero.

Le dejo una solución:

Private Sub Lista0_Click()
    Dim valorSeleccionado As String
    Dim asignado As Boolean
    Dim i As Integer
    Dim controles As Variant
    ' Obtener el valor de la columna 4 del ListBox (índice 3 porque es base 0)
    valorSeleccionado = Me.Lista0.Column(3) ' Cambia el índice si la columna 4 no corresponde
    ' Lista de TextBox donde se asignarán los valores
    controles = Array(Me.VTroncal, Me.VTroncal2, Me.VTroncal3, Me.VTroncal4, Me.VTroncal5)
    ' Recorrer los TextBox para asignar el valor al primero que esté vacío
    For i = LBound(controles) To UBound(controles)
        If Nz(controles(i).Value, "") = "" Then
            controles(i).Value = valorSeleccionado
            asignado = True
            Exit For
        End If
    Next i
    ' Verificar si no se pudo asignar el valor
    If Not asignado Then
        MsgBox "Todos los campos están llenos. Elimina un valor para agregar uno nuevo.", vbExclamation, "Aviso"
    End If
End Sub

Explicación:

Obtener el valor seleccionado:

El valor se extrae de la columna del ListBox que deseas (en su caso, la columna 4, índice 3 en VBA).
Esto asegura que siempre se usa el valor correcto.

Arreglo de TextBox:

Definimos un arreglo con los controles TextBox que se deben rellenar.
Esto simplifica el manejo y evita múltiples condiciones If.

Evaluar y asignar:

Se recorre el arreglo de TextBox y se verifica cuál está vacío usando Nz() para manejar valores nulos.
Al encontrar uno vacío, asigna el valor y sale del bucle con Exit For.

Manejo de excepción:

Si todos los TextBox están llenos, muestra un mensaje al usuario.

Esta es una idea.

¡Gracias! Excelente Don Eduardo es un master, resulta de maravilla, lo modifique un poquito más para agregar otros registros de una segunda columna y funciona perfecto.

Muchas gracias por su ayuda...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas