比较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表示不匹配。 只有当相邻的单元匹配时才产生匹配。