VLOOKUP动态列索引异常:跨表查找全部返回18的问题排查
VLOOKUP跨表查找全部返回同一值的问题修复
问题根源
- 重复覆盖单元格:内层
J循环每次都给sh1.Cells(2, I)赋值,最终仅保留最后一次循环的结果,导致所有目标单元格返回同一个值。 - 未限定工作表的Range:
Range("I2")未指定所属工作表,默认引用活动表,可能导致查找值错误。 - 目标区域不匹配:代码操作的是Sheet1第2行的列,和你需要的W27至W44(第27-44行、W列)完全不符。
修复代码
Sub VLookup_Fixed() Dim rowNum As Integer Dim matchCol As Integer Dim sh1 As Worksheet, sh2 As Worksheet Set sh1 = ThisWorkbook.Worksheets("Sheet1") Set sh2 = ThisWorkbook.Worksheets("Sheet2") ' 遍历Sheet1的W27到W44(第27至44行,W列对应第23列) For rowNum = 27 To 44 ' 获取当前行I列的查找值 Dim lookupVal As Variant lookupVal = sh1.Cells(rowNum, 9).Value ' I列是第9列 ' 匹配Sheet2表头对应的列号 matchCol = Application.Match(sh1.Cells(1, 23).Value, sh2.Range("I1:AA1"), 0) ' 执行VLOOKUP并赋值到当前行W列 If Not IsError(matchCol) Then sh1.Cells(rowNum, 23).Value = Application.VLookup(lookupVal, sh2.Range("I:AA"), matchCol, 0) End If Next rowNum End Sub
关键调整点
- 明确工作表范围:所有单元格引用都绑定
sh1或sh2,避免活动表干扰。 - 匹配目标区域:直接遍历27-44行,对应你需要的W27至W44单元格。
- 简化逻辑:移除冗余的内层循环,根据需求直接匹配W列表头对应的Sheet2列。
- 错误防护:增加
IsError判断,防止表头匹配失败导致代码中断。
内容的提问来源于stack exchange,提问作者Adde
相关产品推荐
相关产品推荐

