Excel vlookup с несколькими результатами - PullRequest
13 голосов
/ 20 июля 2011

Я пытаюсь использовать vlookup или аналогичную функцию для поиска на листе, сопоставления номеров счетов и возврата указанного значения.Моя проблема в том, что есть дубликаты номеров счетов, и я хотел бы, чтобы результат объединял результаты в одну строку.

Acct No   CropType
-------   ---------
0001      Grain
0001      OilSeed
0001      Hay
0002      Grain  

Находится на первом листе, на 2-м листе у меня есть номер действия с другой информацией иМне нужно получить все соответствующие результаты в одном столбце на 2-м листе, т.е."Зерновое сено"

Ответы [ 5 ]

8 голосов
/ 20 июля 2011

Вот функция, которая сделает это за вас.Он немного отличается от Vlookup тем, что вы дадите ему только столбец поиска, а не весь диапазон, а в качестве третьего параметра вы укажете, сколько столбцов нужно перейти влево (отрицательные числа) или вправо (положительные), чтобы получитьваше возвращаемое значение.

Я также добавил опцию использования разделителя, в вашем случае вы будете использовать "".Вот вызов функции для вас, предполагая, что первая строка с номером действия - это A, а результат - строка B:

=vlookupall("0001", A:A, 1, " ")

Вот функция:

Function VLookupAll(ByVal lookup_value As String, _
                    ByVal lookup_column As range, _
                    ByVal return_value_column As Long, _
                    Optional seperator As String = ", ") As String

Dim i As Long
Dim result As String

For i = 1 To lookup_column.Rows.count
    If Len(lookup_column(i, 1).text) <> 0 Then
        If lookup_column(i, 1).text = lookup_value Then
            result = result & (lookup_column(i).offset(0, return_value_column).text & seperator)
        End If
    End If
Next

If Len(result) <> 0 Then
    result = Left(result, Len(result) - Len(seperator))
End If

VLookupAll = result

End Function

Примечания:

  • Я сделал "," разделитель по умолчанию для результатов, если вы не введете его.
  • Если есть один или несколько попаданий, в конце я добавил некоторую проверку, чтобы сделатьуверен, что строка не заканчивается дополнительным разделителем.
  • Я использовал A: A в качестве диапазона, поскольку я не знаю ваш диапазон, но, очевидно, он быстрее, если вы введете фактический диапазон.
2 голосов
/ 20 июля 2011

Один из способов сделать это - использовать формулу массива, чтобы заполнить все совпадения в скрытый столбец, а затем объединить эти значения в строку для отображения:

=IFERROR(INDEX(cropTypeValues,SMALL(IF(accLookup=accNumValues,ROW(accNumValues)-MIN(ROW(accNumValues))+1,""),ROW(A1))),"")
  • cropTypeValues ​​: Именованный диапазон, содержащий список типов ваших культур.
  • accLookup : Именованный диапазон, содержащий номер счета для поиска.
  • accNumValues ​​: Именованный диапазон, содержащий список вашей учетной записи число.

Введите в виде формулы массива (Ctrl + Shift + Enter), а затем скопируйте, насколько это необходимо.

Дайте мне знать, если вам нужна какая-либо часть объяснения формулы.

0 голосов
/ 05 февраля 2016

Вот мой код, который даже лучше, чем Excel vlookup, потому что вы можете выбрать критерий Colum, и, конечно, разделитель (возврат Carriege тоже) ...

Function Lookup_concat(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String
    Dim i, y As Integer
    Dim result As String

    If separator = "CRLF" Then
        separator = Chr(10)
    End If

    y = tableau.Rows.Count
    result = ""
    For i = 1 To y
        If (tableau.Cells(i, colSRC) = source) Then
            If result = "" Then
                result = tableau.Cells(i, colDST)
            Else
                result = result & separator & tableau.Cells(i, colDST)
            End If
        End If
    Next
    Lookup_concat = result
End Function

И подарок, вы можететакже выполнить поиск по нескольким элементам одной и той же ячейки (на основе одного и того же разделителя).Действительно полезный

Function Concat_Lookup(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String
    Dim i, y As Integer
    Dim result As String

    Dim Splitted As Variant

    If separator = "CRLF" Then
        separator = Chr(10)
    End If

    Splitted = split(source, separator)

    y = tableau.Rows.Count
    result = ""
    For i = 1 To y
        For Each word In Splitted
            If (tableau.Cells(i, colSRC) = word) Then
                If result = "" Then
                    result = tableau.Cells(i, colDST)
                Else
                    Dim Splitted1 As Variant
                    Splitted1 = split(result, separator)
                    If IsInArray(tableau.Cells(i, colDST), Splitted1) = False Then
                        result = result & separator & tableau.Cells(i, colDST)
                    End If
                End If
            End If
        Next
    Next
    Concat_Lookup = result
End Function

Предыдущий саб нуждается в этой функции

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
0 голосов
/ 26 августа 2013
Function VLookupAll(vValue, rngAll As Range, iCol As Integer, Optional sSep As String = ", ")
    Dim rCell As Range
    Dim rng As Range
    On Error GoTo ErrHandler
    Set rng = Intersect(rngAll, rngAll.Columns(1))
    For Each rCell In rng
        If rCell.Value = vValue Then
            VLookupAll = VLookupAll & sSep & rCell.Offset(0, iCol - 1).Value
        End If
    Next rCell
    If VLookupAll = "" Then
        VLookupAll = CVErr(xlErrNA)
    Else
        VLookupAll = Right(VLookupAll, Len(VLookupAll) - Len(sSep))
    End If
ErrHandler:
    If Err.Number <> 0 Then VLookupAll = CVErr(xlErrValue)
End Function

Используйте вот так:

=VLookupAll(K1, A1:C25, 3)

для поиска всех вхождений значения K1 в диапазоне A1: A25 и для возврата соответствующих значений из столбца C, разделенных запятыми.

Если вы хотите суммировать значения, вы можете использовать SUMIF, например

=SUMIF(A1:A25, K1, C1:C25)

для суммирования значений в C1: C25, где соответствующие значения в столбце A равны значению K1.

ALL D BEST.

0 голосов
/ 17 ноября 2011

У меня только что была похожая проблема, и я долго искал похожие решения, хотя, на самом деле, меня ничто не убедило. Либо вам нужно было написать макрос, либо какую-то специальную функцию, хотя для моих нужд самое простое решение - это использовать сводную таблицу, например, например. Excel.

Если вы создадите новую сводную таблицу из ваших данных и сначала добавите «Acct No» в качестве метки строки, а затем добавите «CropType» в качестве RowLabel, у вас будет очень хорошая группировка, в которой перечислены для каждой учетной записи все типы культур. Это не будет сделано в одной клетке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...