VBA使用Index+Match匹配工作表数据无报错但结果为空如何解决
问题原因
- 代码中
On Error Resume Next语句屏蔽了所有匹配错误:当WorksheetFunction.Match无法在目标区域找到对应的值(匹配失败)时,会抛出运行时错误,该语句会直接跳过赋值操作,没有任何提示,最终导致单元格为空、也看不到报错。 - 匹配值格式/内容不一致:大概率是两个表的A列匹配键(例如编号、名称)格式不匹配(比如一个是数值型、一个是文本型数字),或者表头存在肉眼不可见的差异(比如前后空格、特殊字符),导致Match匹配失败。
- 边界计算风险:原代码中行数、列数计算未绑定工作表,若执行时活动工作表不是
input_4,会出现计算结果偏差,导致部分行/列未进入循环。
解决方法
- 先手动核对两个表的A列第一个匹配键、以及B-E列的表头,确认没有格式差异、多余空格。
- 替换错误处理逻辑,用
Application.Match替代WorksheetFunction.Match,后者匹配失败不会抛出VBA错误,只会返回错误值,方便判断匹配状态。 - 修正后的代码如下:
Sub Work_Click() Dim x As Integer, y As Integer Dim sourceRange As Range Dim lookRange As Range Dim Header_Range As Range Dim wsD As Worksheet, wsVO As Worksheet Dim matchRow As Variant, matchCol As Variant Set wsD = Sheets("Arkusz2") Set wsVO = Sheets("input_4") Set sourceRange = wsD.Range("A:E") Set lookRange = wsD.Range("A:A") Set Header_Range = wsD.Range("1:1") ' 绑定工作表计算边界,避免取到错误的行/列数 MyLastRow = wsVO.Cells(wsVO.Rows.Count, 1).End(xlUp).Row MyLastColumns = wsVO.Cells(1, wsVO.Columns.Count).End(xlToLeft).Column For x = 2 To MyLastRow For y = 2 To MyLastColumns ' 分别校验行、列匹配结果 matchRow = Application.Match(wsVO.Cells(x, 1).Value, lookRange, 0) matchCol = Application.Match(wsVO.Cells(1, y).Value, Header_Range, 0) ' 仅匹配成功时赋值,匹配失败的单元格标黄提示 If Not IsError(matchRow) And Not IsError(matchCol) Then wsVO.Cells(x, y).Value = sourceRange.Cells(matchRow, matchCol).Value Else wsVO.Cells(x, y).Interior.Color = RGB(255, 255, 0) End If Next y Next x MsgBox "Done." End Sub
运行修正后的代码后,标黄的单元格即为匹配失败的位置,核对这些位置的匹配键、表头和Arkusz2表的一致性,调整后重新运行即可完成填充。
内容的提问来源于stack exchange,提问作者Przemek Dabek
相关产品推荐
相关产品推荐

