Macro, buscar en fila según condición, si coincide copiar valor de la celda al textbox

Tengo una hoja llamada "profesión" ID_PROFESION, NOMBRE_PROFESION, DURACION, CREDITOS, HORAS, DATO1, DATO2, DATO3, DATO4, DATO5 ... DATO20. Esos valores los muestro en un listbox y a su vez los jalo para otros textbox con la opcion "listindex" al hacer clic en el listbox, El tema es que en el listbox solo me muestra 10 columnas. Si quiero pasar tambien el valor DATO10, DATO20 a otros textbox no voy a poder ya que el listbox solo me permite elegir los 10 primeras columnas mostradas .

Private Sub txtnombreprofesion_Change()

'On Error Resume Next
Application.ScreenUpdating = False
Sheets("PROFESIONES").Select
Range("B5").Select
listprofesiones.Clear

While ActiveCell.Value <> ""

M = InStr(1, UCase(ActiveCell.Value), UCase(txtnombreprofesion.Text))
If M > 0 Then
listprofesiones.ColumnCount = 3
listprofesiones.AddItem

ActiveCell.Offset(0, -1).Select
listprofesiones.List(listprofesiones.ListCount - 1, 0) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
listprofesiones.List(listprofesiones.ListCount - 1, 1) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
listprofesiones.List(listprofesiones.ListCount - 1, 2) = ActiveCell.Value
ActiveCell.Offset(0, -1).Select
End If

ActiveCell.Offset(1, 0).Select

Wend

End Sub

[email protected] - para la info.

2

2 Respuestas

3.699.100 pts. Si me amas, siempre voy a estar en tu corazón; si me...

H o l a : Con el método AddItem solamente puedes cargar 10 columnas. Para cargar más de 10 columnas se puede utilizar la propiedad RowSource.

Te anexo el código actualizado, primero debes crear una hoja llamada "temp" para copiar en esa hoja los registros filtrados por el nombre de la profesión.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Set h1 = Sheets("PROFESIONES")
    Set h2 = Sheets("temp")
    '
    h2.Cells.Clear
    h1.Rows(4).Copy h2.Rows(1)
    f = 2
    listprofesiones.ColumnCount = 25
    listprofesiones.ColumnHeads = True
    listprofesiones.RowSource = ""
    For i = 5 To h1.Range("B" & Rows.Count).End(xlUp).Row
        If InStr(1, UCase(h1.Cells(i, "B").Value), UCase(txtnombreprofesion.Text)) > 0 Then
            h1.Rows(i).Copy h2.Rows(f)
            f = f + 1
        End If
    Next
    '
    u = h2.Range("B" & Rows.Count).End(xlUp).Row
    If u = 1 Then
        MsgBox "No existen registros con ese filtro", vbExclamation, "FILTRO"
    Else
        listprofesiones.RowSource = h2.Name & "!A2:Z" & u
    End If
End Sub
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Al final de mi respuesta hay un par de botones para valorar la respuesta: "Votar" y "Excelente" si todavía tienes dudas puedes solicitar más información, de lo contrario podrías valorar adecuadamente la respuesta.

¡Gracias! Me sirvió tu respuesta. Aunque al final termine por adaptar mi sistema de otra manera ya que filtrar varias columnas hace que el procedimiento de filtrado se realice con lentitud. Pues filtrar más de 2000 registro por más de 20 es demasiado. De todas maneras me sirvió como repito tu código ya que lo estoy adaptando a otro procedimiento

3.425 pts.

La cantidad de columnas que va a mostrat el listBox, esta determinada en la propiedad COLUMNCOUNT, revisa el valor que le tienes asignado, ahora la pregunta es:

¿Por qué tu mismo le estas asignando solo 3 columnas?

listprofesiones.ColumnCount = 3

Si tienes razon por el momento solo mostraba 3 datos. Pero poniendo por decir 25 un ejemplo. Solo me va mostrar 10. 

Allí te dejo Dante una buena respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas