excel vlookup有多个结果

时间:2011-07-19 21:53:39

标签: excel excel-formula

我正在尝试使用vlookup或类似功能来搜索工作表,匹配帐号,然后返回指定的值。我的问题是有重复的帐号,我希望结果将结果连接成一个字符串。

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

在第一个工作表中,在第二个工作表上我有Acct No和其他信息,我需要将所有匹配结果放到第二个工作表上的一列中,即。 “谷物油籽干草”

5 个答案:

答案 0 :(得分:8)

这是一个可以为你做的功能。它与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作为范围,因为我不知道你的范围,但是 显然,如果输入实际范围,它会更快。

答案 1 :(得分:2)

执行此操作的一种方法是使用数组公式将所有匹配填充到隐藏列中,然后将这些值连接到字符串中以供显示:

=IFERROR(INDEX(cropTypeValues,SMALL(IF(accLookup=accNumValues,ROW(accNumValues)-MIN(ROW(accNumValues))+1,""),ROW(A1))),"")
  • cropTypeValues :包含裁剪类型列表的命名范围。
  • accLookup :包含要查找的帐号的命名范围。
  • accNumValues :包含您帐户列表的命名范围 号。

以数组公式输入(Ctrl + Shift + Enter),然后根据需要进行复制。

如果您需要解释公式的任何部分,请告诉我。

答案 2 :(得分:0)

我刚遇到类似的问题,我已经查了很长时间的类似解决方案了,但事实并没有让我信服。您必须编写一个宏或一些特殊功能,而对于我的需求,最简单的解决方案是在例如使用数据透视表。 Excel中。

如果您从数据创建一个新的数据透视表,并首先添加“Acct No”作为行标签,然后将“CropType”添加为RowLabel,您将有一个非常好的分组,为每个帐户列出所有裁剪类型。但它不会在单个单元格中这样做。

答案 3 :(得分:0)

这是我的代码甚至比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

答案 4 :(得分:-1)

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)

在A1:A25范围内查找K1值的所有出现值,并从C列返回相应的值,以逗号分隔。

如果要对值求和,可以使用SUMIF,例如

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

对C1:C25中的值求和,其中A列中的相应值等于K1的值。

ALL D BEST。