VBA技术问题:统计VLOOKUP/INDEX MATCH成功匹配数及复制后匹配计数
解决VLOOKUP/INDEX MATCH匹配次数统计及VBA执行后计数的问题
嘿,针对你提出的两个Excel匹配计数问题,我分两种场景给你详细说明解决方案:
1. 用工作表函数直接统计匹配成功次数
如果不需要VBA,只用单元格公式就能轻松搞定:
统计VLOOKUP成功匹配次数
假设你要查找A列的值在C:D区域的匹配情况,公式如下:=SUMPRODUCT(--NOT(ISERROR(VLOOKUP(A1:A10, C:D, 2, FALSE))))逻辑拆解:
ISERROR(VLOOKUP(...))判断匹配是否失败(失败返回TRUE,成功返回FALSE)NOT()将结果反转,把成功匹配转为TRUE--把布尔值转换成1(成功)或0(失败)SUMPRODUCT对所有1求和,得到总成功次数
统计INDEX MATCH成功匹配次数
其实可以直接用MATCH函数判断存在性,更高效:=SUMPRODUCT(--NOT(ISERROR(MATCH(A1:A10, C1:C10, 0))))这个公式直接统计A列中有多少个值能在C列找到完全匹配项,和INDEX MATCH的匹配逻辑完全一致——毕竟INDEX MATCH能成功的前提就是MATCH能定位到对应位置。
2. VBA执行INDEX MATCH复制后统计成功次数
你提供的参考代码是判断单元格等于5的计数逻辑,我们可以把它改成适配INDEX MATCH复制场景的版本,同时完成数据复制和计数:
场景假设
- 表1的匹配名称在
A1:A10,要把匹配到的数据放到表1的B列 - 表2的名称在
Sheet2!A1:A20,对应数据在Sheet2!B1:B20
方案1:用VBA的Find方法(更高效)
Sub CopyAndCountMatches() Dim ws1 As Worksheet, ws2 As Worksheet Dim matchCell As Range Dim countSuccess As Integer Dim cell As Range ' 替换成你的实际工作表名称 Set ws1 = ThisWorkbook.Sheets("表1") Set ws2 = ThisWorkbook.Sheets("表2") countSuccess = 0 ' 初始化计数器 ' 遍历表1需要匹配的单元格 For Each cell In ws1.Range("A1:A10") ' 精确查找表2中是否有对应名称 On Error Resume Next ' 暂时忽略匹配失败的报错 Set matchCell = ws2.Range("A1:A20").Find(What:=cell.Value, LookIn:=xlValues, LookAt:=xlWhole) On Error GoTo 0 ' 恢复错误捕获 If Not matchCell Is Nothing Then ' 找到匹配,复制对应数据到表1B列 ws1.Cells(cell.Row, "B").Value = ws2.Cells(matchCell.Row, "B").Value countSuccess = countSuccess + 1 ' 成功计数+1 Else ' 未匹配到则留空(可根据需求改成提示文本) ws1.Cells(cell.Row, "B").Value = "" End If Next cell ' 弹窗显示结果 MsgBox "共成功匹配并复制 " & countSuccess & " 条数据!" End Sub
方案2:模拟工作表的INDEX MATCH逻辑
如果你想完全贴合工作表里的INDEX MATCH写法,也可以这样写:
Sub IndexMatchAndCount() Dim ws1 As Worksheet, ws2 As Worksheet Dim countSuccess As Integer Dim cell As Range Dim matchResult As Variant Set ws1 = ThisWorkbook.Sheets("表1") Set ws2 = ThisWorkbook.Sheets("表2") countSuccess = 0 For Each cell In ws1.Range("A1:A10") ' 调用工作表的MATCH函数查找位置 matchResult = Application.Match(cell.Value, ws2.Range("A1:A20"), 0) If Not IsError(matchResult) Then ' 用INDEX获取对应数据并复制 ws1.Cells(cell.Row, "B").Value = Application.Index(ws2.Range("B1:B20"), matchResult) countSuccess = countSuccess + 1 Else ws1.Cells(cell.Row, "B").Value = "" End If Next cell MsgBox "成功匹配次数:" & countSuccess End Sub
内容的提问来源于stack exchange,提问作者Thompson Ho
相关产品推荐
相关产品推荐

