EJEMPLO PRÁCTICO DE UNA UDF PARA RESOLVER UNA TAREA ESPECÍFICA

Hola a todos:

Como podéis comprobar, estos últimos post que estoy subiendo a la web están muy relacionados con las UDF (funciones definidas por el usuario). Y es que precisamente el poder definir nuestras propias funciones es lo que nos permite realizar nuestro trabajo con mayor facilidad.

Muchas veces recibo consultas de cómo hacer determinados procesos o cómo programar un evento específico. Hoy os dejo un ejemplo de una de esas consultas:

“Hola Segu. Tengo una tabla de datos la cual consta de varias columnas con diferentes marcas, y en las filas tengo códigos únicos, lo que deseo hacer es que de alguna manera colocar el código único en una celda fuera de la tabla, y que me retorne la o las marcas que tiene ese código, es decir en donde la función encuentre el número uno, entonces colocar el nombre de la marca que se encuentra en el encabezado.”

Efectivamente, lo que vamos a realizar se puede ver perfectamente en el ejemplo que me envió:

EJEMPLO PRÁCTICO DE UNA UDF PARA RESOLVER UNA TAREA ESPECÍFICA

Como podéis comprobar, se trata de rellenar el dato en las celdas B7,B8 y B9 con las “Marcas” de la fila 1 siempre que el código tenga un “1” asignado en rango horizontal.

Para poder hacerlo tal y como lo necesita el lector, usaremos la siguiente UDF:

Option Explicit
Function BUSCA_REF(ByVal DATO_BUSCADO As Variant, RANGO_BUSQUEDA As Range, RANGO_HORIZONTAL As Range, PARAMETRO As String)
'Declaramos variables
Dim HOJA As String, CELDAV As Object, CELDAH As Object, CELDA_ACTUAL As String, RANGO_ACTUAL As Range
Dim FILA As String, nCOLUMN As String, DATO As String, CONT As Long
'Capturamos la hoja en la que se encuentra el rango de búsqueda
HOJA = RANGO_BUSQUEDA.Parent.Name
'Buscamos el dato seleccionado en el rango de búsqueda
For Each CELDAV In RANGO_BUSQUEDA
'Si coincide entonces
If UCase(CELDAV) = UCase(DATO_BUSCADO) Then
'obtenemos el número de celda en el que nos encontramos
CELDA_ACTUAL = Replace(Split(CELDAV.Address, "$")(2), ":", "")
'Componemos nuevo rango horizontal a buscar
Set RANGO_ACTUAL = Sheets(HOJA).Range(Replace(Split(RANGO_HORIZONTAL.Address, "$")(1), ":", "") & CELDA_ACTUAL & ":" & Replace(Split(RANGO_HORIZONTAL.Address, "$")(3), ":", "") & CELDA_ACTUAL)
'Buscamos en el rango horizontal
For Each CELDAH In RANGO_ACTUAL
'Si encontramos el valor igual al parámetro (en este ejemplo "1")
If CELDAH = PARAMETRO Then
'Seleccionamos el encabezado de la hoja
'compuesto por el número de fila y letra de columna actual
FILA = Replace(Split(RANGO_HORIZONTAL.Address, "$")(2), ":", "")
nCOLUMN = Replace(Split(CELDAH.Address, "$")(1), ":", "")
DATO = DATO & " " & Sheets(HOJA).Range(nCOLUMN & FILA)
End If
Next CELDAH
CONT = CONT + 1
End If
Next CELDAV
'Pasamos resultado a la función
'si el valor buscado no existe pasamos un error
If CONT = 0 Then
BUSCA_REF = "#N/A"
Else
'si existe pero no tiene el parámetro buscado pasamos un 0, sino el dato
BUSCA_REF = IIf(DATO = vbNullString, 0, DATO)
End If
End Function

Como siempre el código lo he comentado muy detalladamente para que no tengáis dudas. Por supuesto, este trabajo lo podemos hacer también con código en una macro sin utilizar una función, pero el lector prefería que fuese una UDF.

La función está habilitada para funcionar en distintas hojas y se actualiza con cada cambio.

Los parámetros a tener en cuenta son:

  • El DATO_BUSCADO: el dato que queremos buscar en la matriz.
  • El RANGO_BUSQUEDA: el rango vertical en el que se encuentra el código a buscar.
  • El RANGO_HORIZONTAL: es la selección de todo el rango, tanto encabezados como las celdas con información.
  • PARÁMETRO: es el parámetro sobre el que basamos la búsqueda, por ejemplo “1”. Entre comillas dobles.

Aquí podéis ver la fórmula aplicada:

EJEMPLO PRÁCTICO DE UNA UDF PARA RESOLVER UNA TAREA ESPECÍFICA_1

Y esto es todo, aquí podéis ver el ejemplo de cómo creando nuestra propia función podemos obtener lo que necesitamos.

Descarga el archivo de ejemplo pulsando en: EJEMPLO PRÁCTICO DE UNA UDF PARA RESOLVER UNA TAREA ESPECÍFICA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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

Anuncios