17

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

Я предполагаю, что это будет включать в себя методы возврата и обработки массивов, хотя я не имел дело с ними раньше. Некоторые Google начинают использовать 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

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

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

4 ответа4

12

Предполагая, что вы хотите использовать формульный подход, как указано (не используя 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 подход был бы лучшим решением, если у вас есть тонны строк.

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .