Ya hemos visto en mas de una oportunidad como buscar un valor con macros, analizando distintas alternativas: el método Find, las WorksheetFunctions, etc, etc. Es tema es pedirle a Excel (mediante VBA) que nos diga si un valor existe o no dentro de una hoja o rango determinado.
Pero nunca contemplé en mis ejemplos la consulta que me hace "Anónimo": como hacer para que esa macro busque mas de una vez el mismo valor. Es decir: supongamos que nuestro rango de búsqueda es "A1:A8", en el cual tengo una lista de las aplicaciones mas populares de Office:
sencillo: alcanza y sobra
[+/-] Ver el resto / Ocultar
Este es el código que utilizamos, generalmente, para buscar con macros:
Sub Busqueda()
Dim F As Long
F = Range("a1:a8").Find("access").Row
MsgBox F
End Sub
Obteniendo, en consecuencia, el siguiente resultado:
bien: "access" está en la tercer fila del rango.
Pero claro... siempre hay peros. La palabra "excel" está dos veces en esa lista y por mas que hagamos y hagamos.... la macro anterior siempre nos mostrará 5, la quinta fila
. Y, por mas que insistamos, de esta forma resultará imposible que VBA busque el siguiente valor, siempre se "frena" en la quinta fila. ¿Por qué si la ejecuto y ejecuto siempre aparece el "excel" de la quinta fila y no el de la primera? Veamos.
La solución es muy sencilla y viene con la propia ayuda de Excel: crear un bucle para que esta tarea se repita hasta agotar todas las búsquedas de "excel" dentro del rango.
El código es sensiblemente distinto, aunque lo comento apropiadamente para que se comprenda el "paso a paso" y puedan adaptarlo a sus proyectos:
Sub BusquedaMultiple()
'indico en que hoja y rango buscaré:
With Worksheets("Hoja2").Range("a1:a8")
'seteo a c, indicándole que busque "excel"
Set c = .Find("excel")
'si el resultado es positivo:
If Not c Is Nothing Then
'como primer medida guardo la dirección "address"
'de la celda que contiene "excel".
firstAddress = c.Address
'y comienzo con el bucle:
Do
'busco nuevamente:
Set c = .FindNext(c)
'y muestro en un msgbox en que fila se encuentra
'"excel":
MsgBox c.Row
'a esto lo explico fuera del código:
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
'destruyo a c, para liberar recursos:
Set c = Nothing
End Sub
Y una vez que ejecuto la macro se puede observar que ahora sí me encuentra el primer y segundo "excel" de la lista, mostrándome en que fila se ubican:
Lo importante aquí es tener en cuenta las dos instrucciones (condiciones) que le indicamos al bucle en su Loop: se ejecutará mientras c sea válido (not is nothing) y la dirección de c (address) sea distinta a la primera que encontramos. Analicemos: la primer condición es obvia: busca hasta que no encuentres nada... pero la segunda encierra un gran secreto: también busca mientras que la dirección que hallaste sea distinta a la primera. Si omitimos esto último sencillamente caeríamos en un bucle "infinito", que se ejecutaría sin cesar, obligándonos a presionar "ctrol + pause" para que se detenga.... apagar la Pc o bien cortar la luz. =)
El ejemplo visto es muy sencillo y básico: buscar las veces que sea necesaria un mismo valor dentro de un rango determinado. Yo muestro la fila en un MsgBox, aunque quizás lo que mas les sirva sería llevar un "contador" interno que se autoincremente cada vez que encuentre nuestro valor... si supera 1, estamos ante datos duplicados y podremos obrar en consecuencia.
Suerte.
Comentarios
Publicar un comentario