Quiero hacer una búsqueda en V de nombres que tengan varias líneas para la misma clave principal:
Deal ID (Primary Key) | Name
437 | Tom Jones
437 | Frank Thomas
437 | Mary Smith
Vlookup solo devolverá el primer nombre del registro (Tom Jones). Lo que me gustaría que se viera así es: Tom Jones, Frank Thomas, Mary Smith, todos en la misma línea.
Respuesta1
Parece que estás intentando utilizar Excel como una base de datos relacional, algo en lo que no es tan bueno. Para colmo, a menos que haya habido un cambio en los últimos años (no he tenido el placer de usar nada posterior a Excel 2010), no existe una función de hoja de cálculo para convertir un rango o matriz en una cadena delimitada. Tendrás que crear una función de hoja de trabajo de VBA que haga eso.
Puede utilizar una combinación de fórmula matricial y VBA para hacer lo que quiera. Antes de continuar, le sugiero encarecidamente que utilice un programa de base de datos real si se encuentra haciendo cosas como esta con regularidad. He abusado de Excel para realizar tareas simples similares a las de una base de datos relacional en el pasado, pero solo tareas simples. Si tuviera que hacer algo más complejo, habría sido extremadamente doloroso.
Suponiendo que su ID para buscar está en la celda F1
y su tabla se llama Table1
, ingresa lo siguiente comofórmula matricial(use control-shift-enter, en lugar de enter). SimpleCat
es su función de hoja de trabajo de concatenación de VBA.
=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))
Uno SimpleCat
que funcionará para esta instancia en particular es el siguiente:
Function SimpleCat(Args() As Variant) As Variant
Dim a As Variant
SimpleCat = ""
For Each a In Args
If a <> "" Then SimpleCat = SimpleCat & a & ", "
Next
If Len(SimpleCat) > 0 Then SimpleCat = Left$(SimpleCat, Len(SimpleCat) - 2)
End Function
Lo dejo como ejercicio para que lo amplíes y SimpleCat
lo hagas más general, ya que tener una función de concatenación genérica con más funciones es útil en la caja de herramientas de cualquiera.
Explicación:
Cuando se evalúa como una fórmula matricial, comparar una columna completa de la tabla con un solo valor producirá una matriz de TRUE
s y FALSE
s. El uso de an IF
construirá una nueva matriz, extrayendo valores de la posición correcta de la matriz que está usando en el lado valor si es verdadero de IF
y completando la cadena vacía que está usando en el lado valor si es falso de IF
. La SimpleCat
función coloca todos los valores que no están vacíos en esta nueva matriz junto con comas entre ellos.
Respuesta2
Dos problemas. Primero, esa no es una clave principal; En segundo lugar, no existe ninguna funcionalidad incorporada en Excel que le brinde el resultado que busca.
Una clave principal debe ser un identificador único vinculado a un único registro y que nunca jamás se repita. Para eso están diseñadas la mayoría de las funciones de búsqueda en Excel, razón por la cual se detienen cuando encuentran una coincidencia: ahorra recursos al no tener que buscar en todo el rango cada vez si ya se ha encontrado una coincidencia.
La única forma que veo para hacer el tipo de consolidación que está buscando aquí, reuniendo múltiples valores en una sola cadena, sería usar una macro o una función personalizada. Exactamente el código que necesita dependerá del resultado exacto que busca y, me temo, está fuera del alcance de esta respuesta.
Respuesta3
Tomaría esta función...
Function ConcatRange(inputRange As Range, Optional delimiter As String) As String
Dim oneCell As Range
Dim usedRange As Range
Set usedRange = Application.Intersect(inputRange.Parent.usedRange, inputRange.Cells)
If Not (usedRange Is Nothing) Then
For Each oneCell In usedRange
If oneCell.Text <> vbNullString Then
ConcatRange = ConcatRange & delimiter & Trim(oneCell.Text)
End If
Next oneCell
ConcatRange = Mid(ConcatRange, Len(delimiter) + 1)
End If
End Function
y modificarlo para hacer una nueva función que sería algo como:
Function ConcatIf(KeyRange as Range, KeyValue as Variant, DataColumnOffset As Integer)
donde recorrería cada celda dentro de KeyRange y, solo si su valor fuera igual a KeyValue, concatenaría el valor deoneCell.Offset(0, DataColumnOffset)