比较Excel中的名称列表,计算重复的姓氏

时间:2010-03-24 20:56:25

标签: excel duplicates

我在Excel '07中有两个名字列表。每个文件中有两列:名字和姓氏。我希望能够分辨出每个列表中的哪些名称(名称=第一个,最后一个)出现在另一个列表中。我不能想到的任何方法都不能一次占到一列以上 - 例如,我可以看到有多少“史密斯”,或者有多少“阿尔伯特”,但我不知道有多少“阿尔伯特史密斯的确有。

思想?

编辑:显然我可以连接,但我希望这种方法可以推广到两列以上的数据。

3 个答案:

答案 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。仅在相邻单元格匹配时才生成匹配。