Hola a todos!!
¿Qué tal estáis?, espero que bien y que hayáis descansado en vuestras vacaciones. Hoy retomo las publicaciones de la web y estoy seguro que la de hoy os va a resultar muy interesante.
Hace unas semanas se publicó en todos las redes la aparición de una nueva función de búsqueda: «BUSCARX«. Esta función viene a dar solución a muchas de las carencias que tenía la fórmula BUSCARV y también ampliar funcionalidades. Esta nueva fórmula no estará disponible para todos hasta el año que viene y eso es lo que me ha hecho reflexionar sobre las carencias actuales de BUSCARV y todo lo que podemos hacer nosotros, como usuarios de VBA para encontrar soluciones.
Por lo tanto, he creado una nueva función que he denominado BUSCARZ y en la que podremos hacer lo siguiente:
- Buscar valores a la izquierda de la matriz.
- Mostrar el primer valor encontrado desde «arriba hacia abajo» (descendente).
- Mostrar el primer valor encontrado desde «abajo hacia arriba» (ascendente).
- Mostrar todas las coincidencias en una búsqueda.
Os presento el código de la función:
Option Explicit
Function BUSCARZ(ByVal DATO_BUSCADO As Variant, RANGO_BUSQUEDA As Range, COLUMNA As String, TIPO_BUSQUEDA As Integer)
'Declaramos variables
Dim nCOLUMN As String, nCELDA As String, CELDA As Variant
Dim VALOR_INICIAL As String, VALOR_FINAL As String
Dim VALOR_TOTAL As String, TODOS As String, HOJA As String
'capturamos hoja en la que se buscan datos
HOJA = RANGO_BUSQUEDA.Parent.Name
If IsNumeric(COLUMNA) Then COLUMNA = Split(Sheets(HOJA).Cells(1, CInt(COLUMNA)).Address, "$")(1)
'Indicamos letra de la columna
nCOLUMN = COLUMNA
'nCOLUMN = Replace(Split(COLUMNA.Address, "$")(1), ":", "")
'Por cada celda en el rango seleccionado de búsqueda
For Each CELDA In RANGO_BUSQUEDA
'Si la celda no igual al dato seleccionado entonces indicamos #N/A
If UCase(CELDA) <> UCase(DATO_BUSCADO) Then BUSCARZ = "#N/A"
'Si la celda es igual al dato seleccionado entonces
If UCase(CELDA) Like UCase(DATO_BUSCADO) Then
'Obtenemos numero de la celda en el que estamos
nCELDA = Split(CELDA.Address, "$")(2)
'Si el tipo de busqueda no es 2 o 3, entonces obtenemos el primer valor encontrado
'buscando de forma descendente
If TIPO_BUSQUEDA > 3 Or TIPO_BUSQUEDA <= 1 Then
VALOR_INICIAL = Sheets(HOJA).Range(nCOLUMN & nCELDA)
'Pasamos el valor a la función
BUSCARZ = VALOR_INICIAL
Exit For
End If
'Obtenemos el valor final
VALOR_FINAL = Sheets(HOJA).Range(nCOLUMN & nCELDA)
'obtenemos string con todos los valores encontrados
TODOS = Trim(TODOS & "|" & VALOR_FINAL)
VALOR_TOTAL = Mid(TODOS, 2, Len(TODOS))
End If
'Pasamos los valores a la función
If TIPO_BUSQUEDA = 2 Then
BUSCARZ = IIf(VALOR_FINAL = "", "#N/A", VALOR_FINAL)
ElseIf TIPO_BUSQUEDA = 3 Then
BUSCARZ = IIf(VALOR_TOTAL = "", "#N/A", VALOR_TOTAL)
End If
Next CELDA
End Function
La sintaxis de la función es la siguiente:
- DATO_BUSCADO: Es el valor que vamos a buscar. Podemos hacer referencia o indicar el valor entre comillas dobles » «.
- RANGO_BUSQUEDA: Es el rango sobre el que buscamos los datos.
- COLUMNA: Determina la columna sobre la que vamos a extraer la información.
- TIPO_BUSQUEDA: a elegir sobre tres tipos:
- 1 – Mostrar el primer valor encontrado desde «arriba hacia abajo» (descendente).
- 2 – Mostrar el primer valor encontrado desde «abajo hacia arriba» (ascendente).
- 3 – Mostrar todas las coincidencias en una búsqueda. Entre cada resultado se añade una barra vertical.
Llegados a este punto, creo que lo interesante será hacer un ejemplo. Empezaremos con una búsqueda de tipo 1 y de datos a la izquierda, traemos información de la columna «A».

Búsqueda de tipo 2 y de datos a la izquierda, traemos información de la columna «A».

Búsqueda de tipo 3 y de datos a la izquierda, traemos información agrupada de la columna «A».

La función también permite buscar en otras páginas y otros libros.
Nota: esta función la he programado en unas pocas horas. Si notáis que algo no funciona correctamente, por favor, pasadme feed.
Aunque son algunas mejoras interesantes, tengo pensado añadir y ampliar nuevas funcionalidades, así que iré actualizando el post en distintas publicaciones.
Ahora os dejo el archivo de prueba como siempre.
Descarga el archivo de ejemplo pulsando en:

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Llevo meses intentando algo parecido para un archivo en mi trabajo y acabo de conseguir lo que quería por tu post.
Muchas gracias!!!!
Gracias Edu.
Saludos!!