Código VBA para buscar celdas en un rango - Range.Find
El método Find
de la clase Range
se utiliza para buscar celdas que contengan un valor o formato determinado en un rango.
Buscar en la hoja de cálculo
En su forma básica, Find se llama como el código siguiente, que selecciona la celda encontrada. El código sólo funcionará si el valor está realmente presente en la hoja de cálculo.
ActiveSheet.UsedRange.Find(What:="x").Select
ActiveSheet
para proporcionar el objeto Hoja de cálculo
padre cuya clase Range
se está utilizando. En código real es preferible utilizar variables de objeto explícitamente declaradas y asignadas, en este caso: Dim wsActiveSheet As Worksheet
: Set wsActiveSheet = ActiveSheet
, muy probablemente con otra expresión de asignación de objeto.
El objeto de clase Range
se obtiene aquí del procedimiento Worksheet UsedRange
.
El procedimiento devuelve un objeto de tipo Range que se asigna opcionalmente a una variable rngFound
.
Generalmente, se utilizará una variable, aquí: strWhat
para asignar el parámetro What
.
Dim strWhat As String: strWhat =
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:=strWhat)
El método Find
devuelve Nothing
si no se encuentra ninguna coincidencia.
Buscar en rango
Buscar valor en columna
El código siguiente le permite encontrar una celda que contenga el valor de una columna determinada.
Dim rngColumn As Range
Set rngColumn = ActiveSheet.Columns(3)
Dim rngFound As Range
Set rngFound = rngColumn.Find(What:="x").Select
Buscar valor en la fila
Utilice el siguiente código para encontrar una celda que contenga el valor en una fila.
Dim rngRow As Range
Set rngRow = ActiveSheet.Rows(8)
Dim rngFound As Range
Set rngFound = rngRow.Find(What:="x")
Qué: especificar criterios de búsqueda
Encuentre lo que
Los datos a buscar. Puede ser una cadena o cualquier tipo de dato de Microsoft Excel. Algunos consejos sobre los valores adecuados de los parámetros:
- Para buscar valores numéricos, utilice
Lookin:
=xlFormulas
yLookAt:=xlWhole
- Cuando busque valores de fecha utilice
Lookin:=xlFormulas
yLookAt:=xlWhole
. La fecha suministrada debe ser como25/02/2024
que se puede obtener utilizandoFormatDateTime(dtDate, vbGeneralDate)
- Al buscar valores numéricos,
LookAt:=xlPart
puede hacer que encuentre más números de los que desea: si busca 1 también obtendrá 301, 12 y así sucesivamente. - Si las columnas son más pequeñas, es posible que las celdas no muestren el valor, sino ###. Puede estar más seguro combinando con
Lookin:=xlFormulas
After: celda de inicio de la búsqueda
Si se ha especificado After
, la búsqueda comienza después de esta celda; la celda especificada no se busca hasta que el método vuelve a esta celda.
After
debe ser una única celda del rango.
Si no es así, se obtiene el .El código siguiente inicia la búsqueda después de la celda activa imitando el cuadro de diálogo Buscar
Dim rngFound As Range
Set rngFound = ws.UsedRange.Find(What:="x", After:=ActiveCell)
LookIn: Fórmulas, Valores, Notas, Comentarios
Puede ser una de las siguientes constantes XlFindLookIn: xlFormulas (Fórmulas), xlValues (Valores), xlComments (Notas) o xlCommentsThreaded (Comentarios).
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", LookIn:=xlComments)
xlFormulas vs xlValores
La diferencia entre Buscar fórmulas o valores puede observarse experimentalmente. Ponga en A1 el valor x y en B1 la fórmula =A1. En el diálogo Buscar pulse Buscar todo. Con Fórmulas seleccionadas sólo se encuentra A1 mientras que con Valores se encuentran tanto A1 como B1.
- Fórmulas mira lo que contiene la celda como lo que está disponible en la barra de fórmulas;
- Los valores coinciden con lo que se muestra como valor en la celda de la cuadrícula.
LookIn
, LookAt
y SearchOrder
explícitamente cada vez que utilice el método Find
.
LookAt: Coincidir con todo el contenido de la celda
Puede ser una de las siguientes constantes XlLookAt: xlWhole o xlPart. Utilice xlWhole si necesita encontrar una celda con un texto específico.
Añada MatchCase:=True
si necesita encontrar una coincidencia exacta en el rango (distingue mayúsculas de minúsculas).
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", LookAt:=xlWhole, MatchCase:=True)
Uso de comodines
En Excel tiene un uso limitado de caracteres comodín en el argumento Buscar:
- un signo de interrogación (?) coincide con un carácter si está dentro de una cadena;
- poner un signo de interrogación al principio o al final también coincide si hay más de 1 carácter.
- Un asterisco (*) coincide con cualquier serie de caracteres.
Como ejemplo, el siguiente código encuentra cualquier celda que coincida con 'x'.
Set rngFound = ActiveSheet.UsedRange.Find(What:="?x*")
El procedimiento TestFindAll (parte inferior de la página) le ayuda a determinar qué resultados pueden esperarse con los argumentos de búsqueda dados.
Escribe la dirección
del rango en la ventana Inmediato: $B$1:$C$1,$C$2
SearchOrder: Filas o Columnas
Puede ser una de las siguientes constantes XlSearchOrder: xlByRows o xlByColumns.
- Buscar por columna significa buscar primero en todas las celdas de la columna A, luego en la columna B, etc.
- Buscar por fila significa buscar primero en todas las celdas de la fila 1, luego en la fila 2, etc.
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", SearchOrder:=xlByRows)
SearchDirection: Buscar siguiente
La dirección de búsqueda junto con SearchOrder determinará Cuáles serán las siguientes celdas. La combinación inferior se moverá en columnas hacia arriba, por ejemplo, suponiendo que UsedRange la última celda es B6: B6, B5, B4...
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious)
Búsqueda por rangos con criterios múltiples
Para encontrar celdas que coincidan con patrones más complicados puede utilizar una sentencia For Each...Next con:
- el operador Like,
- Aplicar pruebas booleanas combinadas mediante And, Or, etcétera.
Por ejemplo, el siguiente código busca todas las celdas del rango A1:C5 que utilicen una fuente cuyo nombre empiece por las letras Cour. Cuando Microsoft Excel encuentra una coincidencia, cambia la fuente a Times New Roman.
Dim rngCells As Range
Set rngCells = ActiveSheet.UsedRange.Cells
Dim rngCell As Range
Dim rngFound As Range
For Each rngCell In rngCells
If rngCell.Font.Name Like "Cour*" Then
Set rngFound = rngCell
Exit For
End If
Next rngCell
SearchFormat: Formato...
Devuelve celdas sólo con cierto formato aplicado (fuente, color de fondo,...).
El siguiente ejemplo muestra que puede encontrar todas las celdas que tienen un color de fondo utilizando una cadena vacía para el parámetro Qué
. Descomente . Color = 65535
para obtener las celdas marcadas en amarillo. Alternativamente puede filtrar las celdas por Font.Bold
u otras propiedades de la celda.
Qué
como SearchFormat
encuentra sólo las celdas que coinciden con ambos criterios.
Sub Demo() With Application.FindFormat .Clear ' .Font.Bold = True
With .Interior
.Pattern = xlSolid '.Color = 65535 'rgbYellow
End With
ActiveSheet.UsedRange.Find(After:=ActiveCell, What:="", SearchFormat:=True).Select
Application.FindFormat.Clear
End Sub
Borrar
el FindFormat
(tanto antes como) después de ejecutar el Find
.MatchByte: por ejemplo, japonés y chino
Sólo se utiliza si ha seleccionado o instalado el soporte de idiomas de doble byte. True para que los caracteres de doble byte coincidan sólo con caracteres de doble byte. Falso para que los caracteres de doble byte coincidan con sus equivalentes de un byte.
Autor: Mark Uildriks Referencia: Range.Find(Excel) | Microsoft Learn