Excel.Macros: Usando Find

Cuando tenemos que buscar celdas con un contenido concreto, desde dentro de una macro, recurrimos demasiadas veces a la busqueda secuencial y a las funciones BUSCARx, cuando tenemos una función que podemos usar la mayoría de las veces y con la que podemos trabajar muy cómodamente; se trata de Find.

Find busca dentro de un rango, aunque solo lo puede hacer con string completas, puede buscar también celdas especiales.

Lo primero de todo: busca dentro de un rango, si le indicamos, p.ej:,

ActiveSheet.Find …..

la búsqueda la realizara en la hoja activa; pero si decimos

Range(“A1:B54”).Find…

la búsqueda se restringirá al rango A1:B54, lo que nos puede ir muy bien para encontrar los datos dentro del ámbito buscado…Así mismo, las búsquedas no se detienen por celdas en blanco.

Respecto a los parámetros que podemos usar, os indicamos los que pensamos que pueden ser mas útiles, y si necesitáis mas información, y mientras no preparemos nuestras paginas, os dejo el enlace a la de  microsoft: http://msdn.microsoft.com/en-us/library/office/ff839746.aspx

El único parámetro obligatorio es el que establece lo que queremos buscar, y que es:

what:=”valor a buscar”

Tan solo con esto, la instrucción nos devolverá la celda en la que se encuentre el valor buscado o nothing, en caso de que no lo halle.

After:=celda

Le podemos indicar a partir de que celda queremos empezar a buscar

lookIn:=donde buscar

Con dos opciones: buscar en valores (xlValues) y buscar en formulas (xlFormula)

LookAt:=como buscar

con xlWhole para búsquedas de palabra exacta, o xlPart para búsquedas con parte de la palabra

SearchOrder:= orden de busqueda

para indicarle si queremos realizar la busqueda por filas(xlRows) o por columnas(xlColumns)

SearchDirection:= direccion de la busqueda

Pensado para continuar con la busqueda con dos posibles opciones:

  • xlNext – Continuar con siguiente
  • xlPrevious-Continuar con anterior

MatchCase:=true/false

Para indicar si ha de detectar mayúsculas y minúsculas

 

 

Ejemplos:

Buscar la cadena CASA y poner el valor HOGAR solo en la columna A

zona=Range("A:A") 
Set c = zona.Find("CASA", lookin:=xlValues) 
If Not c Is Nothing Then 
   inicio= c.Address 
   Do 
      c.Value = "HOGAR"
      Set c = zona.FindNext(c) 
   Loop While Not c Is Nothing And c.Address <> inicio
End If

Encontrar la ultima celda con datos

Set ultima = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", SearchOrder:=xlByColumns, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Column)

Encontrar la primera celda con datos

Set primera= Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _
      SearchDirection:=xlNext, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _
      SearchDirection:=xlNext, LookIn:=xlValues).Column)

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Excel, Formacion y etiquetada , , , . Guarda el enlace permanente.

28 respuestas a Excel.Macros: Usando Find

  1. rafael dijo:

    Una curisidad. Por qué utiliza

    If Not c Is Nothing Then
    ‘ encuentra valor
    else
    ‘ no encuentra valor
    End If

    en lugar de

    If c Is Nothing Then
    ‘ no encuentra valor
    else
    ‘ encuentra valor
    End If

    • Miguel dijo:

      Porque si ” c Is Nothing” no tengo que hacer nada, entonces solo necesito la zona else;para eso niego la comparacion, y lo hago en la zona true

  2. rafael dijo:

    Gracias

  3. rafael dijo:

    Estoy buscando un valor en la columna A de una hoja Excel, una clave de entre 13 y 15 dígitos. Después de innumerables pruebas, he reducido la macro al siguiente código para comprobar el funcionamiento.

    Sub Find_First()
    Dim Busca As Double
    Dim Rng As Range
    Busca = InputBox(“Enter a Search value”)
    If Trim(Busca) “” Then
    With Sheets(“Hoja1”).Range(“A:A”)
    Set Rng = .Find(What:=Busca)
    If Not Rng Is Nothing Then
    Application.Goto Rng, True
    Else
    MsgBox “Nothing found”
    End If
    End With
    End If
    End Sub

    Si la prueba la realizo con números de 15 dígitos, la macro no encuentra coincidencias.

    Si la prueba la realizo con números de 2 dígitos, la macro encuentra el número buscado.

    Desde hace tres días estoy dando vueltas al problema y no encuentro la solución, ¿ podrías ayudarme a encontrar el error? Gracias.

    • Miguel dijo:

      Disculpa, acabo de ver el mensaje, has probado de grabar una macro mientras escribes la funcion BUSCARV ?, Comentame algo, y mañana reviso tu codigo.

      • Miguel dijo:

        He revisado tu codigo, y lo unico que he visto erroneo, es la linea del primer if; de cualquier forma, te adjunto mi codigo de prueba que me ha funcionado bien:
        Sub Find_First()
        Dim Busca As Double
        Dim Rng As Range
        Busca = InputBox(“Enter a Search value”)
        If Trim(Busca) <> “” Then
        With Sheets(“Hoja1”).Range(“A:A”)
        Set Rng = .Find(What:=Busca)
        If Not Rng Is Nothing Then
        Application.Goto Rng, True
        Else
        MsgBox “Nothing found”
        End If
        End With
        End If
        End Sub

        Cuentame como acaba!

  4. Darwin dijo:

    no te faltó el xlWhole…?

    • Miguel dijo:

      Dependerá si quiere que la búsqueda coincida con toda la celda. De cualquier forma es una pregunta muy antigua, y nunca se molesto en contestar para decir si mi respuesta la había ido bien o mal….

  5. Muy buenos días. Tengo una información en Excel y es una tabla que contiene formatos de una ficha de inventario cada una tiene un código y la verdad se hace tan tediosa la búsqueda debido a que cada codigo se le hizo un hipervínculo para que muestre una foto y la verdad son dos hojas y cada una tiene 6246 filas, le agradeceria algun apoyo para facilitar la busqueda.. Gracias

    • Miguel dijo:

      Entiendo que estas haciendo la búsqueda visual….
      Supongo que en el link, osea en la celda de la imagen utilizasteis un código o algo que identificaba el producto; si es así, se me ocurren dos posibilidades, la primera y mas sencilla es utiliza el Buscar de Excel, ya que le puedes decir que busque por contenido de la celda, por formula, por…..
      La otra, un poco mas compleja es que añadas una columna a la hoja, y en esa columna, con las funciones de texto, extraigas de la celda de imagen el código que hay guardado. Después ya podrás clasificar por esa columna

  6. gustavo dijo:

    Hola Miguel. Gracias por tus interesantes Posts
    y recibe un cordial Saludo Desde Valencia Venezuela.

    Te tengo una preguntilla:

    Qué instrucción puedo usar para identificar el nombre de una tabla y asignar ese nombre a una variable string?.

    por egemplo: al ubicarme en el encabezado de la Tabla12, Qué instrucción o comando (?????????) debo usar para lo siguiente:

    codigo VBA:
    TablaActiva = ?????????

    donde el valor resultante de la variable TablaActiva=”Tabla12″ por ejemplo

    Muchas gracias por tu ayuda

    • Miguel dijo:

      Mira a ver si esto te sirve:
      Sub DetermineActiveTable()

      Dim SelectedCell As Range
      Dim TableName As String
      Dim ActiveTable As ListObject

      Set SelectedCell = ActiveCell

      'Determine if ActiveCell is inside a Table
      On Error GoTo NoTableSelected
      TableName = SelectedCell.ListObject.Name
      Set ActiveTable = ActiveSheet.ListObjects(TableName)
      On Error GoTo 0

      'Do something with your table variable (ie Add a row to the bottom of the ActiveTable)
      ActiveTable.ListRows.Add AlwaysInsert:=True

      Exit Sub

      'Error Handling
      NoTableSelected:
      MsgBox "There is no Table currently selected!", vbCritical

      End Sub

      • Gustavo dijo:

        WOW!! No pensé que fuese tan complejo averiguar el nombre de la tabla. Pero muchísimas gracias por responder. Voy a ver como lo adapto a mi problemita.

        Un abrazo y muchos éxitos.

      • Gustavo dijo:

        UN MILLÓN DE GRACIAS QUERIDO MIGUEL!!!!

        Me has resuelto el problema que me tenía parado casi una semanita jeje. De tus líneas de código, solo utilice una fracción y LISTOOO!!! Súper Nice. A continuación te escribo lo que necesité de tu código para saber el nombre de la tabla donde esta posicionado el apuntador que es la cabecera de una tabla:
        Dim SelectedCell As Range
        Dim TableName As String
        Dim ActiveTable As ListObject

        Set SelectedCell = ActiveCell

        ‘Determine if ActiveCell is inside a Table
        On Error GoTo NoTableSelected
        TableName = SelectedCell.ListObject.Name

        Felicitaciones por tu blog. Lo seguiré muy atentamente.
        Un abrazo de muchos exitos

        • Miguel dijo:

          Gracias por el feedback. Disculpa pero iba mal de tiempo, y no pude extraer solo la parte que te interesaba,y pensé que de cualquier forma, nunca es malo tener mas informacion

          • Gustavo dijo:

            Seguro que me imagine que así fue. De todos modos de ese código completo saque más información necesaria para otro caso que tengo por acá.

            Felicidades

  7. Alvaro dijo:

    Hola Miguel, te comento mi problema.

    Tengo una base de datos con muchas entradas y quisiera que poniendo el contenido a buscar en una de las celdas de una hoja diferente (y luego ejecutando el macro) me eliminase la fila en la base de datos que contenga ese contenido.

    Gracias de antemano.

    • Miguel dijo:

      Hola Alvaro.
      Aunque puedes partir del ejemplo que incorpora el articulo, y unavez encontrada la coincidencia utilizar.Algo como esto:
      zona=Range(“A:A”)
      Set c = zona.Find(“CASA”, lookin:=xlValues)
      If Not c Is Nothing Then
      c.select
      Selection.EntireRow.Delete
      End If

      Puede que te sea mas facil adaptar esta macro: http://www.excelnegocios.com/macro-eliminar-celdas-vacias/

      • Alvaro dijo:

        Gracias por tu pronta respuesta.

        Ese macro que me propones buscaría siempre el mismo valor, no es así?

        El valor a buscar está en una celda y, por supuesto, el valor cambia cada vez que quiero eliminar una entrada. Me valdrían los ejemplos en los que sale una ventana emergente preguntándote por le valor que deseo buscar, pero la mayoría de las veces tengo que eliminar 20 valores distintos de la base de datos.

        No sé si será mucho lo que pido … :p

        Saludos!

        • Miguel dijo:

          Alvaro: Tal y como está planteada la macro,borra siempre un valor, pero la idea es que utilices el articulo como modelo, para que lo adaptes a tus necesidades.
          Pienso que pedir que yo haga tu trabajo, o una de dos: valoras tan poco tu trabajo que piensas que cualquiera lo puede hacer, o si: Pides mucho

          • Alvaro dijo:

            Hola de nuevo y perdón por el retraso en la respuesta. Creo que me has malinterpretado ya que no quería ni quiero que haga nadie mi trabajo, solo que mi conocimiento acerca de la codificación en VBA es limitado y pregunté por si habia alguna solución más sencilla que desconociese.

            Créeme, he pasado horas intentando buscar una solución a mi problema visitando muchas páginas webs y adaptando como buenamente he podido el contenido de algunos macros publicados.

            Gracias por tu tiempo, saludos!

  8. Alvaro dijo:

    Gracias por tu pronta respuesta.

    Ese macro que me propones buscaría siempre el mismo valor, no es así?

    El valor a buscar está en una celda y, por supuesto, el valor cambia cada vez que quiero eliminar una entrada. Me valdrían los ejemplos en los que sale una ventana emergente preguntándote por le valor que deseo buscar, pero la mayoría de las veces tengo que eliminar 20 valores distintos de la base de datos.

    No sé si será mucho lo que pido … :p

    Saludos!

  9. Daniel Rosales dijo:

    Buenas tardes Migue,

    Necesito tu ayuda. Mira siempre el resultado que me da la macro adjunta es: Date es Nothing y necesito que la FechaPosterior se busque en una hoja de excel. Pero la fecha inicia con 01/02/2016 y la siguiente tiene una formula (=A1+1) para obtener 02/02/2016 y asi sucesivamente. Que puedo hacer para que la encuentre y entre al argumento que necesito?
    Sera por formato? o el find no lo he aplicado correctamente ?

    Dim FechaActual As Date
    Dim FechaPosterior As Date
    Dim Dato As Range

    FechaActual = 01/01/2016

    FechaPosterior = DateAdd(“d”, 1, FechaActual)

    With Hoja1.Cells
    Set Dato = .Find(FechaPosterior, LookIn:=xlValues)
    If Not Dato Is Nothing Then ‘ utilizo el not dato porque esta en un “for” y salta si no encuentra la fecha

    End If
    End With

    • Miguel dijo:

      Lo que veo no haces bien, es cargar la fecha. Para llenar un campo date desde una cadena de caracteres, has de hacer
      FechaActual = DateValue(“1 / 1 / 2016”)

  10. Hola, favor indicar cuál sería el código de macro Excel VBA para restaurar la configuración por defecto cuando se hace una búsqueda. Es que por ejemplo, cuando se hace una búsqueda activando “Coincidir con el contenido de toda la celda”, cuando se termina la macro, sigue activada dicha opción y necesito que antes de salir de la macro se desactive dicha opción y quede con la configuración por defecto.

  11. Armando dijo:

    Interesante. Cómo podría usarse para posicionarse en un registro donde la columna A fuera x fecha, la columna B fuera un número de repartidor y la columna C fuera un número de cliente?
    Habría que anidarlo? o se puede usar .Find con varios criterios?

  12. Marco Antonio dijo:

    Una consulta Por favor.
    cuando utilizo el siguiente código
    Find(What:=Día), siendo Día la fecha, o sea: 1, 2, 3…….31

    Cuando el día es 1 (primero), el macro realiza todo pero siempre para el 10, no para le primero
    Cunado es para otros días diferentes de 1, lo realiza sin ningún problema para le día q corresponde

    Que error puede haber en el macro

    Gracias

  13. Graciela dijo:

    Muchas gracias por su explicación, me ha sido de mucha ayuda 😀

Deja un comentario