Duda acerca de utilizar Bucle For.. Next.. O metodo Find para realizar búsquedas extensas Excel 2010

Buen día expertos de Excel, tengo una consulta acerca de que es lo que más me conviene usar al realizar una búsqueda en una base de datos bastante extensa.

Actualmente estoy utilizando un bucle For Next que compara celda por celda y si encuentra coincidencias lo agrega a un listbox pero la verdad es que es algo lento y aveces hasta se "traba" la computadora, es por eso que quisiera saber si hay alguna ventaja al utilizar el Método Find.

De antemano muchas gracias por su consejo.

Que tengan un excelente día.

2 Respuestas

Respuesta
1

Puedes hacer la búsqueda con el método Find anidado en bucle Do Loop.

Otra forma es hacer un autofiltro en la columna de lo que estas buscando.

Y otra forma es hacer un filtro avanzado.

Cualquiera de las 3 es más rápida que buscar fila por fila, pero para aplicar cualquiera de las 3 y ayudarte con el código tendría que analizar cómo tienes tu información, en qué columnas buscar, si son varios criterios y lo más importante es, una vez que lo tienes en el listbox qué quieres hacer con la información.

Te anexo el código para buscar con Find dentro del ciclo Do Loop

Sub buscarx()
    Set h = Sheets("Hoja1")
    Set r = h.Columns("A")
    Set b = r.Find("dato", lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            '
            'en el objeto b tenemos la celda encontrada
            'en esta parte tienes que poner lo que quieres
            'hacer con el resultado
            '
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
End Sub

Si tienes problemas para adaptar el código a tu información, avísame.

Saludos. Dante Amor

Si es lo que necesitas.

Gracias por responder nuevamente.

Te comento, la idea es para buscar nombre de personas en una base de datos mientras se escriba y agregarlos a un listbox, esto con la finalidad de hacer más rápido una búsqueda mientras escribo, para eso en el evento Change de un Textbox puse la macro siguiente.

Sub ValorExiste()UserForm1.ListBox1.ClearIf UserForm1.TextBox1 = "" Then Exit SubDim Rango As RangeDim Valor As StringDim Resultado As RangeDim PrimerResultado As StringDim Contador As IntegerDim Fila, FilaAnterior As LongDim SiguienteFila As LongSet Rango = Sheets("Hoja1").Range("B1:D10000")Valor = UserForm1.TextBox1Contador = 0Set Resultado = Rango.Find(what:=Valor, LookIn:=xlValues, lookat:=xlPart, searchorder:=xlByRows, searchdirection:=xlsnext, MatchCase:=False, searchformat:=False)If Not Resultado Is Nothing Then    PrimerResultado = Resultado.Address            Do                Contador = Contador + 1                        Fila = Resultado.Row                        If Fila <> FilaAnterior Then                        UserForm1.ListBox1.AddItem Sheets("Hoja1").Cells(Fila, 1)                        UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 1) = Sheets("Hoja1").Cells(Fila, 2)                        UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 2) = Sheets("Hoja1").Cells(Fila, 3)                        UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 3) = Sheets("Hoja1").Cells(Fila, 4)                        End If                        FilaAnterior = Fila                Set Resultado = Rango.FindNext(Resultado)            Loop While Not Resultado Is Nothing And Resultado.Address <> PrimerResultadoEnd IfEnd Sub

Los nombres, apellidos paternos y maternos están en tres columnas distintas (B, C Y D) y la idea es que si encuentra una coincidencia en cualquiera de las tres columnas agregue el nombre completo al listbox, para luego seleccionar un elemento de listbox y mandar los datos a otros textbox, bueno eso sería después, por lo mientras estoy con lo de la búsqueda. Pero como has de saber una búsqueda grande "bloquea la maquina" y pues no aparece la siguiente letra escrita en el textbox de búsqueda hasta que acabe de realizar la búsqueda.

Ojalá exista una solución para esto. De antemano muchas gracias.

Tienes 2 situaciones en lo que quieres desarrollar, la primera es, desde luego, realizar la carga en el listbox.

Pero también, una vez que realizaste la carga tienes que identificar el número de fila del registro que seleccionas en el listbox.

Te explico con un ejemplo de tu Base de datos:

     A                   B

1  Nombre       Dato

2 Jorge             x

3 Norma           y

4 Juan              z

Si haces el filtro con la J, en el listobox te va a poner:

Jorge

Juan

¿Correcto?

Pero luego quieres seleccionar un dato del listbox, en el listbox solamente tienes 2 registros, el 1 y el 2, ahora, quieres seleccionar a Juan, ¿cómo vas a saber que Juan está en la fila 4 de tu base de datos?

Entonces hay que poner en el listbox en una columna del listbox que Jorge está en la 2 y que juan está en la 4.

Pero para poner la numeración, necesito saber cómo vas a cargar los datos en el listbox y cuántas columnas vas a cargar, con additem o con rowsource.

Mejor envíame una muestra de tu archivo, solamente unos cuantos registros.

Me dices cómo entro a tu formulario y me dices qué datos quieres ver en el listbox. Si son más de 10 columnas, entonces tiene que ser con Rowsource.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Carlos Daniel Zarate Ramirez” y el título de esta pregunta.

Respuesta
1

Te dejo una macro de ejemplo. En las primeras líneas deberás introducir tus nombres de hoja, rango y de dónde tomar el dato a buscar.

* Si la hoja es la activa podés utilizar ActiveSheet en lugar de Sheets(hojita)

Nota: en este ejemplo coloqué en un listbox la celda de la col B del dato encontrado, para que observes cómo se hace mención a la variable 'busco'.

Sub busqueda()
'x Elsamtilde
'Completa estos datos según tu necesidad
hojita = "Hoja1"
rgo = "A:A"
dato = Range("E1").Value
Set busco = Sheets(hojita).Range(rgo).Find(dato, LookIn:=xlValues, lookat:=xlWhole)
If busco Is Nothing Then
    MsgBox "No se encontró el dato buscado"
    Exit Sub
End If
'se encontró el primer dato, guardo su dirección
dire = busco.Address
Do
    'coloco el dato de la col B en el listbox
    ListBox1.AddItem busco.Offset(0, 1)
'pasa a la búsqueda siguiente
Set busco = Sheets(hojita).Range(rgo).FindNext(busco)
'repito el bucle
Loop While busco.Address <> dire And Not busco Is Nothing
End Sub

* Todos los modelos de bucles en la Guía Temática N° 6 (ver demo)

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas