En VBA podría decir que la estrella es FIND , que nos permite buscar un dato y obtener su ubicación para luego movernos o devolver otros valores en relación a la referencia encontrada.
La instrucción con todos sus argumentos es:
Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
What: dato a buscar
After: a partir de dónde se realiza la búsqueda
Lookin: búsqueda entre valores (xlValues) o fórmulas (xlFomulas)
LookAt: coincidir con el contenido total (xlWhole) o parcial (xlPart) de la celda.
SearchOrder: realizar la búsqueda por filas (xlByRows) o por columnas (xlByColumns)
SearchDirection: búsqueda siguiente (xlNext) o anterior (xlPrevious).
Pero como hay varias sintaxis posibles vamos a ver aquellas que pueden llegar a fallar (ejemplos 1 a 4) y aquellas más recomendables (ejemplos 5 a 7)
Ejemplo 1: sin control de error en caso de dato no encontrado.
Cells.Find (qué se busca, a partir de dónde se busca, cómo se busca).Activate
Con Cells le estamos indicando la hoja completa, no acotada a un rango en especial.
Con Activate o Select le estamos diciendo que cuando lo encuentre ya lo deje seleccionado.
Ejemplo 2:
If j = 1 Then Set busca = ha.Find(numero)
If j > 1 Then Set busca = ha.FindNext(busca)
celda = busca.Address
Pero en cualquiera de los 2 casos, el código fallará si no encuentra el dato y por lo tanto no lo puede seleccionar o no puede obtener la dirección de la celda ya que no se encontró el dato a buscar.
Entonces habrá que colocar previamente una instrucción como la siguiente:
On Error goto NoEncontrado
Cells.Find (qué se busca, a partir de dónde se busca, cómo se busca).Activate
Y una entrada donde se instruya qué hacer en caso de no encontrar el dato.
NoEncontrado:
MsgBox "El dato buscado no se encuentra en la hoja activa."
Exit sub
NOTA: también es posible utilizar On Error Resume Next pero esto hará que siga con el resto de las instrucciones lo que en algún momento dará un resultado equivocado.
Ejemplo 3: acotando el rango de búsqueda pero a partir de celda seleccionada.
Range("A1:H1").Find(What:="marzo", After:=ActiveCell, SearchOrder:=xlByRows).Select
Range("A1:H1").Find("marzo", ActiveCell, , xlByRows).Select
Aquí le indicamos el rango y con Select le instruímos que seleccione la celda encontrada.
Pero con After le estamos indicando que lo busque a partir de la celda activa.Y esto nos dará error si la celda activa se encuentra a continuación del dato buscado o en otras filas.
Ejemplo 4: no indicando orden o dirección de búsqueda cuando el dato puede encontrarse en distintas celdas.
En la siguiente imagen se observa que el texto 'marzo' se encuentra en 2 lugares.
Para que no nos devuelva un dato erróneo debemos instruirle a Excel en qué dirección buscarlo con el argumento SearchOrder. En este ejemplo le indicamos que lo busque por columnas por lo que devolverá el de la celda A3:
Cells.Find("marzo", , , SearchOrder:=xlByColumns).Select
El método de búsqueda guarda los argumentos LookIn, LookAt y SearchOrder de la última búsqueda efectuada. Por lo tanto si no recordamos cuáles fueron esos argumentos utilizados debemos declararlos en nuestra instrucción para no correr riesgos de obtener resultados erróneos.
Una instrucción segura debiera incluir entonces:
Range("A1:D8").Find("ma", Lookin:=xlvalues, lookAt:=xlPart, SearchOrder:=xlbyRows)
LookAt:=xlPart indica que el texto buscado debiera estar incluido en el contenido de la celda.
LookAt:=xlWhole indica que el texto debe coincidir con el contenido de la celda
Ejemplo 6:
Al realizar búsquedas dentro de fórmulas, los argumentos que debemos incluir son:
LookIn:=xlFormulas
LookAt:=xlPart
Ejemplo 7: utilizando una variable declarada con SET
Este método puede ser el más preciso considerando la declaración de argumentos según cada caso.
Aquí buscamos en un rango de otra hoja, por columnas, un texto parcial y luego ejecutamos varias acciones con la celda encontrada. Si no se encuentra coincidencias se envía un mensaje.
Sub buscando()
Set ho2 = Sheets("Hoja2")
Set busco = ho2.Range("A1:D8").Find("ma", LookIn:=xlValues, lookAt:=xlPart, SearchOrder:=xlByColumns)
If Not busco Is Nothing Then
'podemos obtener todas las referencias del dato encontrado sin necesidad de seleccionarlo
filx = busco.Row
colx = busco.Column
'traer un rango a partir de la celda encontrada
rgo = Range(Cells(filx, colx), Cells(filx, colx + 2)).Address
ho2.Range(rgo).Copy Destination:=ActiveCell
'colorear celda encontrada
busco.Interior.ColorIndex = 3
Else
MsgBox "No se encontró el dato buscado en la Hoja 2"
End If
End Sub
Descargar ejemplo desde aquí.
Acceso al VIDEO N° 16.
Muy ilustrativo, saludos.
ResponderBorrarMuy ilustrativo el tema que tocaste, todo se ve simple. Saludos.
ResponderBorrar