Excel - Як vlookup повернути кілька значень?


18

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

Я припускаю, що це буде включати методи повернення масивів та обробку, хоча я цим раніше не займався. Деякий Googling починає спиратися на if ([lookuparray] = [value], рядок [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, але все-таки формулу), ось як я виклав дані:

Макет даних

Потім я використовував таку формулу в комірці С12:

=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 / макро був би кращим рішенням, якщо у вас є тони рядків.


Для тих, хто шукає отримані суми значень (де порядок не має значення), простіше використовувати 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. Поміняйте стовпчики так, щоб кольори були у стовпці А, а назви були у стовпці В, а потім сортуйте їх за кольором.

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

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

  4. Фільтруйте "TRUE" у стовпці 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.