Excel表格多值匹配查重的动态VBA函数实现问题
通用多值匹配查重VBA函数实现
改造思路
- 用
ParamArray关键字定义可变长度的参数数组,支持传入任意数量的匹配值,自动对应工作表从A列开始的对应列(第1个匹配值对应A列、第2个对应B列、第3个对应C列,以此类推) - 保留原有排除UI、Lists工作表的逻辑,完全兼容原有两值匹配的使用场景
- 找到第一个值的匹配行后逐行校验剩余列的数值,只要有一条全匹配记录就直接返回结果,优化执行效率
Function checkDuplicate(ws As Worksheet, ParamArray matchValues() As Variant) As Boolean Dim rng As Range Dim firstRow As Long Dim i As Long Dim allMatch As Boolean checkDuplicate = False ' 排除指定工作表 If ws.Name = "UI" Or ws.Name = "Lists" Then Exit Function ' 无匹配参数直接返回 If UBound(matchValues) < 0 Then Exit Function ' 第一个匹配值在A列查找 With ws.Range("A:A") Set rng = .Find(matchValues(0), LookIn:=xlValues, LookAt:=xlWhole) If Not rng Is Nothing Then firstRow = rng.Row Do allMatch = True ' 校验剩余所有匹配值对应的列 For i = 1 To UBound(matchValues) If ws.Cells(rng.Row, i + 1).Value <> matchValues(i) Then allMatch = False Exit For End If Next i ' 全匹配直接返回结果 If allMatch Then checkDuplicate = True Exit Function End If Set rng = .FindNext(rng) Loop While rng.Row <> firstRow End If End With End Function
使用示例
- 两值匹配(兼容原有调用逻辑):
checkDuplicate(Worksheets("目标表"), "值1", "值2") - 三值匹配:
checkDuplicate(Worksheets("目标表"), "值1", "值2", "值3") - 四值匹配:
checkDuplicate(Worksheets("目标表"), "值1", "值2", "值3", "值4")
注意事项
- 默认是全单元格精确匹配,如果需要模糊匹配可将
Find方法的LookAt参数改为xlPart - 如果需要自定义匹配列的位置,可新增一个列号数组入参,替换代码中
i+1的列号计算逻辑即可
内容的提问来源于stack exchange,提问作者HMWorks
相关产品推荐
相关产品推荐

