VBA数据匹配问题:重复键被忽略且次月数据无法返回
VBA代码修复:日期范围匹配填充问题
原代码问题
- 重复Key对应的Sheet1单元格填充为空
- 无法返回2月份的数据
问题根源
- 日期范围判断逻辑缺陷:原代码仅判断
Sheet1日期 >= Sheet2开始日期 且 <= Sheet2结束日期,但当Sheet2中存在开始日期晚于结束日期的记录时(如ABC10的2月记录01.02.2023 - 01.01.2023),该条件永远不成立,导致2月数据无法匹配。 - 冗余的中间存储逻辑:原代码先将匹配结果存入Dictionary再填充,增加了复杂度;同时变量名
rows与Excel内置对象冲突,存在潜在风险。
修复后的代码
Sub UpdateData() Dim ws1 As Worksheet, ws2 As Worksheet Dim lr1 As Long, lr2 As Long, i As Long, j As Long Dim startDate As Date, endDate As Date, targetDate As Date Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") lr1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row lr2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row ' 清空旧数据,避免残留干扰 ws1.Range("C2:D" & lr1).ClearContents ' 遍历Sheet1每一行 For i = 2 To lr1 targetDate = CDate(ws1.Cells(i, "A").Value) ' 遍历Sheet2找匹配项 For j = 2 To lr2 ' 先匹配Key If ws2.Cells(j, "A").Value = ws1.Cells(i, "B").Value Then startDate = CDate(ws2.Cells(j, "B").Value) endDate = CDate(ws2.Cells(j, "C").Value) ' 兼容起止日期顺序颠倒的情况 If targetDate >= WorksheetFunction.Min(startDate, endDate) And _ targetDate <= WorksheetFunction.Max(startDate, endDate) Then ' 填充对应字段 ws1.Cells(i, "C").Value = ws2.Cells(j, "D").Value ws1.Cells(i, "D").Value = ws2.Cells(j, "E").Value ' 若需匹配到第一个结果就停止,取消下面注释 ' Exit For End If End If Next j Next i End Sub
关键改动说明
- 修正日期范围判断:使用
WorksheetFunction.Min/Max处理起止日期顺序颠倒的情况,确保无论Sheet2中日期顺序如何,都能正确识别目标日期是否在范围内。 - 简化逻辑:移除Dictionary中间存储,直接在遍历Sheet1时实时匹配填充,提升代码效率与可读性。
- 清理旧数据:填充前清空目标列,避免旧数据残留。
- 优化变量:调整变量名避免与内置对象冲突,明确变量类型提升代码稳定性。
测试验证
针对提供的测试数据:
- Sheet1中02.01.2023的ABC10行将匹配到Sheet2的
Mobile Apple(最后一个符合条件的记录) - 01.02.2023的ABC10行将匹配到
computer thinkpad,02.02.2023的ABC10行将匹配到chair ikea - DFR98的02.02.2023行将匹配到
cup ikea
内容的提问来源于stack exchange,提问作者Kannan Ravi
相关产品推荐
相关产品推荐

