TextBox Buscador

Hola a todos,
¿Cómo puedo llamar los datos que están en una Hoja de cálculo con sus 4 columnas, desde un UserForm que contiene un TextBox y un ListBox, de manera que en el TextBox al escribir en ella haga una búsqueda como Ctrl+B (Buscar y reemplazar) y me los vaya mostrando en ListBox?
Gracias por la ayuda!

1 respuesta

Respuesta
1
Puedo ayudarte nada más dime un par de cosas, ¿cuál es el rango de búsqueda? ¿O cuáles son las cuatro columnas donde quieres buscar?...
Lo más importante... quieres que al ir escribiendo en el textbos se vallan cargando los datos conforme pones una letra o hasta el final... ¿quieres qué se eliminen del listbox los valores duplicados o no importa?...
espero tus comentarios... cuidate! Salu2x!
Muchas gracias!
Las columnas pueden ser A,B,C y D.
Si, la primera opción, que cuando vaya escribiendo en el textbox se vayan cargando los datos en el listbox.
Lo de los valores duplicados, está interesante, no importa pero si tienes ejemplos de ambos, genial.
Aunque no lo había detallado, esa búsqueda incluyen las 4 columnas, es decir que si busco por ejemplo, las letra "a":
Columna A: Número(ID), Columna B: Nombre, Columna C: Apellido, Columna D: Edad;
Me muestre entonces todas las filas que contenga las letra "a". En éste caso como son letras me buscaría en las columnas B y C, como nombres: Ana, Martha, Juan..., y en apellidos como: Salas, Fonseca, Gamboa...
Saludos y gracias de nuevo!
emmmh... ¿bueno te mando el código y tu me dices si te entendí bien va? Private Sub
Private Sub TextBox1_Change()
ListBox1.Visible = True
ListBox1.Clear
If Sheets(1).Range("A2:D6").Find(TextBox1.Value) Is Nothing Then
TextBox1.Text = ""
ListBox1.Visible = False
Else
With Sheets(1).Range("A2:D6")
Set c = .Find(TextBox1.Value)
primera = c.Address
Do
ListBox1.AddItem c.Value
Set c = .FindNext(c)
Loop While c.Address <> primera
'para no quitar duplicados quita todo este codigo desde aki hasta...
'Array con data
Dim Arreglo() As String
'Array temporal
Dim TempArray() As String
Dim x As Integer, x2 As Integer, y As Integer
Dim z As Integer, Elemento As Variant
Max = ListBox1.ListCount - 1
ReDim Arreglo(Max)
For a = 0 To Max
Arreglo(a) = ListBox1.List(a)
Next
For i = LBound(Arreglo) To UBound(Arreglo)
'Redimensionamos el Array temporal y preservamos el valor
ReDim Preserve TempArray(i)
'Asignamos al array temporal el valor del otro array
TempArray(i) = Arreglo(i)
Next
For x = 0 To UBound(Arreglo)
z = 0
For y = 0 To UBound(Arreglo)
'Si el elemento del array es igual al array temporal
If Arreglo(x) = TempArray(z) And y <> x Then
'Entonces Eliminamos el valor duplicado
Arreglo(y) = ""
End If
z = z + 1
Next y
Next x
ListBox1.Clear
'Recorremos el array. Para recorrer un array con ForEach
'la variable de la coleccióndebe ser de tipo Variant
For Each Elemento In Arreglo
'Si el elemento es distinto de una cadena vacia
'lo agegamos al List1
If Elemento <> "" Then ListBox1.AddItem Elemento
Next
'...aki
End With
End If
End Sub
Ok lo de negritas... cambia por la hoja donde están tus datos donde buscaras y el rango también (si no quieres que el rango sea fijo, modifícalo usando .end por ejemplo o algo por el estilo)
¿Me dices como te fue va?...
Hola v_344,
Los dos ejemplos estuvieron geniales, pero en lugar de llenar una sola columna del ListBox, serían las mismas columnas y filas de la Hoja de cálculo, es decir,
en la Hoja de cálculo tengo los siguientes datos:
ID Nombre Apellido Edad
8002546 Ana Salas 19
1506500 Martha Fonseca 32
7800069 Juan Gamboa 23
4501229 Claudio Campos 18
9667001 Damaris Ardiles 21
Si en el TextBox pongo las letras "la" entonces en ListBox me cargaría las filas que contengan esas dos letras que serían:
8002546 Ana Salas 19
4501229 Claudio Campos 18
Gracias!
Que onda escel!...
En ese caso cambia el código por esto:
Private Sub TextBox1_Change()
ListBox1.ColumnCount = 4
ListBox1.Visible = True
ListBox1.Clear
If Sheets(1).Range("A2:D6").Find(TextBox1.Value) Is Nothing Then
TextBox1.Text = ""
ListBox1.Visible = False
Else
With Sheets(1).Range("A2:D6")
Set c = .Find(TextBox1.Value)
primera = c.Address
fila = c.Row
columna = c.Column
Do
ListBox1.AddItem Cells(fila, columna - (columna - 1))
ListBox1.List(ListBox1.ListCount - 1, 1) = Cells(fila, (columna - (columna - 1)) + 1)
ListBox1.List(ListBox1.ListCount - 1, 2) = Cells(fila, (columna - (columna - 1)) + 2)
ListBox1.List(ListBox1.ListCount - 1, 3) = Cells(fila, (columna - (columna - 1)) + 3)
Set c = .FindNext(c)
fila = c.Row
columna = c.Column
Loop While c.Address <> primera
End With
End If
End Sub
Saludos!.. cuidate!
Hola v_344,
Desde la primera respuesta que distes tienes más de cinco estrellas,
pero al llegar a tener 5000 registros, en el primer dígito ejecutado en el TextBox se vuelve lenta la búsqueda, tendrá alguna forma de agilizarla más rápido.
Saludos!
Bueno la verdad si resulta tardado con rangos muy grandes... pero no es por la búsqueda sino por cargar los datos al listbox
siguiendo en la misma linea, el problema es que se cargan los datos cada que tu escribes una letra, y se repite el proceso con cada una de ellas... lo que hace aun más tardado que muestre el listbox completo.
Lo que puedes hacer es evitar tantas cargas al listbox cambiando el evento con el que se cargan los datos, es decir, los datos actualmente se cargan con cada cambio que haya en el textbox... lo que te propongo es cambiar ese evento por un botón de comando. Deja en blanco el textbox y agrega un botón de comando al formulario y el código que tenia el textbox pasalo el botón de comando (su evento predeteminado es click) así solo se cargaran los datos una vez que hayas terminado de escribir en el textbox y después des click sobre el botón de comando. De esta forma el código se ejecuta solo una vez.
¿Cómo vez?... eso reduciría significativamente el tiempo
me dices como te fue... ¿va?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas