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

Excel中有两个名字列表。 每个文件中有两列:名字和姓氏。 我希望能够知道每个列表中的名称(name = first,last)出现在另一个列表中。 我所能想到的方法,一次也不能超过一列,例如,我可以看到有多less“史密斯”,还有多less“艾伯特”,但我不知道有多less“阿尔伯特·史密斯的有。

思考?

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

最简单的方法是使用CONCATENATE为两个列表创build第三列,然后使用这个新列执行vlookup。

不幸的是,在Excel中这是一个相当普遍的任务,正如Joshua Smith所说的那样,标准答案是通过连接可用列来构build组合键。 如果您担心碰撞(例如,多列的直接连接可能会在同一输出中留下不同的值),请使用分隔符(例如pipe道字符| )。

 Col A Col B Col C Combined Key aaa bbb ccc aaabbbccc aa aa aaa aaaaaaa -- Bad match... aaa a aaa aaaaaaa -- Bad match... 

当然,你可以写一个自定义的macros函数为你做这个。 逻辑就像VLOOKUP

公共职能VMatch(ByVal lookFor作为范围,ByVal lookIn作为范围)作为string
     “确保列数匹配(至less!)
    如果lookFor.Columns.Count是lookIn.Columns.Count那么
         “糟糕!
         VMatch =“错误:列数不匹配”
        退出function
    万一
     “开始寻找目标范围
     “与来源范围的匹配
     Dim blnFound As Boolean
    昏暗blnRowOK作为布尔值
     blnFound = False
    昏暗的iCol作为整数
    昏暗的iRow只要
     Dim numCols As Integer
     numCols = lookFor.Columns.Count
     '遍历所有行
    对于iRow = 1要lookIn.Rows.Count
         '假设目前的行可能是好的...
         blnRowOK =真
         '循环通过列
        对于iCol = 1到numCols
             '只testing不匹配
            如果lookFor.Cells(1,iCol).Value lookIn.Cells(iRow,iCol).Value Then
                 blnRowOK =假
                退出
            万一
        下一个
         '如果排还行,我们find了一个匹配!
        如果blnRowOK那么
             blnFound = True
            退出
        万一
    下一个
     “如果blnFound是真的,我们find了一个匹配
    如果blnFound那么
         VMatch =“匹配”
    其他
         VMatch =“不匹配”
    万一
结束function

注意:上面的function是可行的,并且不容易出现“误报” – 如果碰到一个匹配,它也会跳出来低效率,但是我不能保证它在任何情况下都能正常工作。

要使用这个函数,你可以引用给定行上所有列的范围作为lookFor和lookIn中所有可能的匹配行的整个范围,例如=VMatch(A1:C1,Sheet2!A1:C29)您匹配的是当前工作表单元格A1:C1 ,另一个数据集在Sheet2 ,从第一行到第29行。

更新:想通了! sumproduct做所有这些为我工作。 这是一个公式:

 =SUMPRODUCT(($G$8:$G$110=C28)*($F$8:$F$110=D28)) 

这假定参考名字存储在G中,姓氏在F中,并且我要查找的名字分别是C(First)和D(Last)。 输出为1表示匹配,0表示不匹配。 只有当相邻的单元匹配时才产生匹配。