Excel - Como vlookup para retornar vários valores?


18

Estou procurando usar o Excel para procurar e retornar vários valores de referência para uma determinada chave. O VLookup faz algo muito semelhante ao que eu preciso - mas retorna apenas uma única correspondência.

Suponho que envolverá métodos de retorno e manipulação de matriz, embora eu não tenha lidado com isso antes. Alguns usuários do Google começam a se apoiar no if ([lookuparray] = [value], row [lookuparray]) como parte de uma solução - embora eu não consiga fazê-lo retornar uma única partida ...

Por exemplo, se eu tiver esses dados de referência:

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

Estou tentando obter os vários valores de retorno à direita. (Separado por vírgula, se possível)

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

(Eu já tenho o valor da chave à esquerda - não é necessário extrair esses valores)

Qualquer ajuda sobre como abordar a manipulação de vários valores nesse contexto é apreciada. Obrigado.

Respostas:


13

Supondo que você queira uma abordagem de fórmula conforme declarado (sem usar o VLOOKUP, mas ainda assim uma fórmula), eis como eu expus os dados:

Layout de dados

Em seguida, usei a seguinte fórmula na célula 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 é uma fórmula de matriz; portanto, depois de copiar e colar na célula, é necessário pressionar Ctrl+Shift+Enter. Depois, arrastei-o para a direita e para o fundo.

Se não houver nenhum (s) valor (es) restante (s), dê o #NUM!exemplo de amarelo no exemplo da imagem carregada.

Eu acho que uma abordagem VBA / Macro seria uma solução melhor se você tiver toneladas de linhas.


Para aqueles que procuram somar valores recuperados (onde a ordem não importa), que é mais simples de usar IF com uma matriz:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

Eu tentei essa fórmula, mas a saída que estou obtendo depois de arrastar a parte inferior e inferior apenas retorna Adam e Bob - estou fazendo algo errado? Veja a captura de tela aqui snag.gy/qW7UKM.jpg
ziggy

@ziggy você apertou ctrl + shift + enter?
Dan

5
  1. Troque as colunas para que as cores estejam na coluna A e os nomes na coluna B e depois classifique a cor.

  2. Fórmula em C2 (copie-a na coluna): = SE (A2 <> A1, B2, C1 & "," & B2)

  3. Fórmula em D2 (copie-a na coluna): = A2 <> A3

  4. Filtre "TRUE" na coluna D para obter os resultados desejados. Ver abaixo:

insira a descrição da imagem aqui


ATÉ que você possa usar o operador "&" em vez da fórmula CONCATENATE () desajeitada. Obrigado!
bpcookson 5/09

3

Se você deseja uma abordagem de fórmula, é muito mais simples obter os resultados em células separadas, então vamos supor que sua primeira tabela seja A2: B8 e as cores sejam listadas novamente em D2: D5. Experimente esta fórmula no 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+ENTERe copiado de um lado para o outro. Quando os jogos acabam, você recebe espaços em branco.

A fórmula assume o Excel 2007 ou posterior - se a versão anterior, você pode usar COUNTIF em vez de IFERROR, ou seja,

=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

Aqui está a solução VBA para você. Primeiro, é assim que os resultados são:

Captura de tela

E aqui está o 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.