Realice una búsqueda V en Excel para varias líneas de datos con el mismo valor de búsqueda (clave principal)

Realice una búsqueda V en Excel para varias líneas de datos con el mismo valor de búsqueda (clave principal)

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 F1y su tabla se llama Table1, ingresa lo siguiente comofórmula matricial(use control-shift-enter, en lugar de enter). SimpleCates su función de hoja de trabajo de concatenación de VBA.

=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))

Uno SimpleCatque 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 SimpleCatlo 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 TRUEs y FALSEs. El uso de an IFconstruirá una nueva matriz, extrayendo valores de la posición correcta de la matriz que está usando en el lado valor si es verdadero de IFy completando la cadena vacía que está usando en el lado valor si es falso de IF. La SimpleCatfunció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)

información relacionada