Logo_excel

Esta es una variante de la función Buscar o Vlookup de Excel que me he implementado para poder darle mayor flexibilidad a mis hojas excel. Se llama VLOOKUP Modificado y con la que se pueden realizar búsquedas condicionales.

Como no soy experto en VBA, la función puede tardar mucho en ejecutarse si se utiliza sobre mucha cantidad de filas. Aunque está diseñada para que realice las menos iteraciones posibles en el bucle. No se ha implementado con ningún algoritmo de búsqueda avanzado.

La función sería:

'VLOOKUP que busca la celda proporcionada en otra columna (col_n) que no sea la 1a, y devuelve el resultado de la columna (col_result)
'col_resultado = numero de la columna resultado a devolver
'col_n = numero de la columna sobre la que hacemos la buqueda

Function VLOOKUP_ncol(valor_buscar As Variant, rango As Range, col_n As Integer, col_result As Integer)

Dim CurCell As Variant

For Each f In rango.Rows
   If (f.Cells(1, col_n) = valor_buscar) Then
      CurCell = f.Cells(1, col_result)
      Exit For
   End If
Next f

VLOOKUP_ncol = CurCell

End Function

Usando el algoritmo de búsqueda rápida sería lo siguiente, pero sólo sería aplicable si la columna sobre la que buscamos está ordenada ascendentemente:

(De momento sólo la he probado con una columna de búsqueda de tipo Number)

Function VLOOKUP_ncol(valor_buscar As Variant, rango As Range, col_busq As Integer, col_result As Integer)
' Usa algoritmo de búsqueda rápida
' Descripción de los parámetros:
' - valor_buscar: Valor a buscar en la columna "col_busq"
' - rango: rango sobre el que buscar. Debe ser un rango finito: 'Sheet1'!H$2:P$253
' - col_busq: Columna sobre la que se hace la búsqueda de "valor_buscar"
' - col_result: Columna resultado que se quiere obtener
' Los valores de col_busq y col_result van de 1..N
' Ejemplo:
'     =VLOOKUP_bin(P33;'Sheet1'!H$2:P$253;9;1)

Dim result, izq, der, cen As Integer

izq = 0
der = rango.Rows.Count - 1
result = ""

Do While (izq <= der)
   cen = (izq + der) / 2

   If (rango.Columns(col_busq).Cells(cen, 1) = valor_buscar) Then
      result = rango.Columns(col_result).Cells(cen, 1)
      Exit Do
   End If

   If (valor_buscar > rango.Columns(col_busq).Cells(cen, 1)) Then
      izq = cen + 1
   Else
      der = cen - 1
   End If
Loop

VLOOKUP_ncol = result

End Function

El VLOOKUP original de Excel te obliga a buscar sobre la primera columna del rango de búsqueda. Con esta función podemos buscar sobre cualquier columna del rango y devolver la columna que queramos.

Herramienta ExcelFIX

Repara tus archivos Excel en menos de 15 minutos y recupera tu información fácilmente. Pruébalo GRATIS.

  • Garantía de devolución completa si no consigues reparar tu archivo
  • Repara en menos 15 de minutos
  • Soporte técnico gratuito
  • Herramienta recomendada por Microsoft
  • Disponible versión de prueba

Si te ha parecido interesante, pincha en la imagen para acceder a la versión de muestra que podrás descargar gratuitamente. Si decides comprarlo, me estarás ayudando a mantener el blog para poder seguir escribiendo artículos como este. Muchas gracias.

Advertisements

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies

Pin It on Pinterest

Share This

Compártelo

¡Comparte este artículo con tus amigos!