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.

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.


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í


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.