У меня есть лист Excel со списком имен в одном столбце и некоторые связанные значения в следующем столбце. Некоторые из этих имен появляются несколько раз с разными значениями в следующем столбце.

Например:

John  AA
James AE
Trent TE
Jim   CE
Trent AX
Jim   XC

Результат, который я хочу вернуть из моей функции vlookup:

John  AA
James AE
Trent TE AX
Jim   CE XC

Тем не менее, vlookup может вернуть только одно значение, есть ли другая функция, которая может помочь мне с этой проблемой?

2 ответа2

1

Я хотел бы предложить следующее решение, просто проверьте снимок экрана.

Диапазон исходных данных - A1:B7 (исключая заголовки).

Диапазон данных результата A11:B14.

Сначала создайте список уникальных имен, напишите эту формулу в ячейке A11.

{= ЕСЛИОШИБКА (ИНДЕКС ($ A $ 2:$ A $ 7, MATCH (0, СЧЕТЕСЛИ ($ A $ 11:А11, $ A $ 2:$ A $ 7), 0)), "")}

Для окончательных результатов напишите формулу в B11.

{= IFERROR(INDEX($ B $ 2:$ B $ 7, МАЛЕНЬКИЙ (ЕСЛИ ($ A11 = $ A $ 2:$ A $ 7, ROW ($ A $ 2:$ A $ 7)-ROW ($ A $ 2)+1), КОЛОННЫ (А1))), "")}

Перетащите ячейку «Формула-1» на «Запись», затем «Вниз», пока не потребуется.

Надеюсь, что это поможет вам, я разместил решение после того, как был проверен мной.

0

Nevermind нашел код, который работает очень хорошо.

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

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