Excel - ¿Cómo vlookup para devolver múltiples valores?

18

Estoy buscando usar Excel para buscar y devolver múltiples valores de referencia para una clave determinada. VLookup hace algo muy similar a lo que necesito, pero solo devuelve una sola coincidencia.

Supongo que implicará métodos de manejo y devolución de matrices, aunque no los he tratado antes. Algunos Google comienzan a apoyarse en if ([lookuparray] = [value], row [lookuparray]) como parte de una solución, aunque no puedo hacer que devuelva una sola coincidencia ...

Por ejemplo, si tengo estos datos de referencia:

Adam    Red
Adam    Green
Adam    Blue
Bob     Red
Bob     Yellow
Bob     Green
Carl    Red 

Estoy tratando de obtener los múltiples valores de retorno a la derecha. (Coma separada, si es posible)

Red      Adam, Bob, Carl
Green    Adam, Bob
Blue     Adam
Yellow   Bob

(Ya tengo el valor clave a la izquierda, no es necesario extraer esos valores)

Cualquier ayuda sobre cómo abordar el manejo de múltiples valores en este contexto es apreciada. Gracias.

sobrevolado
fuente

Respuestas:

13

Suponiendo que desea un enfoque de fórmula como se indicó (sin usar BUSCARV, pero aún así es una fórmula), así es como presenté los datos:

Diseño de datos

Luego usé la siguiente fórmula en la celda C12:

=INDEX($C$2:$C$8, SMALL(IF($B12=$B$2:$B$8, ROW($B$2:$B$8)-MIN(ROW($B$2:$B$8))+1, ""), 1))

Esta es una fórmula de matriz, así que después de copiarla y pegarla en la celda, debe presionar Ctrl+Shift+Enter. Luego simplemente lo arrastré hacia la derecha y hacia abajo.

Si no quedan valores, da el #NUM!error, di un ejemplo para el amarillo en el ejemplo de la imagen cargada.

Creo que un enfoque VBA / Macro sería una mejor solución si tienes toneladas de filas.

Dan
fuente
Para aquellos que buscan sumar valores recuperados (donde el orden no importa), es más simple usar IF con una matriz:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox
Intenté esta fórmula, pero el resultado que obtengo después de arrastrarlo hacia abajo y hacia abajo solo devuelve a Adam y Bob: ¿estoy haciendo algo mal? Ver captura de pantalla aquí snag.gy/qW7UKM.jpg
ziggy
@ziggy ¿presionaste ctrl + shift + enter?
Dan
5
  1. Cambie las columnas para que los colores estén en la columna A y los nombres en la columna B, y luego ordene el color.

  2. Fórmula en C2 (cópielo en la columna): = SI (A2 <> A1, B2, C1 y "," y B2)

  3. Fórmula en D2 (cópielo en la columna): = A2 <> A3

  4. Filtre "VERDADERO" en la columna D para obtener los resultados deseados. Vea abajo:

ingrese la descripción de la imagen aquí

F106dart
fuente
TIL puede usar el operador "&" en lugar de la fórmula CONCATENATE (). ¡Gracias!
bpcookson
3

Si desea un enfoque de fórmula, es mucho más simple obtener los resultados en celdas separadas, así que supongamos que su primera tabla es A2: B8 y los colores se enumeran nuevamente en D2: D5. Prueba esta fórmula en E2

=IFERROR(INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))),"")

confirmado CTRL+SHIFT+ENTERy copiado de un lado a otro. Cuando los partidos se agotan, obtienes espacios en blanco.

La fórmula asume Excel 2007 o posterior; si es una versión anterior, puede usar COUNTIF en lugar de IFERROR, es decir

=IF(COLUMNS($E2:E2)>COUNTIF($B$2:$B$8,$D2),"",INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))))

barry houdini
fuente
3

Aquí está la solución de VBA para usted. Primero, así es como se ven los resultados:

Captura de pantalla

Y aquí está el código:

Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function
Tostadas de ingeniero
fuente