Возврат всех совпадающих значений на основе одного значения поиска - PullRequest
0 голосов
/ 30 марта 2020

enter image description here

На рисунке показан набор данных, который у меня есть. ICTO_ID в столбце H повторяется несколько раз и содержит более одного продукта, например, ICTO-247 имеет Fx и eFX в качестве Product (столбец J). Теперь в Col E (product) мне нужно показать, что ICTO-247 имеет FX, eFX как Product. Поэтому ячейка E3 должна читать FX, eFX.

Теперь, если я сделаю vlookup, единственное возвращаемое значение будет FX, так как это первое совпадение, основанное на ICTO_ID. Мне нужен способ, чтобы иметь возможность вернуть оба значения. Это может быть в форме кода или формулы.

Любая помощь будет оценена.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Вы можете использовать Dictionary объект в функции VBA

Function GetIctoProducts(ictoID As String) As Variant
    Dim cel As Range

    GetIctoProducts = CVErr(xlErrNA)
    With CreateObject("Scripting.dictionary")
        For Each cel In Range("H2", Cells(Rows.Count, "H").End(xlUp))
            .Item(cel.Value) = .Item(cel.Value) & cel.Offset(, 2).Value & ", "
        Next

        If .Exists(ictoID) Then GetIctoProducts = Left(.Item(ictoID), Len(.Item(ictoID)) - 2)
    End With
End Function
0 голосов
/ 30 марта 2020

Решение non-vba для абонентов Office 365.

=TEXTJOIN(", ",,FILTER($J$2:$J$10,$H$2:$H$10=$C2))
0 голосов
/ 30 марта 2020

A Textual Lookup

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

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

=TLU(C2,H$2:H$5,1)

Существует дополнительная функциональность, например, столбцы могут быть где угодно (слева, справа, посередине), разделитель может быть изменен (4-й аргумент по умолчанию ",") и чувствительность к регистру (5-й аргумент). Играй с ним.

Option Explicit

Function TLU(SourceValue As Variant, SourceColumn As Range, _
  ValueColumnOffset As Long, Optional Separator As String = ", ", _
  Optional CaseInSensitive As Long = 1) As String

    Dim ValueColumn As Range  ' Value Column
    Dim vntS As Variant       ' Source Array
    Dim vntV As Variant       ' Value Array

    Dim colSource As Long     ' SourceColumn Column Number
    Dim colTC As Long         ' ThisCell Column Number
    Dim i As Long             ' Source and Value Array Counter
    Dim strS As String        ' Source String
    Dim strR As String        ' Resulting String

    ' Calculate SourceColumn Number.
    colSource = SourceColumn.Column

    ' Calculate Value Column and eliminate some impossible scenarios
    ' using error handling.
    On Error GoTo ProcedureExit
        Set ValueColumn = Cells(SourceColumn.Row, SourceColumn.Column) _
          .Offset(, ValueColumnOffset).Resize(SourceColumn.Rows.Count)
    On Error GoTo 0

    ' Calculate ThisCell Column Number
    colTC = Application.ThisCell.Column
    ' Check ThisCell Column Number against SourceColumn Number and
    ' Value Column Number.
    If colTC = colSource Or colTC = ValueColumn.Column Then Exit Function

    ' Write SourceValue to Source String and values of ranges to arrays.
    strS = CStr(SourceValue): vntS = SourceColumn: vntV = ValueColumn

    ' Loop through arrays and build Resulting String.
    For i = 1 To UBound(vntS)
        If StrComp(CStr(vntS(i, 1)), strS, CaseInSensitive) = 0 Then
            If strR <> "" Then
                strR = strR & Separator & vntV(i, 1)
            Else
                strR = vntV(i, 1) ' First value has no separator.
            End If
        End If
    Next

    TLU = strR

ProcedureExit:

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