在Excel中执行Vlookup以查找具有相同查找值的多行数据(主键)


1

我想对同一主键有多行的名称进行Vlookup:

Deal ID (Primary Key) | Name
437                   | Tom Jones
437                   | Frank Thomas
437                   | Mary Smith

Vlookup只返回记录中的第一个名字(Tom Jones)。我希望它看起来像这样:汤姆琼斯,弗兰克托马斯,玛丽史密斯都在同一行。

Answers:


1

看起来你正在尝试使用Excel作为关系数据库,它并不是那么出色。最重要的是,除非近年来发生了变化(我没有乐于在Excel 2010之后使用任何东西),否则没有工作表函数可以将范围或数组转换为分隔字符串。你必须提出一个VBA工作表函数来做到这一点。

您可以使用数组公式和VBA的组合来执行您想要的操作。在你走得更远之前,如果你发现自己定期做这样的事情,我强烈建议你使用真正的数据库程序。我过去曾经滥用Excel来做简单的类似关系数据库的任务,但只是简单的。如果我不得不做更复杂的事情,那将是非常痛苦的。

假设您要搜索的ID在单元格中F1并且您的表格被调用Table1,则输入以下内容作为数组公式(使用control-shift-enter,而不是enter)。SimpleCat是你的VBA连接工作表函数。

=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))

SimpleCat,会为这个特定实例的工作如下:

Function SimpleCat(Args() As Variant) As Variant
    Dim a As Variant
    SimpleCat = ""
    For Each a In Args
        If a <> "" Then SimpleCat = SimpleCat & a & ", "
    Next
    If Len(SimpleCat) > 0 Then SimpleCat = Left$(SimpleCat, Len(SimpleCat) - 2)
End Function

我把它作为练习让你扩展SimpleCat以使其更通用,因为拥有更全功能的通用连接功能在任何人的工具箱中都很有用。

说明:

当评估为数组公式时,将整个表列与单个值进行比较将生成TRUEs和FALSEs 的数组。使用一个IF将构造一个新数组,从你正在使用的数组的正确位置拉取值,如果是真的那边IF,并填写你正在使用的空字符串,如果是假的一面IF。该SimpleCat函数将所有非空值放在这个新数组中,并在它们之间使用逗号。


0

两个问题。首先,那不是主键; 第二,Excel中没有内置功能,可以为您提供所需的结果。

主键应该是绑定到单个记录的唯一标识符,并且永远不会重复。这就是Excel中大多数Lookup函数都可以使用的原因,这就是为什么它们在找到匹配时停止的原因 - 如果已经找到匹配项,它每次都不需要查看整个范围。

我可以看到在这里进行那种整合的唯一方法,将多个值拉入单个字符串,就是使用宏或自定义函数。你需要的代码到底取决于你所追求的确切结果,我担心这个答案超出了这个答案的范围。


0

我会采取这个功能......

Function ConcatRange(inputRange As Range, Optional delimiter As String) As String
    Dim oneCell As Range
    Dim usedRange As Range

    Set usedRange = Application.Intersect(inputRange.Parent.usedRange, inputRange.Cells)
    If Not (usedRange Is Nothing) Then
        For Each oneCell In usedRange
            If oneCell.Text <> vbNullString Then
                ConcatRange = ConcatRange & delimiter & Trim(oneCell.Text)
            End If
        Next oneCell
        ConcatRange = Mid(ConcatRange, Len(delimiter) + 1)
    End If
End Function

并修改它以创建一个类似于的新函数:

Function ConcatIf(KeyRange as Range, KeyValue as Variant, DataColumnOffset As Integer)

它将在KeyRange中循环遍历每个单元格,并且只有当其值等于KeyValue时,才会连接其中的值 oneCell.Offset(0, DataColumnOffset)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.