Hola a todos!. Cómo va el fin de semana?, espero que bien (a pesar de los inconvenientes de las restricciones de estos días).

Hoy me gustaría volver a retomar el método range.FindNext y su programación con VBA. Básicamente se trata de una búsqueda, ya sea un número o una letra. La ventaja de utilizar este método es la rapidez con la que obtenemos un resultado.

Trabajaremos el siguiente ejemplo:

Tenemos este rango de números y queremos hacer una búsqueda, esto lo podemos hacer de muchas formas con VBA e incluso con el cuadro de búsqueda de la cinta de opciones, pero hoy lo haremos así:

Cuando indiquemos un número o varios (pero utilizando la barra «|» como delimintador), automáticamente las coincidencias se marcarán de color verde en el rango de números y en la columna AA aparecerá la dirección de la celda con la coincidencia.

Este ejemplo lo he programado para que cada vez que busquemos un elemento o varios se borren los colores de la búsqueda anterior y las coordenadas.

Por ejemplo vamos a buscar los siguiente valores 31|45|23:

Como podéis observar, la programación ha realizar no solo la búsqueda de un elemento sino de varios en el mismo loop, además de marcar y traer las coordenadas de cada celda.

Bueno, supongo que ya tenéis ganas de ver el código. Aquí os lo dejo:

Option Explicit
Sub PROGRAMAR_RANGE_FIND_NEXT()
    'Declaramos variables
    Dim Dato        As Range, cDato As String, nDato As String
    Dim sLoc        As String, nombre As Variant, miArray As Variant
    Dim j           As Long, cont As Long, Fin As Long
    'Contamos elementos en la columna AA y borramos resultados anteriores
    Fin = Application.CountA(Sheets("DATOS").Range("AA:AA"))
    If Fin > 2 Then Sheets("DATOS").Range("AA3:AA" & Fin).Clear
    'Con el rango establecido
    With Sheets("DATOS").Range("A1:U35")
    'Eliminamos colores de búsquedas anteriores
    .Interior.Pattern = xlNone
    'Por cada número o elemento, buscamos, coloreamos y pasamos
    'dirección de la coincidencia
    For Each nombre In Split(Sheets("DATOS").Cells(2, 27), "|")
            '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 = .Find(What:=nombre, lookat:=xlWhole)
            'Si el nombre no existe, controlamos el error
            If Dato Is Nothing Then Exit Sub
            cDato = Dato.Address & "_Valor:" & nombre
            'Si existe nombre entonces iniciamos un loop
            If Not Dato Is Nothing Then
                Do
                    'Que busca todas las coincidencas
                    Set Dato = .FindNext(Dato)
                    'En una cadena de texto grabamos la localización
                    'De las coincidencias
                    nDato = Dato.Address & "_Valor:" & nombre
                    'Coloreamos coincidencias
                    Sheets("DATOS").Range(Split(nDato, "_")(0)).Interior.Color = vbGreen
                    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
            miArray = Split(Trim(sLoc), " ")
            For j = 0 To UBound(miArray)
                cont = Application.CountA(Sheets("DATOS").Range("AA:AA")) + 1
                Sheets("DATOS").Cells(cont, 27) = miArray(j)
            Next j
        sLoc = vbNullString
    Next nombre
      End With
End Sub

Sin duda un alternativa a otros métodos programadas de búsqueda y que pueda ofrecer una óptima experiencia 🙂

Por cierto, está programado para que la coincidencia sea exacta (lookat:=xlWhole) si deseáis que se busque una coincidencia de cualquier parte del texto buscado tendréis que utilizar: (lookat:=xlPart).

Y esto es todo, espero que os haya resultado de interés 🙂

Descarga el archivo de ejemplo pulsando en: 

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post