在 Excel 中對具有相同查找值(主鍵)的多行資料執行 Vlookup

在 Excel 中對具有相同查找值(主鍵)的多行資料執行 Vlookup

我想對同一主鍵具有多行的名稱進行 Vlookup:

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

Vlookup 將只傳回記錄中的第一個名稱 (Tom Jones)。我希望它看起來像這樣:湯姆瓊斯、弗蘭克托馬斯、瑪麗史密斯都在同一條線上。

答案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], ""))

適用於此特定實例的ASimpleCat如下:

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以使其更加通用,因為擁有功能更齊全的通用串聯函數在任何人的工具箱中都是有用的。

解釋:

TRUE當計算為數組公式時,將整個表列與單一值進行比較將產生s 和s的數組FALSE。使用IFwill 建構一個新數組,從您在 的 value if true 一側使用的數組的正確位置提取值IF,並填充您在 的 value if false 一側使用的空字串IF。該SimpleCat函數將所有非空值放入這個新數組中,並在它們之間用逗號分隔。

答案2

兩個問題。首先,這不是主鍵;其次,Excel 中沒有內建功能可以提供您所需的結果。

主鍵應該是與單一記錄綁定的唯一標識符,並且永遠不會重複。這就是 Excel 中大多數查找函數的設計目的,這就是為什麼它們在找到匹配項時會停止的原因 - 如果已經找到匹配項,則不必每次都查找整個範圍,從而節省資源。

我認為進行您在這裡尋找的那種整合(將多個值拉入單一字串)的唯一方法是使用巨集或自訂函數。您到底需要什麼程式碼將取決於您所追求的確切結果,恐怕超出了這個答案的範圍。

答案3

我會採取這個功能...

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)

相關內容