不幸的是,这是 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:
公共函数 Vmatch(ByVal lookFor As Range, ByVal lookIn As Range) As String
'确保列数匹配(至少!)
If lookFor.Columns.Count lookIn.Columns.Count Then
'哎呀...
Vmatch = "错误:列数不匹配"
退出函数
万一
'开始在目标范围内寻找
'与源范围匹配
Dim blnFound 作为布尔值
Dim blnRowOK 作为布尔值
blnFound = 假
将 iCol 调暗为整数
将 iRow 变暗
将 numCols 调暗为整数
numCols = lookFor.Columns.Count
'遍历所有行
对于 iRow = 1 查看In.Rows.Count
'假设当前行可能没问题...
blnRowOK = 真
'遍历列
对于 iCol = 1 到 numCols
'只测试不匹配
If lookFor.Cells(1, iCol).Value lookIn.Cells(iRow, iCol).Value Then
blnRowOK = 假
退出
万一
下一个
'如果行仍然没问题,我们找到了匹配!
如果 blnRowOK 那么
blnFound = True
退出
万一
下一个
'如果 blnFound 为真,我们找到了一个匹配
如果 blnFound 则
Vmatch = "匹配"
别的
Vmatch = "不匹配"
万一
结束功能
注意:上面的函数有效并且不易受到“误报”的影响 - 它也会尝试在匹配时跳出以降低效率,但我不能保证它在所有情况下都有效。
要使用该函数,您可以将给定行上所有列的范围作为lookFor 引用,并在lookIn 中引用所有可能匹配行的整个范围,例如=VMatch(A1:C1,Sheet2!A1:C29) 如果您匹配的内容在当前工作表单元格 A1:C1 上,而其他数据集在 Sheet2 上,从第一行到第 29 行。