VBA代码修改需求:将单列查找改为相邻双列匹配查找
修改VBA代码实现双列并排匹配
原代码仅基于单列(B列匹配N列)进行查找,现在需要调整为同时匹配两组相邻列(B:C列与M:N列)——只有当某一行的B列值等于M列某行值,且同一行的C列值等于N列对应行值时,才算匹配成功,再执行后续赋值操作。
修改后的代码
Sub FindDoubleColumnMatch() Application.ScreenUpdating = False Dim i As Long, lRow As Long, lRow1 As Long Dim rgFound As Range, firstFoundAddr As String ' 获取B列和M列的最后行号(M/N为相邻列,取M列最后行即可) lRow = Cells(Rows.Count, "B").End(xlUp).Row lRow1 = Cells(Rows.Count, "M").End(xlUp).Row For i = 2 To lRow ' 先在M列查找当前行B列的值 Set rgFound = Range("M2:M" & lRow1).Find(Cells(i, "B"), LookIn:=xlValues, LookAt:=xlWhole) If Not rgFound Is Nothing Then firstFoundAddr = rgFound.Address ' 记录第一个匹配地址,避免循环查找 Do ' 检查同一行的N列值是否等于当前行C列值 If rgFound.Offset(, 1).Value = Cells(i, "C").Value Then ' 匹配成功,将对应值写入L列(保留原代码的偏移逻辑,取匹配行右侧第2列的值) Cells(i, "L") = rgFound.Offset(, 2).Value Exit Do ' 找到匹配项后退出循环 End If ' 继续查找下一个匹配的B列值 Set rgFound = Range("M2:M" & lRow1).FindNext(rgFound) Loop While rgFound.Address <> firstFoundAddr Else ' 未找到匹配的B列值时弹窗提示(可改为最后汇总提示,避免多次弹窗) MsgBox "第" & i & "行的B:C列未找到匹配项" End If Next i Application.ScreenUpdating = True End Sub
关键修改说明
- 双列匹配逻辑:先匹配B列与M列,找到候选行后再验证C列与N列的值,确保两组相邻列完全对应
- 防止无限循环:用
firstFoundAddr记录首个匹配地址,避免FindNext重复遍历同一区域 - 范围优化:将查找目标列从N列改为M列,对应新的匹配规则
- 行号统一:取M列最后行号替代原N列,保证M/N列的行范围一致
内容的提问来源于stack exchange,提问作者Mohsen R
相关产品推荐
相关产品推荐

