我在Excel '07中有两个名字列表。每个文件中有两列:名字和姓氏。我希望能够分辨出每个列表中的哪些名称(名称=第一个,最后一个)出现在另一个列表中。我不能想到的任何方法都不能一次占到一列以上 - 例如,我可以看到有多少“史密斯”,或者有多少“阿尔伯特”,但我不知道有多少“阿尔伯特史密斯的确有。
思想?
编辑:显然我可以连接,但我希望这种方法可以推广到两列以上的数据。
答案 0 :(得分:0)
最简单的方法是使用CONCATENATE为两个列表创建第三列,然后使用此新列执行vlookup。
答案 1 :(得分:0)
不幸的是,这是Excel中非常常见的任务,其标准答案如Joshua Smith所说 - 通过连接可用列来构建组合键。如果您担心冲突(例如,多列的直连接可能会使用相同的输出保留不同的值),例如以下内容,则使用分隔符(例如管道符|
)。
Col A Col B Col C Combined Key
aaa bbb ccc aaabbbccc
aa aa aaa aaaaaaa -- Bad match...
aaa a aaa aaaaaaa -- Bad match...
当然,您可以编写自定义宏函数来为您执行此操作。逻辑类似于VLOOKUP
:
Public Function VMatch(ByVal lookFor As Range, ByVal lookIn As Range) As String 'Make sure column count matches (at least!) If lookFor.Columns.Count lookIn.Columns.Count Then 'Oops... VMatch = "ERROR: Column counts do not match" Exit Function End If 'Start looking through the target range for 'a match with the source range Dim blnFound As Boolean Dim blnRowOK As Boolean blnFound = False Dim iCol As Integer Dim iRow As Long Dim numCols As Integer numCols = lookFor.Columns.Count 'Loop through all rows For iRow = 1 To lookIn.Rows.Count 'Assume current row might be ok... blnRowOK = True 'Loop through columns For iCol = 1 To numCols 'Test for mis-match only If lookFor.Cells(1, iCol).Value lookIn.Cells(iRow, iCol).Value Then blnRowOK = False Exit For End If Next 'If row is still ok, we've found a match! If blnRowOK Then blnFound = True Exit For End If Next 'If blnFound is true, we found a match If blnFound Then VMatch = "Match" Else VMatch = "No Match" End If End Function
注意:上面的函数有效并且不容易受到“误报”的影响 - 如果它碰到匹配,它也试图跳出来效率低下,但我无法保证它在所有情况下都能正常工作。
要使用该函数,您可以引用给定行上所有列的范围作为lookFor以及lookIn中所有可能匹配行的整个范围,例如: =VMatch(A1:C1,Sheet2!A1:C29)
如果您匹配的内容位于当前工作表单元格A1:C1
上,而其他数据集位于Sheet2
上,则从第一行向下延伸到第29行。
答案 2 :(得分:0)
更新:想出来! Sumproduct为我做了一切。这是一个公式:
=SUMPRODUCT(($G$8:$G$110=C28)*($F$8:$F$110=D28))
这假定引用名字存储在G中,姓氏存储在F中,并且我要查找的名称分别在C(First)和D(Last)中。匹配时输出为1,不匹配时输出为0。仅在相邻单元格匹配时才生成匹配。