Excel - Как vlookup вернуть несколько значений?


18

Я использую Excel для поиска и возврата нескольких значений ссылки для данного ключа. VLookup делает что-то очень похожее на то, что мне нужно, но возвращает только одно совпадение.

Я предполагаю, что это будет включать в себя методы возврата и обработки массива, хотя раньше я с ними не сталкивался. Некоторое Гугление начинает опираться на if ([lookuparray] = [value], row [lookuparray]) как часть решения - хотя я не могу заставить его вернуть одно совпадение ...

Например, если у меня есть эти справочные данные:

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

Я пытаюсь получить несколько возвращаемых значений справа. (Через запятую, если возможно)

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

(У меня уже есть значение ключа слева - нет необходимости извлекать эти значения)

Любая помощь в том, как подходить к обработке нескольких значений в этом контексте, приветствуется. Благодарю.

Ответы:


13

Предполагая, что вы хотите использовать формульный подход, как указано (не используя VLOOKUP, но все же формулу), вот как я выложил данные:

Расположение данных

Затем я использовал следующую формулу в ячейке 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))

Это формула массива, поэтому после того, как вы скопируете и вставите ее в ячейку, вы должны нажать Ctrl+Shift+Enter. Затем я просто перетащил его вправо и вниз.

Если не осталось никаких значений, это выдает #NUM!ошибку, я привел пример для желтого цвета в примере загруженного изображения.

Я думаю, что VBA / Macro подход был бы лучшим решением, если у вас есть тонны строк.


Для тех, кто хочет суммировать полученные значения (где порядок не имеет значения), проще использовать IF с массивом:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

Я попробовал эту формулу, но вывод, который я получаю после перетаскивания через и ниже, возвращает только Адама и Боба - я делаю что-то не так? Смотрите скриншот здесь snag.gy/qW7UKM.jpg
ziggy

@ziggy ты нажал Ctrl + Shift + Enter?
Дан

5
  1. Поменяйте местами столбцы, чтобы цвета находились в столбце A, а имена - в столбце B, а затем сортируйте по цвету.

  2. Формула в C2 (скопируйте ее в столбец): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Формула в D2 (скопируйте ее в столбец): = A2 <> A3

  4. Выберите «ИСТИНА» в столбце D, чтобы получить желаемые результаты. См. ниже:

введите описание изображения здесь


TIL вы можете использовать оператор "&" вместо неуклюжей формулы CONCATENATE (). Благодарность!
bpcookson

3

Если вы хотите использовать формульный подход, тогда гораздо проще получить результаты в отдельных ячейках, поэтому давайте предположим, что ваша первая таблица - A2: B8, а цвета снова перечислены в D2: D5. Попробуйте эту формулу в 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))),"")

подтверждено CTRL+SHIFT+ENTERи скопировано поперек и вниз. Когда матчи заканчиваются, вы получаете пробелы.

Формула предполагает Excel 2007 или более поздней версии - если более ранняя версия, вы можете использовать COUNTIF вместо IFERROR, т.е.

=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

Вот решение VBA для вас. Во-первых, вот как выглядят результаты:

Скриншот

И вот код:

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.