Visual Basic para Aplicaciones - BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 14
Ha aumentado su posición en 8 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MARTIN (5 intervenciones) el 27/08/2019 19:08:41
Hola, gente como estan?

Les comento que estoy itentando ralizar lo siguiente, desde el resultado de una busqueda, con un dato que se
introduce en un textbox deseo llenar un listbox con 3 columnas , pero solo me sale una , no se si esoty haciendo mal todo o una parte, tal vez alguno me pueda ayudar a entender la dinamica de como obtener desde un resultado de una busqueda llenar un listbox.

les dejo el pobre codigo que puede crear hasta ahora por si les da idea de que estoy entendiendo mal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub btnBuscar_Click()
 
 
ColumnCount = 3
 
valor = txtCliente.Value
Set busca = Sheets("Clientes").Range("a1:a1000").Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busca Is Nothing Then
lstProducto.AddItem busca
i = lstProducto.ListCount - 1
lstProducto.List(i, 1) = busca.Offset(0, 1)
lstProducto.List(i, 2) = busca.Offset(0, 2)
End If
 
 
 
 
End Sub



muchas gracias por su tiempo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de alfredo lara
Val: 174
Bronce
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por alfredo lara (38 intervenciones) el 27/08/2019 19:31:20
Hola Martin

Si no configuraste el ListBox al diseñar el form a 3 columnas

creo te falta poner el nombre del objeto

lstProducto.ColumnCount = 3


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado su posición en 8 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MARTIN (5 intervenciones) el 27/08/2019 19:40:08
Muchas gracias, era eso.

Por casualidad, tu me podrias decir como hago para predefinir los nombres de las columnas? y cual es el evento para poder hacer que cargue el formato al cargar el formulario y no al dar clic?

y por ultimo me muestra solo un resultado en el list y hay varios.

si no puedes responder esto de todos modos muchas gracias por el tiempo para responder la pregunta anterior! es muy buen avance para mi
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfredo
Val: 174
Bronce
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por Alfredo (38 intervenciones) el 27/08/2019 19:42:24
Si subes una muestra de tu archivo podríamos revisarlo

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado su posición en 8 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MARTIN (5 intervenciones) el 27/08/2019 20:00:56
Claro, ahi lo dejo. como estoy comenzando como veras es basico.

muchas gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de MIGUEL
Val: 486
Plata
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MIGUEL (101 intervenciones) el 27/08/2019 20:53:11
Buenas MARTIN

Solo te carga una fila porque es lo que le pides en tu macro, para que te traiga todos las coincidencias nesecitas poner el codigo en un bucle, ya sea for next o do loop, te dejo una macro diferente que te servira o si prefieres la puedes usar de referencia para corregir tu codigo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub  btnBuscar_Click()
    Me.lstProducto.Clear'linea para borrar todas las filas del listbox, si no se pone sobreescribira las filas del listbox y no borrara las filas que no coincidan
    Dim ultfila As Long
    Dim buscar As String
    Dim f As Long
    Dim y As Long
 
    ultfila = Sheets("Clientes").Range("A" & Rows.Count).End(xlUp).Row'identifica cual es la ultima fila con datos en la columna A
    f = 2 ' es 2 porque la celda A1 es el encabezado y empezara a comparar desde la celda A2
    y = 0 ' es el numero de filas iniciales del listbox
    Do While f <> ultfila + 1
        buscar = Sheets("Clientes").Range("A" & f) 'cadena de texto de la celda en turno
 
        If UCase(buscar) Like "*" & UCase(Me.txtCliente) & "*" Then 'aqui compara si la celda en turno contiene lo que se tecleo en el textbox
            'los "*" significan que no importa que caracteres halla antes o despues de los caracteres en el textbox
            'Ucase es una funcion para convertir el texto en mayusculas ya que la busqueda diferencia minusculas de mayusculas
            'Por ejemplo: si yo escribo Alejandro y en la celda esta ALEJANDRO y no se pone Ucase y/o Lcase(para minusculas) no traeria los datos de la fila aunque es lo que busco
            Me.lstProducto.AddItem
            Me.lstProducto.List(y, 0) = Sheets("Clientes").Range("A" & f).Text
            Me.lstProducto.List(y, 1) = Sheets("Clientes").Range("B" & f).Text
            Me.lstProducto.List(y, 2) = Sheets("Clientes").Range("C" & f).Text
            f = f + 1 'pasa a la siguioente fila de la hoja
            y = y + 1 ' pasa a la siguiente fila del listbox donde se pondra la siguiente coincidencia
 
        Else
            f = f + 1
        End If
    Loop
End Sub

el evento para cargar toda las filas sin filtrar es en el siguiente evento de tu userform y lleva la misma macro solo que un poco diferente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub UserForm_Initialize()
    Dim ultfila As Long
    Dim f As Long
    Dim y As Long
 
    ultfila = Sheets("Clientes").Range("A" & Rows.Count).End(xlUp).Row'identifica cual es la ultima fila con datos en la columna A
    f = 2 ' es 2 porque la celda A1 es el encabezado y empezara a cargar los datos desde la celda A2
    y = 0 ' es el numero de filas iniciales del listbox
    Do While f <> ultfila + 1
       If Sheets("Clientes").Range("A" & f)<>"" Then 'este if es solo por si en el rango de la tabla tienes celdas en blanco, lo puedes quitar junto con las demas lineas que dicen quitar 
            Me.lstProducto.AddItem
            Me.lstProducto.List(y, 0) = Sheets("Clientes").Range("A" & f).Text
            Me.lstProducto.List(y, 1) = Sheets("Clientes").Range("B" & f).Text
            Me.lstProducto.List(y, 2) = Sheets("Clientes").Range("C" & f).Text
            f = f + 1 'pasa a la siguioente fila de la hoja
            y = y + 1 ' pasa a la siguiente fila del listbox donde se pondra la siguiente coincidencia
 
        Else'quitar
            f = f + 1'quitar
        End If'quitar
    Loop
End Sub

Con lo de predefinir los nombres de las columnas no se a que te refieras, es al encabezado de las columnas del listbox?

Espero te ayude.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado su posición en 8 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MARTIN (5 intervenciones) el 27/08/2019 21:18:43
si claro que me ayudo, sos un genio.!!!

""Con lo de predefinir los nombres de las columnas no se a que te refieras, es al encabezado de las columnas del listbox?" "Sil y me referia a cargar estos encabezados cuando carga el formulario, son los nombres de la tabla clientes en este caso


Lo que veo es que si ponog 40, coincide y me trae el resultado, no asi con 400- 444, 44 etc.

Me gustaria entender mas Me.lstProducto.List(y, 0) = Sheets("Clientes").Range("A" & f).Text aqui estas asignando a una posicion del list
un valor que seria de la hoja cliente ".Range("A" & f)." pero me gustaria saber que significa lo del parentesis, para entender como llega al valor.


otra dude es que si necesito que se muestren mas columnas deberia agregar otra linea verdad? dentro del bucle?
ejemplo
Me.lstProducto.List(y, 2) = Sheets("Clientes").Range("C" & f).Text

Realmente te agradezco que te gastes tu tiempo en ayudarme. si no puedes con estas dudas de todos modos millon de gracias che..
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfredo
Val: 174
Bronce
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por Alfredo (38 intervenciones) el 27/08/2019 22:15:35
Hola Martín

Baje tu archivo y creo que lo que quieres es listar los productos del cliente si es así te adjunto un ejemplo.

Con lo de predefinir los nombres de las columnas, si te refieres al ListBox, solo se pueden poner mediante la propiedad RowSource, si cargas los datos mediante un bucle no es posible

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de MIGUEL
Val: 486
Plata
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MIGUEL (101 intervenciones) el 27/08/2019 22:45:26
Pues para los encabezados puedes poner labels arriba del listbox, hay una forma de ponerlos en automatico, que seria

1
2
3
4
5
6
Dim ultfila As Long
 ultfila = Sheets("Clientes").Range("A" & Rows.Count).End(xlUp).Row
 Sheets("Clientes").Activate 'pasa el foco a la hoja donde se encuentran los datos
 lstProducto.ColumnCount = 3
 Me.lstProducto.ColumnHeads = True
 Me.lstProducto.RowSource = "A2:A" & ultfila
Con estas lineas haces exactamente lo que hace la macro en el evento initialize del userform, pero a la hora de filtrar desaparecen los encabezados en el listbox, desafortunadamente no se como mantenerlos durante la busqueda, por eso utilizo labels para simular los encabezados.

Con respecto a lo de los numeros es porque tal vez tengas redondeado el valor, por ejemplo si tienes en celda 40 y 400 y 399.9 con formato numero que solo muestre los enteros, la celda que esta 399.9 aparecera en listbox como 400 ya que se esta utilizando la propiedad .Text en la macro
1
Me.lstProducto.List(y, 0) = Sheets("Clientes").Range("A" & f).Text
Por eso a la hora de hacer la busqueda si pones un 4, solo traera dos resultados, porque 399.9 no contiene el caracter "4", lo mismo aplica con el formato moneda si pones $ como criterio de busquedo no te traera resultados aunque en el listbox este una celda con $400.00.

El paréntesis es para indicar los criterios que se nesecitan para hacer uso de la propiedad elegida, por ejemplo a la hora de escribir "Sheets(" en el momento que teclees el parentecis aparecera un mensaje justo abajo del cursos indicandote como se puede usar dicha funcio, el mensaje es "_Default(Index)As Object" esto quiere decir que el valor por default es un entero que seria el numero de hoja que quieres hacer referencia, pero tambien acepta texto(el texto siempre debe de ir entre comillas dobles ("Texto") y los numeros no llevan nada, por ejemplo:
suponiendo que la hoja clientes sea la hoja1(como saber esto{en el explorador de proyectos aparece por ejemplo Hoja1(Clientes) })
1
Sheets("Clientes").Range("A1")
es exactamente lo mismo que poner
1
Sheets(1).Range("A1")
o poner
1
Hoja1.Range("A1")
de la misma forma cuando pongas "hoja1.range(" te saldra los parametros que acepta la propiedad Range no asi con los primeros 2 ejemplos

Si, la linea Me.lstProducto.List(y, 2) = Sheets("Clientes").Range("C" & f) sirve para asignar el valor de la celda a una celda del listbox
digo celda porque es asi como trabaja el listbox por ejemplo la propiedad .Cells de una hoja de calculo trabaja de la misma forma que la propiedad .List de un listbox, la propiedad Cells es igual que la propiedad Range solo que con los valores invertidos por ejemplo
hoja1.Range(columna,fila)
hoja1.Cells(fila,Columna)
por lo tanto
1
Sheets("Clientes").Range("C1")
es lo mismo que
1
Sheets("Clientes").Cells(1,"C")
o
1
Sheets("Clientes").Cells(1,3)
las hojas empiezan asi la celda Range("A1") es lo mismo que Cells(1,1) o Cells(1,"A"), en el listbox seria List(0,0)

No soy muy bueno para explicar, aver si no te enrede mas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado su posición en 8 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

BUSCAR EN UNA TABLA DESDE UN TEXTBOX Y LISTARLO EN UN LISTBOX?

Publicado por MARTIN (5 intervenciones) el 28/08/2019 20:55:56
Excelente muchas gracias por la explicacion, fuiste muy claro.


lo del resultado no se si me entendiste porque si pongo de valor 40 me lo trae. pero yo estoy buscando el 4 no el 40. asumo que al ser texto y no numero al momento de buscar por esto trae el valor igual. supongo... voy a buscar si hay forma de que los valores comparables sean numeros en este caso para ver si deja de pasarme eso. si es que se puede

muchas gracias por la ayuda , increible lo tuyo. saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar