Pasar datos seleccionados de ListBox a TextBox

Me podrían ayudar para pasar los datos seleccionados en el ListBox (1) al TextBox (2) por medio de código de VBA.

3 respuestas

Respuesta
1

¿Cuáles datos del listbox quieres pasar al textbox?

¿Cada línea del listbox la quieres en una línea del textbox? Si es así, entonces el textbox deberá tener la propiedad de multilínea.

Y una duda más: ¿Cuál es el objetivo de pasarlos al textbox?, es más apropiado manejar los datos en el listbox que en un tesxtbox.

Dante gracias por la repuesta, te comento, los datos que quiero pasar al TextBox son los que seleccione, por ejemplo los marcados en azul, cada línea se requiere en el TextBox como lo mencionas.

El objetivo de pasarlo de TextBox a ListBox es que es la mejor forma que encontré para cargar los datos de una hoja de excel al TextBox y este es el código que use.

La intensión es que las líneas seleccionadas se pasen al ListBox y que se borren del TextBox, ya que son datos únicos porque tienen un número de cerdo el cual no se puede asignar 2 veces, luego le doy guardar y esos datos se guardan y de esta forma no se duplican los números de cerdos.  

Imagino que debe de haber una forma mejor y eficiente de hacerlo, muchas gracias por la ayuda.

Saludos.

Me.ListBox.RowSource = "datos!A2:F100"      Define donde están los datos  
Me.ListBox.ColumnCount = 6       Define la cantidad de columnas
Me.ListBox.ColumnWidths = "55;55;55;55;55;55;55"      Define el ancho de las columnas
Me.ListBox.ColumnHeads = True      Hace que los títulos de los datos sean visible

No me queda claro el objetivo final.

---

Ya entendí que las filas del listbox las quieres pasar al textbox.

Cada fila tiene 5 columnas, supongo que quieres pasar las 5 columnas.

---

Pero regresando al objetivo final. ¿Quieres pasar las filas del listbox al textbox, para después pasar los datos del textbox a la hoja?

Si es así. Eso que quieres es innecesario, puedes pasar las filas con sus datos directamente a la hoja y es muy sencillo.

Solamente dime cómo quieres que queden los datos en la hoja y cómo se llama la hoja.

Saludos Dante, si el objetivo es pasar las filas del listbox al textbox, para después pasar los datos del textbox a la hoja y que esos datos que se pasaron al textbox se eliminen del listbox para que estén disponibles solo una vez, al final en la hoja lo que vamos a tener son los cerdos asignados por cliente, ruta, procedencia, etc;  tienes toda la razón cuando dices que es mas fácil hacerlo directamente pasar los datos en la hoja, pero pasa que los números de cerdos se podrían duplicar  como pasa frecuentemente, me parece que por medio del formulario evitamos se dupliquen por el error humano y de una vez tenemos en la hoja todo el resumen, cabe aclarar que esta asignación de animales se hace todos los días con diferente información.

La hoja se llama "asignados "

Así quedarían los datos:

Adjunto imagen del formulario completo.

  Dante muchas gracias por la ayuda, saludos.

Pero pasar los datos del listbox al textbox es un paso innecesario.

Como ya te dije es más simple pasar los datos directamente del listbox a la hoja, y los datos que se pasaron a la hoja, se eliminen del listbox.


Dime el siguiente detalle:

Qué control va en cada columna.

Es decir, por ejemplo:

  • El textbox1 va en la columna A.
  • El combobox2 va en la columna B.
  • El dato de la columna 2 del listbox va en la columna C.
  • Etc.
  • Etc.

Con esa información, puedo crear el código para pasar los datos a la hoja y después eliminar los registros del listbox que fueron pasados a la hoja.

Tienes razón, pasar los datos del listbox al textbox es un paso innecesario, lo pensé como un dato de verificación, para estar seguro que se seleccionaron los datos correctos.

El detalle es: 

  • cbo_cliente va en la columna A.
  • txt_asin datos de la asignados 
    • Columna 1 (Fecha)  va en la columna B
    • Columna 2 (#cerdo) va en la columna C
    • Columna 3 (Canal) va en la columna D
    • Columna 4 (Grasa) va en la columna E
    • Columna 5 (Magra) va en la columna F
  • cbo_camion va en la columna G
  • cbo_matadero va en la columna H

Muchas gracias Dante, saludos. 

Faltan otros datos.

El nombre de la hoja para poner los datos.

Según tu información, estás cargando el listbox con RowSource:

Me.ListBox.RowSource = "datos!A2:F100"      Define donde están los datos  
Me.ListBox.ColumnCount = 6       Define la cantidad de columnas
Me.ListBox.ColumnWidths = "55;55;55;55;55;55;55"      Define el ancho de las columnas
Me.ListBox.ColumnHeads = True      Hace que los títulos de los datos sean visible

Para borrar los registros del listbox, ya que hiciste la carga con RowSource, es necesario borrar los registros en la hoja "datos" y volver a cargar el listbox con RowSource. ¿Eso es lo que quieres?

El nombre de la hoja de datos es  "Asignados"

Los datos están en la hoja que se llama  "Datos"

Si señor,  esa es la idea, borrar los registros en la hoja "datos" y volver a cargar el listbox con RowSource.

Muchas gracias. 

Reemplaza este código:

Me.ListBox.RowSource = "datos!A2:F100"      Define donde están los datos  
Me.ListBox.ColumnCount = 6       Define la cantidad de columnas
Me.ListBox.ColumnWidths = "55;55;55;55;55;55;55"      Define el ancho de las columnas
Me.ListBox.ColumnHeads = True      Hace que los títulos de los datos sean visible

Por esto. Entendiendo que el número de cerdo está en la columna B.

Private Sub CommandButton1_Click()
  Dim i As Long, n As Long, lr As Long
  Dim shA As Worksheet, shD As Worksheet
  Dim Num As Variant
  Dim f As Range, rng As Range
  '
  Set shA = Sheets("Asignados")
  Set shD = Sheets("Datos")
  '
  lr = shA.Range("A" & Rows.Count).End(3).Row + 1
  '
  'Valida combos
  If cbo_cliente.ListIndex = -1 Then
    MsgBox "Falta el cliente", vbCritical, "ASIGNADOS"
    cbo_cliente.SetFocus
    Exit Sub
  End If
  'pasar los datos del listbox a la hoja "Asignados"
  For i = 0 To ListBox.ListCount - 1
    If ListBox.Selected(i) Then
      shA.Range("A" & lr).Value = cbo_cliente.Value
      shA.Range("B" & lr).Value = ListBox.List(i, 0)
      shA.Range("C" & lr).Value = ListBox.List(i, 1)
      shA.Range("D" & lr).Value = ListBox.List(i, 2)
      shA.Range("E" & lr).Value = ListBox.List(i, 3)
      shA.Range("F" & lr).Value = ListBox.List(i, 4)
      shA.Range("G" & lr).Value = cbo_camion.Value
      shA.Range("H" & lr).Value = cbo_matadero.Value
      '
      n = n + 1
      lr = lr + 1
      '
      Num = ListBox.List(i, 1)
      Set f = shD.Range("B:B").Find(Num, , xlValues, xlWhole, , , False)
      If Not f Is Nothing Then
        If rng Is Nothing Then Set rng = f Else Set rng = Union(rng, f)
      End If
    End If
  Next
  '
  If n > 0 Then
    rng.EntireRow.Delete
  Else
    MsgBox "No seleccionaron registros", vbExclamation, "ASIGNADOS"
  End If
End Sub
'
Private Sub UserForm_Activate()
  Dim lr As Long
  lr = Sheets("datos").Range("A" & Rows.Count).End(3).Row
  Me.ListBox.RowSource = "datos!A2:F" & lr
  Me.ListBox.ColumnCount = 6
  Me.ListBox.ColumnWidths = "55;55;55;55;55;55;55"
  Me.ListBox.ColumnHeads = True
End Sub

[Comenta si tienes alguna duda.

Respuesta
1

El Excel no es lo mío, pero un ejemplo siempre vale. Si tengo un formulario, más o menos como el tuyo, con su cuadro de lista y su inmenso cuadro de texto, llamado Texto45

Selecciono unos cuantos clientes

Cuando pulso el botón

El código del evento Al hacer clic del botón es

Private Sub Comando47_Click()
Dim i As Byte
For i = 0 To Me.Lista43.ListCount - 1
If Me.Lista43.Selected(i) Then
Texto45 = Texto45 & Me.Lista43.Column(0, i) & " " & Me.Lista43.Column(1, i) & " " & Me.Lista43.Column(2, i) & vbCrLf
End If
Next i
End Sub

Lo de Vbcrlf es para que haga un salto de línea en el cuadro de texto

Respuesta
1

No me atrevo a responder algo que no es mi campo, no obstante, es mejor recorrer un control listbox con FOR EACH. Asumo que también se aplica en Excel. Por ejemplo:

Dim VarPos As Variant

For Each VarPos In listbox.ItemsSelected

Next

Con esto se economiza 2 líneas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas