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)
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.
112 comentarios
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
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
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
Gracias
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.
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.
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!
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.
no te faltó el xlWhole…?
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….
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
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
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
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
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.
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
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
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
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
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.
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/
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.
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!
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!
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
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»)
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
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.
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?
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?
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
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
Muchas gracias por su explicación, me ha sido de mucha ayuda 😀