23 abril, 2021

BUSCAR VALORES CON EL MÉTODO RANGE.FIND EN EXCEL CON VBA

Hola a todos!.

¿Qué tal todo?, ¡espero que bien!.

Hoy voy a escribir acerca de un método interesante para buscar datos en Excel. Se trata del método range.find, que en comparación con otras funciones, se presenta mucho más rápido que un loop y ofrece mayor versatilidad que el uso de fórmulas.

Su uso es muy sencillo y ofrece unos resultados muy interesantes. Imaginad que tenemos en una hoja una dispersión de nombres de personas por diferentes celdas:

BUSCAR VALORES CON EL METODO RANGE.FIND EN EXCEL CON VBA

y estamos realizando una programación para obtener la localización del nombre que hemos seleccionado. Lo primero que se nos puede ocurrir es plantear un loop que recorra todas las celdas y vaya seleccionando el nombre que hemos elegido, sin embargo esto ocasionaría que nuestro código fuese demasiado lento (y sobre todo si ampliamos el tamaño del área que contiene la información).

La solución optima sería el uso del método range.find y que vamos a usar en el siguiente código:

Sub ENCONTRAR_DATO()
'Declaramos variables
Dim Dato As Range, cDato As String, nDato As String
Dim sLoc As String, nombre As String
With Sheets("DATOS").Cells
Sheets("RESULTADO").Cells(3, 2).ClearContents
'En la celda B2 indicamos el nombre a buscar
nombre = Sheets("RESULTADO").Cells(2, 1).Value
'Si el nombre está vacío salimos del proceso
If nombre = vbNullString Then Exit Sub
'Buscamos nombre (cualquier palabra o texto que lo contenga)
Set Dato = .Cells.Find(What:=nombre, lookat:=xlWhole)
'Si el nombre no existe, controlamos el error
On Error Resume Next
cDato = Dato.Address
On Error GoTo 0
'Si existe nombre entonces iniciamos un loop
If Not Dato Is Nothing Then
Do
'Que busca todas las coincidencias
Set Dato = .FindNext(Dato)
'En una cadena de texto grabamos la localización
'de las coincidencias
nDato = Dato.Address
sLoc = sLoc & " " & nDato
'Cuando la cDato sea igual a nDato
'salimos del loop
Loop Until cDato = nDato
End If
'pasamos los datos a celda B3
Sheets("RESULTADO").Cells(3, 1) = sLoc
End With
End Sub

Este código lo pegamos en un módulo estándar de nuestro editor VBA y en la hoja RESULTADO incluimos un botón de comando. El nombre a buscar lo escribimos en la celda A2 y ejecutamos la macro pulsando el botón.

En este caso, buscamos todos los nombres que se correspondan con "RAQUEL", obteniendo el siguiente resultado:

BUSCAR VALORES CON EL METODO RANGE.FIND EN EXCEL CON VBA2

Es decir que existen dos resultados, ambos en las celdas J15 Y A14 respectivamente.

He dejado el dólar en el resultado, pero lo podéis eliminar usando un replace: replace(sloc,"$","")

Si comprobamos en la hoja DATOS podemos ver que el resultado es correcto:

BUSCAR VALORES CON EL METODO RANGE.FIND EN EXCEL CON VBA3.jpg

Y esto ha sido todo. Como podéis observar, se trata de un código sencillo y muy útil como alternativa al uso de loops que recorren grandes rangos.

Espero que os haya resultado de interés y os pueda ser de utilidad.

Descarga el archivo de ejemplo pulsando en:  BUSCAR VALORES CON EL MÉTODO RANGE.FIND EN EXCEL CON VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Comparte este post

6 comentario en “BUSCAR VALORES CON EL MÉTODO RANGE.FIND EN EXCEL CON VBA

  1. Muchas, muchísimas gracias. Me ha servido este método para diseñar una macro para funcionar con archivos Excel empleados en una institución pública de Costa Rica. Por falta de presupuesto no tenemos un buen sistema pero con esfuerzo y personas como ustedes que son tan generosos al compartir valioso conocimiento de una forma tan didáctica y explicativa vamos avanzando. Dios se los pague.

  2. Buenas noches. Traté de hacer el mismo ejemplo pero no pude conseguirlo. Nunca se detiene el Loop. Lo que preciso es hacer un "buscar" (Ctrl + B) dentro de una columna, y al obtener la coincidencia, tomar el dato de la celda inmediatamente inferior a la que encontró, copiar ese valor y pegarla en otra hoja. Logré que copie la celda que deseo, pero hace infinitamente el Loop. Hay alguna forma de indicarle a través de un código que quiero que se repita 5 veces ese Loop?. Agradeceré su respuesta. Por otro lado, está bien redactado la publicación y es concisa la información. Lamentablemente, o no me sirvió para mi caso, o en algo estoy fallando.

    1. Claro. Es evidente que nunca terminé de hacer el loop porque nunca se da la situación de que el valor buscado coincida con alguna vez con la misma celda que se busca, ya que el valor obtenido es distinto. ¿Pero cómo solucionarlo?

      1. Hola:

        No sé exactamente qué es lo que necesitas, pero siguiendo el ejemplo del post:

        Si creamos solo una columna (la A) con varios nombres y, suponte que buscamos el nombre de raquel y queremos que nos traiga el dato a la hoja Resultado con el nombre de la celda anterior. El código para hacer eso sería este:

        Sub ENCONTRAR_DATO()
        Dim Dato As Range, cDato As String, nDato As String
        Dim sLoc As String, nombre As String
        With Sheets("DATOS").Cells
        Sheets("RESULTADO").Cells(3, 2).ClearContents
        nombre = Sheets("RESULTADO").Cells(2, 1).Value
        If nombre = vbNullString Then Exit Sub
        Set Dato = .Cells.Find(What:=nombre, lookat:=xlWhole)
        On Error Resume Next
        cDato = Dato.Address
        On Error GoTo 0
        If Not Dato Is Nothing Then
        Do
        Set Dato = .FindNext(Dato)
        nDato = Dato.Address
        Anterior = .Range(nDato).Offset(-1, 0).Value
        sLoc = Trim(sLoc & " " & Anterior)
        Loop Until cDato = nDato
        End If
        Sheets("RESULTADO").Cells(3, 1) = sLoc
        End With
        End Sub

        Espero que te sirva. Saludos.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies